怎样在 SIMATIC (TIA 博途) 中通过 SCL 实现边沿检测

合集下载

西门子TIA博途软件SCL语言编程应用案例

西门子TIA博途软件SCL语言编程应用案例

西门子 TIA博途软件 SCL语言编程应用案例SCL:Structured Contorl Language,结构化控制语言。

在西门子TIA博途软件中,默认支持SCL语言,在建立程序块时可以直接选择SCL语言。

本例利用SCL语言编程来实现机器人自动上下料过程中的自动寻料判断。

上图分别显示毛坯区和成品区料位实际状态,蓝色和绿色代表料位有料,灰色代表料位无料。

机器人自动选择抓取毛坯区2号料,放置在成品区7号空料位。

机器人自动寻料要求实现功能如下:上料时从毛坯区自动选择有料的最小料位号的毛坯,放料时自动选择无料的最小成品料区放料。

毛坯无料的位和成品区的有料位自动跳过,直至全部毛坯取完,或者全部成品区放满料。

如果使用梯形图来写的话,此程序会很繁琐,由此我们引出西门子博途的SCL语言编程,将会比较容易实现,步骤如下:1、建立数据块30LW:表示料仓30个料位传感器状态,本例只使用1-17号。

其中1-6为毛坯料区,7-12为成品料区。

2、完成料位传感器和机器人料位号数据处理ID8是外部30个料位传感信号输入,将外部30个料位信号传给30LW数据将毛坯区和成品区料位信息传送给机器人1.在程序段插入SCL程序段1.打开基本指令中的程序控制指令,选择所需要的指令编程4、编程方法一:该方法使用IF条件执行指令XZ1是发给机器人取料料位信号,XZ1为发给机器人放料料位信号此段程序处理毛坯区料位判断。

当1号料位有料时,毛坯区料位号为1,如果无料则执行下一条(即2号料位判断)。

如果1-6号都无料,则毛坯区料位号为0此段程序处理成品区料位判断。

当7号料位无料时,则成品区料位号为7,如果该料位有料则执行下一条(即8号料位判断)。

如果7-12号都有料,则成品区料位号为0这种方法通俗易懂,但程序会随着料位的增加而增加,料位越多,程序就会越长。

方法二:该方法程序使用FOR:在计数循环中执行指令,配合IF条件执行指令。

通过PLC循环扫描方式让7减(1至6),得出料位传感器从(6至1)循环执行,料位传感器(6至1)任意一位为1则把7减(1至6)值给到毛坯区。

在西门子PLC中使用SCL语言实现CRC校验计算

在西门子PLC中使用SCL语言实现CRC校验计算

在西门子PLC中使用SCL语言实现CRC校验计算在西门子PLC中运用传统梯形图方式和查表法实现Modbus通讯和CRC校验,会影响控制的稳定和对采集设备的数量和数据量有所限制,无法做到高效、稳定。

采用SCL语言编程很好解决了原有的问题,并使控制器效率大大提高。

标签:西门子PLC;SCL语言;Modbus;CRC校验1、引言当前几乎所有的PLC控制器都带有Modbus总线通信接口,这其中也包括西门子的S7300和S7400系列[1],西门子PLC的CPU模块自身不带有Modbus 通信口,需配置相应的RS485通讯模块(CP340/CP341/CP440/CP441),再配置相应的Modbus通讯协议硬件狗,就是说你要用西门子PLC做Modbus通讯时,你需要增加RS485通讯模块和Modbus通讯协议硬件狗费用。

根据西门子公开报价,Modbus通讯协议硬件狗的价格要14000.00元。

而且用传统的梯形图编程方法实现CRC校验,會导致CPU处理量迅速增加,严重占用了CPU的资源,导致CPU死机,影响系统的稳定性。

为解决以上问题,我们以前采用查表法解决CRC校验问题,但用查表发存在很大的局限性,比如:只能有固定的设备地址、固定的数据长度和固定的数据寄存器地址;当需通讯的设备有几十台或上百台后,查表法就会显的效率很低、程序累赘繁琐,影响系统稳定。

使用SCL语言编程方式(除西门子编程软件外需另外安装的一种编程方式,这是一种类似于C语言的一种编程方式),就很好的解决了以上问题。

2、Modbus通讯和CRC校验的相关介绍2.1 Modbus通讯协议Modbus通讯协议[2]在一根通讯线上采用主从应答方式的通讯连接方式。

