3.5 其他指令

3.5.1 程序控制操作指令

本节的程序在项目“程序控制与日期时间指令应用”中。

1.跳转指令与标签指令

没有执行跳转指令时,各个程序段按从上到下的先后顺序执行。跳转指令中止程序的顺序执行,跳转到指令中的跳转标签所在的目的地址。跳转时不执行跳转指令与跳转标签(LABEL)之间的程序,跳到目的地址后,程序继续顺序执行。可以向前或向后跳转,可以在同一个代码块中从多个位置跳转到同一个标签。

只能在同一个代码块内跳转,不能从一个代码块跳转到另一个代码块。在一个块内,跳转标签的名称只能使用一次。一个程度段中只能设置一个跳转标签。

如果图3-55中M2.0的常开触点闭合,跳转条件满足。“RLO为1时跳转”指令的JMP(Jump)线圈通电(跳转线圈为绿色),跳转被执行,将跳转到指令给出的跳转标签W1234处,执行标签之后的第一条指令。被跳过的程序段的指令没有被执行,这些程序段的梯形图为灰色。标签在程序段的开始处,标签的第一个字符必须是字母,其余的可以是字母、数字和下划线。如果跳转条件不满足,将继续执行跳转指令之后的程序。

“RLO为0时跳转”指令JMPN的线圈断电时,将跳转到指令给出的跳转标签处,执行跳转标签之后的第一条指令。反之则不跳转。

2.跳转分支指令与定义跳转列表指令

“跳转分支”指令SWITCH(见图3-56)根据一个或多个比较指令的结果,定义要执行的多个程序跳转,可以为每个输入选择比较符号。I2.4的常开触点接通时,如果K的值等于235或大于74,将分别跳转到跳转标签LOOP0和LOOP1指定的程序段。如果不满足上述条件,将执行输出ELSE处的跳转。如果输出ELSE未指定跳转标签,从下一个程序段继续执行程序。

978-7-111-57703-4-Chapter03-79.jpg

图3-55 跳转指令

978-7-111-57703-4-Chapter03-80.jpg

图3-56 多分支跳转指令

单击SWITCH和JMP LIST方框中的978-7-111-57703-4-Chapter03-81.jpg符号,可以增加输出DESTn的个数。SWITCH指令每增加一个输出都会自动插入一个输入。

使用“定义跳转列表”指令JMPLIST,可以定义多个有条件跳转,并继续执行由参数K的值指定的程序段中的程序。用指令框的输出DESTn指定的跳转标签定义跳转,可以增加输出的个数。图3-56中M2.5的常开触点接通时,如果K的值为1,将跳转到跳转标签LOOP1指定的程序段。如果K值大于可用的输出编号,则继续执行块中下一个程序段的程序。

3.RETRIGR指令

监控定时器又称为看门狗(Watchdog),每次循环它都被自动复位一次,正常工作时最大循环周期小于监控定时器的时间设定值,它不会起作用。

如果循环时间大于监控定时器的设定时间,监控定时器将会起作用。可以在所有的块中调用“重新启动周期监视时间”指令RETRIGR(见图3-55),来复位监控定时器。

4.STP指令与返回指令RET

有能流流入“退出程序”指令STP(见图3-55)的EN输入端时,PLC进入STOP模式。

“返回”指令RET(见图3-55)用来有条件地结束块,它的线圈通电时,返回调用它的块。RET线圈上面的参数是返回值,数据类型为Bool。如果当前的块是OB,返回值被忽略。如果当前的块是FC或FB,返回值作为FC或FB的ENO的值传送给调用它的块。

此外程序控制指令还有“获取本地错误信息”指令GET ERROR、“获取本地错误ID”指令GET ERR ID、“启用/禁用CPU密码”指令ENDIS PW和“测量程序运行时间”指令RUNTIME。

3.5.2 日期和时间指令

在CPU断电时,用超级电容保证实时时钟(Time-of-dayClock)的运行。保持时间通常为20天,40℃时最少为12天。打开在线与诊断视图,可以设置实时时钟的时间值。也可以用日期和时间指令来读、写实时时钟。

1.日期时间的数据类型

数据类型Time的长度为4B,时间单位为ms。数据类型DTL的12B依次为年(占2B)、月、日、星期的代码、小时、分、秒(各占1B)和纳秒(占4B),均为BCD码。星期日、星期一~星期六的代码分别为1~7。可以在全局数据块或块的接口区定义DTL变量。

2.时钟功能指令

系统时间是格林尼治标准时间,本地时间是根据当地时区设置的本地标准时间。我国的本地时间(北京时间)比系统时间多8h。在组态CPU的属性时,设置时区为北京,不使用夏令时。

日期和时间指令在指令列表的“扩展指令”窗格的“日期和时间”选项卡中,输出参数RET VAL是返回的指令的状态信息,数据类型为Int。

生成全局数据块“数据块1”,在其中生成数据类型为DTL的变量DT1~DT3。用监控表将新的时间值写入"数据块1".DT3。“写时间”(M3.2)为1状态时,“写入本地时间”指令WRLOCT(见图3-57)将输入参数LOCTIME输入的日期时间作为本地时间写入实时时钟。参数DST与夏令时有关,我国不使用夏令时。

978-7-111-57703-4-Chapter03-82.jpg

图3-57 读写时间指令与数据块