首先主机寻址到唯一设备地址的终端(从机),随后从机发出相应信号以反向的方式传输给主机。

Modbus通讯只允许主机和从机之间通讯,不允许从机之间通讯,这样就保证了从机在初始化时占有数据链路,而仅限于相应到达本从机的查询信号。

PLC地址上升沿检测指令 - 西门子plc

PLC地址上升沿检测指令 - 西门子plc

PLC地址上升沿检测指令 - 西门子plc 1.指令符号
表1 为地址上升沿检测指令说明表。

表1 地址上升沿检测指令说明表
参数数据类型存储器区域说明地址1 BOOL I、Q、M、L、D 地址1是被检测上升沿变化的信号地址2 ( M_BIT) BOOL Q、M、D 地址2是用来指定“沿变化”的存储器位,该位保存的是上一次POS的信号状态。

如果这一地址没有被输入模板使用,对M_BIT位只使用 I的输入镜像区 Q BOOL I、Q、M、L、D 单脉冲输出 2.指令功能说明 POS(地址上升沿检测)指令是将地址1的信号状态与存储在地址2中的上次扫描的信号状态进行比较。

如果当前的信号状态是“1”,上一次的信号状态是“0”(检测到上升沿),则在这一指令后的RLO将置成“1”。

表2 为POS地址上升沿检测指令对状态位的影响。

表2 POS地址上升沿检测指令对状态位的影响
- BRCC1CC0OVOSORSTARLO/FC写状态位-----x 1 x1 3.指令应用举例(见图2)如图2所示,在下面的条件都满足的情况下,输出Q4.0的信号状态为“1”: 1)输入I0.0、I0.1、和I0.2的信号状态都是“1”; 2)输入I0.3上有“上升沿”信号检测到; 3)输入I0.4上的信号状态为“1”。

图2 POS指令应用举例
1。

在西门子PLC中使用SCL语言编程的技巧

在西门子PLC中使用SCL语言编程的技巧

在西门子PLC中使用SCL语言编程的技巧前言:两年半前我就在工控网上发表了有关SCL编程的知识<<在S7300400型PLC中使用高级语言编程>>,但发表完后,即使我自己都从没有把任何使用SCL编写的程序用到实际控制中,当时的感觉是使用SCL编程到处受限,没有STL语言灵活和强大。

直到最近使用施耐德的Unity软件编程,并使用这种已经国际标准化的文本语言(等同于西门子的SCL 语言),才体会到它的优点:<1>、程序容易阅读,便于诊断和维护;<2>、程序容易在不同厂家之间的PLC之间转换。

西门子的STL语言是强大,但难于阅读,编写程序也需要异常小心,其最强大的可能是它的寄存器寻址(类似于一些计算机高级语言中的地址指针),SCL没有这个功能,那就多费一些程序代码来实现同样的功能,程序是否优秀更应该看重程序的架构和提高程序生产效率的标准化,好的PLC程序不应该只有自己明白,而是让更多的人明白。

在西门子PLC中使用SCL语言的场合一般是编写标准功能块FB,其编程方式和西门子的其他编程语言,如梯形图Lad、语句表STL是完全不同的,同时为了实现程序的国际标准化,即为了方便的将程序代码移植到不同厂家的PLC系统上,尽量不要在SCL 中使用西门子独有的功能块。

1、在FB块中使用结构编写FB块的准则,就是其使用的内部变量尽量与外部隔离,除了像PLC的新启动/重启动标志,以及一些方波/脉冲波等全局变量可以在FB块中使用外,其他的任何全局变量都不应该在FB内部使用,即使是自定义结构也应该在FB中单独定义,在FB块中使用结构应该在静态类型变量中定义,如下:VAR // Static Variables IM:STRUCT //Data structure of Internal FlagsH1_AFCountImp:BOOL:=False; // Aux Flag Counter Impulse H1_CountImp:BOOL:=False; // Counter Impulse H1_ELCountMV:BOOL:=False; // Endless Counter Maximum Value END_STRUCT; //other data structure … END_VAR 在使用这些结构时,可以按照如下方式:IM. H1_CountImp:=Imp;2、在SCL中替代Set/Reset指令的方法SCL中不存在Set/Reset指令,或者说也没有必要使用。

博图软件通过SCL使用的上升沿和下降沿

博图软件通过SCL使用的上升沿和下降沿

本文介绍2种方法在SCL中应用上升沿和下降沿,一种是SCL中本身自带的,还有一种是通许写程序。

1:本示例是用的西门子1200PLC,如上图添加一个1200硬件。

2:接着创建一个FC块,创建输入输出变量,rasing edge1和OUT1是用于SCL自带上升沿触发的输入输出变量。

Falling edge1和OUT3是用于SCL自带下降升沿触发的输入输出变量。

rasing edge2和OUT2是用于自己写程序生成上升沿触发的输入输出变量Falling edge2和OUT4是用于自己写程序生成下降沿触发的输入输出变量3:将刚才的FC放置到OB1中,输入输出接口填上变量。

4:如上图所示:程序的第1 -2行是SCL自带的上升沿指令,添加好,在输入和输出区域分别添加我们刚才创建的输入输出变量,当rasing edge1由0变成1的时候,OUT1产生一个脉冲。

程序的第4 -5行是SCL自带的下升沿指令,添加好,在输入和输出区域分别添加我们刚才创建的输入输出变量,当rasing edge2由1变成0的时候,OUT1产生一个脉冲。

程序的第7-10行是自己编写程序生成上升沿,当rasing edge2由0变成1的时候,OUT3产生一个脉冲,下面我们来分析具体产生过程。

①当tag13初始装态为0时,NOT tage13为1:执行第一个扫描周期的时候rasing edge2为TURE,NOTtag13为1,满足条件执行下面的程序,OUT3=1,tag13= rasing edge2=1.执行第二个扫描周期的时候rasing edge2为TURE,NOTtag13为0(第一个周期已经改变其值了),不满足条件不能执行下面的程序,OUT3=0,tag13= rasing edge2=1 。

②当tag13初始装态为1时,NOT tage13为0:执行第一个扫描周期的时候rasing edge2为TURE,NOTtag13为0,不满足条件不能执行下面的程序,OUT3=0,tag13= rasing edge2=1.执行第二个扫描周期的时候rasing edge2为TURE,NOTtag13为1(第一个周期已经改变其值了),满足条件执行下面的程序,OUT3=1,tag13= rasing edge2=1。

博途scl指针用法

博途scl指针用法

博途scl指针用法
博途SCL(Scalable Coherent Interface)是一种高性能、可扩展的系统总线标准,常用于多处理器系统中。

SCL指针是在博途SCL系统中使用的一种特殊指针,用于指向SCL系统中的内存和外设资源。

SCL指针的用法如下:
1. 声明SCL指针变量:在C或C++代码中,可以使用关键字scl_ptr声明SCL指针变量。

例如:
```c
scl_ptr<int> ptr;
```
2. 分配SCL指针内存:使用allocate函数为SCL指针分配内存。

例如:
```c
ptr.allocate(10);
```
3. 访问SCL指针内容:可以使用普通指针的方式通过SCL指针访问内存中的数据。

例如:
```c
*ptr = 42; // 将值42存储到SCL指针所指向的内存单元中
```
4. 释放SCL指针内存:使用deallocate函数释放SCL指针占用的内存。

例如:
```c
ptr.deallocate();
```
需要注意的是,SCL指针主要用于访问博途SCL系统中的共享内存和外设资源,因此在使用SCL指针时需要遵守SCL系统的使用规范,确保数据的一致性和正确性。

在 STEP 7 (TIA 博途) 中,如何在 SCL 程序中实现间接寻址

在 STEP 7 (TIA 博途) 中,如何在 SCL 程序中实现间接寻址

在STEP 7 (TIA 博途) 中,如何在SCL 程序中实现间接寻址?S7-300/400 控制器使用SCL 有两种方法可以进行间接寻址。

•变量的间接寻址•DB 块的间接寻址变量的间接寻址类似于绝对寻址。

只是在括号内定义一个偏移量来替换掉地址值。

对于数据块的间接寻址,可以使用转换函数"WORD_TO_BLOCK_DB" 进行转换。

下图中的例子,描述了在S7-300/400 中如何使用间接寻址来访问DB 块中的数据。

图. 01如果希望通过间接寻址访问S7-300/400 的M,I 区和Q 区,需要使用指令%MX(), %MB(), %MW(), %EX(), %EB(), %EW(), %AX(), %AB()和%AW()。

在访问区域前面必须添加百分号。

如下图2 所示。

图. 02SIMATIC S7-1200/1500 控制器可使用表01 中指令来实现间接寻址。