“读时间”(M3.1)为1状态时,“读取时间”指令RD SYST和“读取本地时间”指令RD LOC T(见图3-57)的输出OUT分别是数据类型为DTL的PLC中的系统时间和本地时间。图3-57给出了同时读出的系统时间DT1和本地时间DT2,本地时间多8个小时。

“设置时区”指令SET TIMEZONE用于设置本地时区和夏令时/标准时间切换的参数。

“运行时间定时器”指令RTM用于对CPU的32位运行小时计数器的设置、启动、停止和读取操作。“转换时间并提取”指令TCONV用于在整数和时间数据类型之间转换。

“时间相加”指令T ADD、“时间相减”指令T SUB和“时间值相减”指令T DIFF用于时间值的加减。“组合时间”指令T COMBINE用于合并日期值和时间值。

3.5.3 字符串与字符指令

本节的程序在项目“字符串指令应用”的OB1中。

1.字符串的结构

String(字符串)数据类型有2B的头部,其后是最多254B的ASCII字符代码。字符串的首字节是字符串的最大长度,第2个字节是当前长度,即当前实际使用的字符数。字符串占用的字节数为最大长度加2。宽字符串Wstring的定义见2.3.4节。

2.定义字符串

执行字符串指令之前,首先应定义字符串。不能在变量表中定义字符串,只能在代码块的接口区或全局数据块中定义它。

生成符号名为DB 1的全局数据块DB1,取消它的“优化的块访问”属性后,可以用绝对地址访问它。在DB 1中定义字符串变量String1~String3(见图3-58)。字符串的数据类型String[18]中的“[18]”表示其最大长度为18个字符,加上两个头部字节,共20B。如果字符串的数据类型为String(没有方括号),每个字符串变量将占用256B。

978-7-111-57703-4-Chapter03-83.jpg

图3-58 数据块中的字符串变量

3.字符串转换指令

在指令列表的“扩展指令”窗格的“字符+字符串”选项卡中,“转换字符串”指令SCONV用于将输入的字符串转换为对应的数值,或者将数值转换为对应的字符串。

“将字符串转换为数值”指令STRG VAL将数值字符串转换为对应的整数或浮点数。从参数IN指定的字符串的第P个字符开始转换,直到字符串结束。“将数值转换为字符串”指令VAL STRG将输入参数IN中的数字,转换为输出参数OUT中对应的字符串。

指令Strg TO Chars将字符串转换为字符元素组成的数组,指令Chars TO Strg将字符元素组成的数组转换为字符串。指令ATH将ASCII字符串转换为十六进制数,指令HTA将十六进制数转换为ASCII字符串。

上述指令具体的使用方法见在线帮助或S7-1200的系统手册。

4.确定字符串长度的指令与移动字符串指令

执行图3-59中的“确定字符串的长度”指令LEN后,MW24中是输入的字符串的长度(7个字符)。“确定字符串的最大长度”指令MAX LEN用输出参数OUT(整数)提供输入参数IN指定的字符串的最大长度。“移动字符串”指令S MOVE用于将参数IN中的字符串的内容写入参数OUT指定的数据区域。

978-7-111-57703-4-Chapter03-84.jpg

图3-59 字符串指令

5.合并字符串的指令

“合并字符串”指令CONCAT(见图3-59)将输入参数IN1和IN2指定的两个字符串连接在一起,然后用参数OUT输出合并后的字符串'ABCDabcd'。

6.读取字符串中的字符的指令

“读取字符串左边的字符”指令LEFT提供由字符串参数IN的前L个字符组成的子字符串。执行图3-59中的LEFT指令后,输出参数OUT中的字符串包含了IN输入的字符串左边的5个字符'Speed'。“读取字符串右边的字符”指令RIGHT提供字符串的最后L个字符。执行图3-60中的RIGHT指令后,输出参数OUT中的字符串包含了IN输入的字符串右边的4个字符'1425'。

978-7-111-57703-4-Chapter03-85.jpg

图3-60 字符串指令

执行图3-60中的“读取字符串中间的字符”指令MID后,输出参数OUT中的字符串包含了IN输入的字符串从第2个字符开始的中间4个字符'BCDE'。

7.删除字符指令

执行图3-60中的“删除字符串中的字符”指令DELETE后,IN输入的字符串被删除了从第3个字符开始的2个字符'CD',然后将字符串'ABEFG'输出到OUT指定的字符串。

8.插入字符指令

执行图3-61中的“在字符串中插入字符”指令INSERT后,IN2指定的字符'ABC'被插入到IN1指定的字符串'abcde'第3个字符之后。输出的字符串为'abcABCde'。

978-7-111-57703-4-Chapter03-86.jpg

图3-61 字符串指令

9.替换字符指令

执行图3-61中的“替换字符串中的字符”指令REPLACE以后,字符串IN1中从第3个字符开始的3个字符('CDE')被IN2指定的字符'1234'代替。替换后得到字符串'AB1234FG'。

10.查找字符指令

“在字符串中查找字符”指令FIND提供字符串IN2中的字符在字符串IN1中的位置。查找从字符串IN1的左侧开始,如果在字符串IN1中未找到字符串IN2,则返回零。

执行图3-61中的FIND指令后,查找到IN2指定的字符'DEF'从IN1指定的字符串'ABCDEFG'的第4个字符开始。