指令描述POKE 写存储器地址POKE_BOOL 写存储器位PEEK 读存储器地址PEEK_BOOL 读存储器位POKE_BLK 写存储区表01可通过如图3 所示,使用PEEK 和POKE 指令来访问数据块中的数据。

图. 03注意PEEK 和POKE 指令无法在S7-300/400 中使用。

更多关于间接寻址及指令使用的相关信息,请参阅STEP 7 (TIA 博途) 在线帮助。

图. 04 是如何在S7-1200/S7-1500中使用"POKE_BLK" 指令实现间接寻址的例子。

源DB(标签名"DB_Number_SRC") 的数据被拷贝到目的DB (标签名"DB_Number_DES") 中。

Fig. 04表01 所列相关指令详细信息请参阅STEP 7 (TIA 博途) 在线帮助。

创建环境该FAQ 相关截图由STEP 7 (TIA 博途) V13 创建。

Siemens_SCL语句详解

Siemens_SCL语句详解

Siemens_SCL语句详解结构化文本ST编程,西门子PLC编程语言中叫SCL ,其它任何PLC控制器编程语言还是叫结构化编程ST。

西门子SCL语言第一章IF:条件执行IF 分支IF <条件> THEN <指令>END_IF;如果满足该条件,则将执行THEN 后编写的指令。

如果不满足该条件,则程序将从END_IF 后的下一条指令开始继续执行。

IF 和ELSE 分支IF <条件> THEN <指令1>ELSE <指令0>;END_IF;如果满足该条件,则将执行THEN 后编写的指令。

如果不满足该条件,则将执行ELSE 后编写的指令。

程序将从END_IF 后的下一条指令开始继续执行。

IF、ELSIF 和ELSE 分支IF <条件1> THEN <指令1>ELSIF <条件2> THEN <指令2>ELSE <指令0>;END_IF;如果满足第一个条件(<条件1>),则将执行THEN 后的指令(<指令1>)。

执行这些指令后,程序将从END_IF 后继续执行。

如果不满足第一个条件,则将检查第二个条件(<条件2>)。

如果满足第二个条件(<条件2>),则将执行THEN 后的指令(<指令2>)。

执行这些指令后,程序将从END_IF 后继续执行。

如果不满足任何条件,则先执行ELSE 后的指令(<指令0>),再执行END_IF 后的程序部分。

在IF 指令内可以嵌套任意多个ELSIF 和THEN 组合。

可以选择对ELSE 分支进行编程。

IF "Tag_1" = 1THEN "Tag_Value" := 10;ELSIF "Tag_2" = 1THEN "Tag_Value" := 20;ELSIF "Tag_3" = 1THEN "Tag_Value" := 30;ELSE "Tag_Value" := 0;END_IF;IF 案例如下:FUNCTION_BLOCK "IF"TITLE = 'IF Statement'//IF ... THEN ... ELSE ... END_IFVAR_INPUTStart : BOOL;Manual : BOOL;ActVal : INT;END_VARVARManual_FM : BOOL;over : BOOL;under : BOOL;equal_to : BOOL;Setpoint_man : INT := 1000;Setpoint : INT;Deviation : INT;y_index : INT := 12;Total : INT;END_VARVAR_TEMP i : INT; END_VARBEGIN//Simple IF branchIF Start THEN Setpoint := 1200; END_IF; IF Manual THEN Setpoint := Setpoint_man;Q4.0 := TRUE;END_IF;//Branch with THEN...ELSEIF ActVal > SetpointTHEN Deviation := ActVal - Setpoint;ELSE Deviation := Setpoint - ActVal; END_IF;//Branch with ELSIFIF ActVal > SetpointTHEN over := TRUE;under := FALSE;equal_to := FALSE;ELSIF ActVal < SetpointTHEN under := TRUE;over := FALSE;equal_to := FALSE;ELSE equal_to := TRUE;over := FALSE;under := FALSE;END_IF;//Edge evalaution (rising edge)IF Manual AND NOT Manual_FMTHEN (*rising edge*);END_IF;Manual_FM := Manual; //Correct edge memory bit//Counting bits set to "1"Total := 0;FOR i:=1 TO 32 DOIF M[y_index,i] = TRUETHEN Total := Total + 1;END_IF;END_FOR;END_FUNCTION_BLOCK第二章CASE:创建多路分支说明:使用“创建多路分支”指令,可以根据数字表达式的值执行多个指令序列中的一个。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档