施耐德Unity_Pro结构化文本(ST)_第1页
施耐德Unity_Pro结构化文本(ST)_第2页
施耐德Unity_Pro结构化文本(ST)_第3页
施耐德Unity_Pro结构化文本(ST)_第4页
施耐德Unity_Pro结构化文本(ST)_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、结构化文本(ST)目录结构化文本(ST)1概述2一结构化文本 ST简介31.结构化文本 ST简介32.操作数43.操作符5二指令101.指令102.赋值103.选择指令IFTHENEND_IF114.选择指令ELSE125.选择指令ELSETHEN136.选择指令CASEOFEND_CASE137.重复指令FORTOBYDOEND_FOR148.重复指令WHILEDOEND_WHILE159.重复指令REPEATUNTILEND_REPEAT1610.重复指令1611. 子程序调用1712. RETURN1713. 空指令1714. 标签和跳转1815. 注释18三调用基本功能、基本功能块、导

2、出的功能块和过程191. 调用基本功能192.调用基本功能块和导出的功能块 基本功能块233.过程29概述 本章介绍符合 IEC 61131 的编程语言结构化文本 ST。 本章包含了哪些内容? 本章包含了以下部分: · 结构化文本 ST 简介 · 指令 · 调用基本功能、基本功能块、导出的功能块和过程 一结构化文本 ST简介概述 本节包含结构化文本 ST 的概述。 本节包含了哪些内容? 本节包含了以下主题: · 结构化文本 ST 简介 · 操作数 · 操作符 1.结构化文本 ST简介简介使用结构化文本 (ST) 的编程语言,可以执行多

3、种操作,例如调用功能块、执行功能和赋值、有条件地执行指令和重复任务。表达式ST 编程语言使用"表达式"。表达式是由操作符和操作数组成的结构,在执行表达式时会返回值。操作符操作符是表示要执行的操作的符号。操作数操作符供操作数使用。操作数为变量、数值、FFB 输入/输出等。说明指令用于将表达式返回的值赋给实际参数,并构造和控制表达式。ST 段的表示形式ST 段的表示形式:段大小指令行的长度不应超过 300 个字符。ST 段的长度在编程环境中没有限制。ST 段的长度仅受 PLC 存储器大小的限制。语法标识符和关键字不区分大小写。例外:不允许使用空格和制表符· 关键字&#

4、183; 数值· 值· 标识符· 变量和 · 限制符组合 例如用于注释的 (*执行顺序计算表达式时将根据操作符的优先级所定义的顺序将操作符应用于操作数(请参见操作符表)。首先执行表达式中具有最高优先级的操作符,接着执行具有次优先级的操作符,依此类推,直到完成整个计算过程。优先级相同的操作符将根据它们在表达式中的书写顺序从左至右执行。可使用括号更改此顺序。例如,如果 A、B、C 和D 的值分别为 1、2、3 和 4,并按以下方式计算:A+B-C*D结果则为 -9。在下面的计算中:(A+B-C)*D结果则为 0。如果操作符包含两个操作数,则先执行左边的操作数

5、,例如在表达式SIN(A)*COS(B)中,先计算表达式 SIN(A),后计算 COS(B),然后计算它们的乘积。错误行为下面的情况在执行表达式时作为错误处理:· 尝试除以 0。· 操作数包含的数据类型不适合对应的运算。· 数字运算的结果超出了其数据类型的值范围。如果执行运算的过程中出现错误,则会设置相应的系统位 (%S)(如果使用的 PLC 支持这一设置)。IEC 遵从性有关针对 ST 编程语言的 IEC 遵从性的描述,请参见 IEC 遵从性。2.操作数简介 操作数可以是: · 地址 · 数值 · 变量 · 多元素变量 &

6、#183; 多元素变量的元素 · 功能调用 · FFB 输出 数据类型 处理操作数的指令中的数据类型必须相同。如果需要处理不同类型的操作数,则必须预先执行类型转换。 在下面的示例中,整数变量 i1 在添加到实数变量 r4 中之前会先转换为实数变量。 r3 := r4 + SIN(INT_TO_REAL(i1) ;此规则的例外情况是,数据类型为 TIME 的变量可乘以或除以数据类型为 INT、DINT、UINT 或 UDINT 的变量。 允许的运算: · timeVar1 := timeVar2 / dintVar1; · timeVar1 := time

7、Var2 * intVar1; · timeVar := 10 * time#10s; 此功能由 IEC 61131-3 作为"不希望"的服务列出。 直接使用地址 地址可直接使用(无需事先声明)。在本例中,地址数据类型是直接分配的。该数据类型的分配通过使用"大前缀"进行。 下表列出了不同的大前缀:大前缀/符号示例数据类型无前缀%I10、%CH203.MOD、%CH203.MOD.ERRBOOLX%MX20BOOLB%QB102.3BYTEW%KW43INTD%QD100DINTF%MF100REAL使用其他数据类型 要将其他数据类型指定为地址的

8、缺省数据类型,必须通过显式声明进行。使用变量编辑器可方便地完成变量的声明。地址的数据类型不能在 ST 段中直接声明(例如,不允许声明 AT %MW1:UINT)。 例如,在变量编辑器中声明以下变量: UnlocV1: ARRAY 1.10 OF INT;LocV1: ARRAY 1.10 OF INT AT %MW100;LocV2: TIME AT %MW100;下面的调用具有正确的语法: %MW200 := 5;UnlocV12 := LocV1%MW200;LocV2 := t#3s;访问字段变量 访问字段变量 (ARRAY) 时,只有数值和数据类型为 INT、UINT、DINT 以及

9、UDINT 的变量才允许用于索引项。 如果范围的阈值下限为负数,则 ARRAY 元素的索引也可为负数。 示例:使用字段变量 var1i := 8 ;var2.otto4 := var3 ;var41+i+j*5 := 4 ;3.操作符简介 操作符是一种符号,它表示: · 要执行的算术运算,或 · 要执行的逻辑运算 · 功能编辑(调用) 操作符是泛型的,即,它们自动适应操作数的数据类型。 操作符表 操作符根据优先级按顺序执行,另请参见执行顺序。 ST 编程语言操作符表: 操作符含义优先级适用的操作数描述()使用括号:1(最高)表达式括号用于改变操作符的执行顺序。示例

10、:如果操作数 A、B、C 和 D 的值分别为 1、2、3 和 4,A+B-C*D的结果则为 -9,而(A+B-C)*D的结果则为 0。FUNCNAME(实际参数 -list)函数处理(调用)2表达式、数值、变量、地址(所有数据类型)函数处理用于执行函数(请参见 调用基本功能)。-取反3数据类型为 INT、DINT 或 REAL 的表达式、数值、变量或地址取反 (-) 时,操作数值的符号会反转。示例:本示例中,如果 IN1 为 4,则 OUT 为 -4。OUT := - IN1 ;NOT反码3数据类型为 BOOL、BYTE、WORD 或 DWORD 的表达式、数值、变量或地址进行 NOT 运算时

11、,操作数将逐位反转。示例:本示例中,如果 IN1 为 1100110011,则 OUT 为 0011001100。OUT := NOT IN1 ;*幂4数据类型为 REAL(底数)和 INT、DINT、UINT、UDINT 或 REAL(指数)的表达式、数值、变量或地址求幂 (*) 运算时,将以第一个操作数为底数,第二个操作数为指数进行求幂。示例:该示例中,如果 IN1 为 5.0,IN2 为 4.0,则 OUT 为 625.0。OUT := IN1 * IN2 ;*乘法5数据类型为 INT、DINT、UINT、UDINT 或 REAL 的表达式、数值、变量或地址乘法 (*) 运算时,将用第一

12、个操作数的值乘以第二个操作数(指数)的值。示例:该示例中,如果 IN1 为 5.0,IN2 为 4.0,则 OUT 为 20.0。OUT := IN1 * IN2 ;注:先期库中的 MULTIME 函数可用于涉及数据类型 Time 的乘法。/除法5数据类型为 INT、DINT、UINT、UDINT 或 REAL 的表达式、数值、变量或地址除法 (/) 运算时,将用第一个操作数的值除以第二个操作数的值。示例:该示例中,如果 IN1 为 20.0,IN2 为 5.0,则 OUT 为 4.0。OUT := IN1 / IN2 ;注:先期库中的 DIVTIME 函数可用于涉及数据类型 Time 的除法

13、。MOD模数5数据类型为 INT、DINT、UINT 或 UDINT 的表达式、数值、变量或地址执行 MOD 时,将用第一个操作数的值除以第二个操作数的值,除法的余数(模数)显示为结果。示例:本示例中· 如果 IN1 为 7,IN2 为 2,则 OUT 为 1。· 如果 IN1 为 7,IN2 为 -2,则 OUT 为 1。· 如果 IN1 为 -7,IN2 为 2,则 OUT 为 -1。· 如果 IN1 为 -7,IN2 为 -2,则 OUT 为 -1。OUT := IN1 MOD IN2 ;+加法6数据类型为 INT、DINT、UINT、UDINT、

14、REAL 或 TIME 的表达式、数值、变量或地址加法 (+) 运算时,将用第一个操作数的值加上第二个操作数的值。示例:本示例中如果 IN1 为 7,IN2 为 2,则 OUT 为 9OUT := IN1 + IN2 ;-减法6数据类型为 INT、DINT、UINT、UDINT、REAL 或 TIME 的表达式、数值、变量或地址减法 (-) 运算时,将用第一个操作数的值减去第二个操作数的值。示例:该示例中,如果 IN1 为 10,IN2 为 4,则 OUT 为 6。OUT := IN1 - IN2 ;<小于比较7数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、RE

15、AL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、变量或地址使用 < 将第一个操作数的值与第二个操作数的值进行比较。如果第一个操作数的值小于第二个操作数的值,则结果为布尔值 1。如果第一个操作数的值大于或等于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 小于 10,则 OUT 为 1,否则为 0。OUT := IN1 < 10;>大于比较7数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、REAL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、

16、变量或地址使用 > 将第一个操作数的值与第二个操作数的值进行比较。如果第一个操作数的值大于第二个操作数的值,则结果为布尔值 1。如果第一个操作数的值小于或等于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 大于 10,则 OUT 为 1,如果 IN1 小于 10 则为 0。OUT := IN1 > 10;<=小于或等于比较7数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、REAL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、变量或地址使用 <= 将第一个操作数的值与第二个操作数的值

17、进行比较。如果第一个操作数的值小于或等于第二个操作数的值,则结果为布尔值 1。如果第一个操作数的值大于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 小于或等于 10,则 OUT 为 1,否则为 0。OUT := IN1 <= 10;>=大于或等于比较7数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、REAL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、变量或地址使用 >= 将第一个操作数的值与第二个操作数的值进行比较。如果第一个操作数的值大于或等于第二个操作数的值,则结果为布尔值 1。

18、如果第一个操作数的值小于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 大于或等于 10,则 OUT 为 1,否则为 0。OUT := IN1 >= 10;=等于8数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、REAL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、变量或地址使用 = 将第一个操作数的值与第二个操作数的值进行比较。如果第一个操作数的值等于第二个操作数的值,则结果为布尔值 1。如果第一个操作数的值不等于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 等于 10,则

19、OUT 为 1,否则为 0。OUT := IN1 = 10 ;<>不等于8数据类型为 BOOL、BYTE、INT、DINT、UINT、UDINT、REAL、TIME、WORD、DWORD、STRING、DT、DATE 或 TOD 的表达式、数值、变量或地址使用 <> 将第一个操作数的值与第二个操作数的值进行比较。如果第一个操作数的值不等于第二个操作数的值,则结果为布尔值 1。如果第一个操作数的值等于第二个操作数的值,则结果为布尔值 0。示例:本示例中,如果 IN1 不等于 10,则 OUT 为 1,否则为 0。OUT := IN1 <> 10;&逻辑

20、与9数据类型为 BOOL、BYTE、WORD 或 DWORD 的表达式、数值、变量或地址对于 &,操作数之间存在逻辑与关联。对于 BYTE、WORD 和 DWORD 数据类型,此关联是逐位进行的。示例:本示例中,如果 IN1、IN2 和 IN3 均为 1,则 OUT 为 1。OUT := IN1 & IN2 & IN3;AND逻辑与9数据类型为 BOOL、BYTE、WORD 或 DWORD 的表达式、数值、变量或地址对于 AND,操作数之间存在逻辑与关联。对于 BYTE、WORD 和 DWORD 数据类型,此关联是逐位进行的。示例:本示例中,如果 IN1、IN2 和 I

21、N3 均为 1,则 OUT 为 1。OUT := IN1 AND IN2 AND IN3 ;XOR逻辑异或10数据类型为 BOOL、BYTE、WORD 或 DWORD 的表达式、数值、变量或地址对于 XOR,操作数之间存在逻辑异或关联。对于 BYTE、WORD 和 DWORD 数据类型,此关联是逐位进行的。示例:本示例中,如果 IN1 和 IN2 不相等,则 OUT 为 1。如果 A 和 B 的状态相同(均为 0 或均为 1),则 D 为 0。OUT := IN1 XOR IN2 ;如果将两个以上的操作数进行关联,当状态为 1 的操作数个数不是偶数时结果为 1,而当状态为 1 的操作数个数是偶

22、数时结果为 0。示例:本示例中,如果有 1 个或 3 个操作数为 1,则 OUT 为 1,如果有 0、2 或 4 个操作数为 1,则 OUT 为 0。OUT := IN1 XOR IN2 XOR IN3 XOR IN4 ;OR逻辑或11(最低)数据类型为 BOOL、BYTE、WORD 或 DWORD 的表达式、数值、变量或地址对于 OR,操作数之间存在逻辑或关联。对于 BYTE、WORD 和 DWORD 数据类型,此关联是逐位进行的。示例:本示例中,如果 IN1、IN2 或 IN3 为 1,则 OUT 为 1。OUT := IN1 OR IN2 OR IN3 ;二指令概述 本节描述结构化文本S

23、T 编程语言的指令。 本节包含了哪些内容? 本节包含了以下主题: · 指令 · 赋值 · 选择指令 IF.THEN.END_IF · 选择指令 ELSE · 选择指令 ELSIF.THEN · 选择指令 CASE.OF.END_CASE · 重复指令 FOR.TO.BY.DO.END_FOR · 重复指令 WHILE.DO.END_WHILE · 重复指令 REPEAT.UNTIL.END_REPEAT · 重复指令 EXIT · 子程序调用 · RETURN ·

24、空指令 · 标签和跳转 · 注释 1.指令描述 指令是 ST 编程语言的"命令"。 指令必须以分号结尾。 一行中可以有多个指令(由分号分隔)。 单个分号表示空指令。 2.赋值简介 执行赋值时,单元素或多元素变量的当前值会替换为表达式的计算结果。 赋值表达式的结构为:左边是变量名称,之后是赋值操作符 :=,然后是要求值的表达式。 两个变量(分别位于赋值操作符的左侧和右侧)的数据类型必须相同。 数组是个特例。显式启用后,也可对长度不同的两个数组执行赋值操作。 将一个变量的值赋给另一个变量 赋值用于将一个变量的值赋给另一个变量。 例如,指令 A := B ;用

25、于将变量 A 的值替换为变量 B 的当前值。如果 A 和 B 是基本数据类型,则 B 的单个值会传递给 A。如果 A 和 B 是导出的数据类型,则所有 B 元素的值都传递给 A。 将数值赋给变量 赋值用于将数值赋给变量。 指令 C := 25 ;用于将值 25 赋给变量 C。 将运算值赋给变量 赋值用于将运算结果赋给变量。 例如,指令 X := (A+B-C)*D ;用于将 (A+B-C)*D 的运算结果赋给变量 X。 将 FFB 的值赋给变量 赋值用于将功能或功能块返回的值赋给变量。 例如,指令 B := MOD(C,A) ;用于调用 MOD(模数)功能并将计算结果赋给变量 B。 例如,指令

26、 A := MY_TON.Q ;用于将 MY_TON 功能块(TON 功能块的实例)的 Q 输出值赋给变量 A。(这不是功能块调用) 多重赋值 多重赋值是对 IEC 61131-3 的补充,必须显式启用。 即使已经启用,下列情况下也不能进行多重赋值: · 在功能块调用的参数列表中 · 在用于初始化结构化变量的元素列表中 指令 X := Y := Z是允许的。 指令 FB(in1 := 1, In2 := In3 := 2) ;和 strucVar := (comp1 := 1, comp2 := comp3 := 2) ;是不允许的。 数组与 WORD-/DWORD 变量之

27、间的赋值 数组和 WORD-/DWORD 变量之间进行赋值时必须先执行类型转换,例如: %Q3.0:16 := INT_TO_AR_BOOL(%MW20) ;提供了下面的转换功能(常规库,Array 系列): · MOVE_BOOL_AREBOOL · MOVE_WORD_ARWORD · MOVE_DWORD_ARDWORD · MOVE_INT_ARINT · MOVE_DINT_ARDINT · MOVE_REAL_ARREAL 3.选择指令IFTHENEND_IF描述 IF 指令只有确定其相关布尔表达式的值为 1(真)时,才会

28、执行指令或一组指令。如果条件为 0(假),将不会执行该指令或指令组。 THEN 指令标识条件的结尾和指令的开头。 END_IF 指令标记指令的结尾。 注意: 可以嵌套任何数量的 IF.THEN.END_IF 指令,以生成复杂的选择指令。 示例 IF.THEN.END_IF 该条件可以使用布尔变量表达。 如果 FLAG 为 1,将执行指令;如果 FLAG 为 0,则不会执行。 IF FLAG THEN C:=SIN(A) * COS(B) ; B:=C - A ;END_IF ;该条件可使用返回布尔结果的操作表达。 如果 A 大于 B,将会执行指令;如果 A 小于或等于 B,则不会执行。 IF

29、A>B THEN C:=SIN(A) * COS(B) ; B:=C - A ;END_IF ;示例 IF NOT.THEN.END_IF 该条件可使用 NOT 反转(为 0 时执行这两个指令)。 IF NOT FLAG THEN C:=SIN_REAL(A) * COS_REAL(B) ; B:=C - A ;END_IF ;另请参见 ELSE ELSIF 4.选择指令ELSE描述 ELSE 指令始终出现在 IF.THEN、ELSIF.THEN 或 CASE 指令后面。 如果 ELSE 指令出现在 IF 或 ELSIF 指令后面,则仅当 IF 和 ELSIF 指令的关联布尔表达式为 0

30、(假)时,才会执行该指令或指令组。如果 IF 或 ELSIF 指令的条件为 1(真),则不会执行该指令或指令组。 如果 ELSE 指令出现在 CASE 后面,则仅当所有标签都不包含选择器的值时,才会执行该指令或指令组。如果某个标识包含选择器的值,则不会执行该指令或指令组。 注意: 可以嵌套任何数量的 IF.THEN.ELSE.END_IF 指令,以生成复杂的选择指令。 示例 ELSE IF A>B THEN C:=SIN(A) * COS(B) ; B:=C - A ;ELSE C:=A + B ; B:=C * A ;END_IF ;另请参见 IF ELSIF CASE 5.选择指令E

31、LSETHEN描述 ELSE 指令始终出现在 IF.THEN 指令后面。ELSIF 指令确定仅当 IF 指令的关联布尔表达式的值为 0(假)并且 ELSIF 指令的关联布尔表达式的值为 1(真)时,才会执行指令或指令组。如果 IF 指令的条件为 1(真)或者 ELSIF 指令的条件为 0(假),则不会执行该命令或命令组。 THEN 指令标识 ELSIF 条件的结尾和指令的开头。 注意: 可以嵌套任何数量的 IF.THEN.ELSIF.THEN.END_IF 指令,以生成复杂的选择指令。 示例 ELSIF.THEN IF A>B THEN C:=SIN(A) * COS(B) ; B:=S

32、UB(C,A) ;ELSIF A=B THEN C:=ADD(A,B) ; B:=MUL(C,A) ;END_IF ;例如嵌套指令 IF A>B THEN IF B=C THEN C:=SIN(A) * COS(B) ; ELSE B:=SUB(C,A) ; END_IF ;ELSIF A=B THEN C:=ADD(A,B) ; B:=MUL(C,A) ;ELSE C:=DIV(A,B) ;END_IF ;另请参见 IF ELSE 6.选择指令CASEOFEND_CASE描述 CASE 指令包含一个 INT 数据类型的表达式(选择器)和一个指令组列表。每组都具有一个包含一个或多个整数(

33、INT、DINT、UINT 或 UDINT)或整数值范围的标签。将执行的指令为其标签中包含选择器计算出的值的第一组指令。否则,将不执行任何标签对应的指令。 OF 指令指示标签的开头。 所有标签都不包含选择器的值时,才会在 CASE 指令内执行 ELSE 指令。 END_CASE 指令标记指令的结尾。 示例 CASE.OF.END_CASE 示例 CASE.OF.END_CASE 另请参见 ELSE 7.重复指令FORTOBYDOEND_FOR描述 FOR 指令用于在发生次数可预先确定的情况下。否则可使用 WHILE 或 REPEAT。 FOR 指令会重复执行指令序列,直到遇到 END_FOR

34、指令为止。发生次数由起始值、结束值和控制变量决定。 控制变量、起始值和结束值必须具有相同的数据类型(DINT 或INT)。 控制变量、起始值和结束值可由重复指令进行更改。这是对 IEC 61131-3 的补充。 FOR 指令以控制变量值为步幅递增起始值,直到达到结束值。增量值的缺省值为 1。如果要使用其他值,则可以指定显式增量值(变量或常量)。每个新的循环之前都要检查控制变量值。如果它位于起始值和结束值的范围之外,则将离开循环。 首次运行循环之前,会进行检查以确定从初始值开始的控制变量递增是否是朝着结束值的方向。如果不是(例如,起始值 结束值并且增量为负值),则不会对循环进行处理。控制变量值不

35、是在循环外定义的。 DO 指令标识重复定义的结尾和指令的开头。 可以使用 EXIT 提前终止循环。END_FOR 指令标记指令的结尾。 示例:增量为 1 的 FOR 增量为 1 的 FOR 增量不为 1 的 FOR 如果要使用的增量不为 1,这可由 BY 定义。增量、初始值、结束值和控制变量必须具有相同的数据类型(DINT 或 INT)。处理方向(向前或向后)由 BY 表达式的符号决定。如果此表达式为正,则循环正向进行;如果为负,则循环反向进行。 示例:步幅为 2 的正向计数 步幅为 2 的正向计数 示例:反向计数 反向计数 FOR i:= 10 TO 1 BY -1 DO (* BY <

36、; 0 : Backwards.loop *)C:= C * COS(B) ; (* Instruction is executed 10 x *)END_FOR ;示例:"唯一"循环 本示例中的循环正好执行一次,原因是初始值 = 结束值。此种情况下,增量为正还是负没有关系。 FOR i:= 10 TO 10 DO (* Unique Loop *)C:= C * COS(B) ;END_FOR ;或 FOR i:= 10 TO 10 BY -1 DO (* Unique Loop *)C:= C * COS(B) ;END_FOR ;示例:临界循环 如果本示例中增量 j

37、> 0,将执行指令。 如果 j < 0,将不会执行指令,因为条件初始值 < 仅允许结束值的增量 0。 如果 j = 0,将执行指令并且会创建一个无限循环,因为增量为 0 时永远都不会达到结束值。 FOR i:= 1 TO 10 BY j DOC:= C * COS(B) ; END_FOR ;8.重复指令WHILEDOEND_WHILE说明 WHILE 指令可使一个指令序列重复执行,直到其相关布尔表达式为 0(假)。如果从一开始该表达式就为假,则根本不会执行该指令组。 DO 指令标识重复定义的结尾和指令的开头。 可以使用 EXIT 提前终止循环。 END_WHILE 指令标记

38、指令的结尾。 下列情况下不应使用 WHILE,因为它可能导致无限循环,从而造成程序崩溃: · WHILE 不能用于过程之间的同步,例如,不能用作具有外部定义的结束条件的“等待循环”。 · WHILE 不能用在算法中,因为无法确保完成循环结束条件或执行 EXIT 指令。 示例 WHILE.DO.END_WHILE x := 1; WHILE x <= 100 DO x := x + 4; END_WHILE ;另请参见 EXIT 9.重复指令REPEATUNTILEND_REPEAT描述 REPEAT 指令可使一个指令序列重复执行(至少执行一次),直到相关布尔条件为 1

39、(真)。 UNTIL 指令标记结束条件。 可以使用 EXIT 提前终止循环。 END_REPEAT 指令标记指令的结尾。 下列情况下不应使用 REPEAT,因为它可能导致无限循环,从而造成程序崩溃: · REPEAT 不能用于进程之间的同步,例如,不能用作具有外部定义的结束条件的“等待循环”。 · REPEAT 不能用在算法中,例如无法确保完成循环结束条件或执行 EXIT 指令。 示例 REPEAT.UNTIL.END_REPEAT x := -1; REPEAT x := x + 2; UNTIL x >= 101 END_REPEAT; 另请参见 EXIT 10.

40、重复指令描述 EXIT 指令用于在满足结束条件前终止重复指令(FOR、WHILE 或 REPEAT)。 如果 EXIT 指令位于嵌套的重复指令内,则会离开最里面的循环(EXIT 所在的循环)。接下来,将执行循环结尾(END_FOR、END_WHILE 或 END_REPEAT)后的第一个指令。 示例 EXIT 如果 FLAG 的值为 0,执行指令后 SUM 将为 15。 如果 FLAG 的值为 1,执行指令后 SUM 将为 6。 SUM : = 0 ;FOR I := 1 TO 3 DO FOR J := 1 TO 2 DO IF FLAG=1 THEN EXIT; END_IF ; SUM

41、:= SUM + J ; END_FOR ; SUM := SUM + I ;END_FOR另请参见 CASE WHILE REPEAT 11. 子程序调用子程序调用 子程序调用由子程序段名称后跟空参数列表组成。 子程序调用不返回值。 待调用的子程序必须与调用的 ST 段位于同一任务中。 也可以从子程序中调用子程序。 例如: SubroutineName () ;子程序调用是对 IEC 61131-3 的补充,且必须显式启用。 在 SFC 动作段中,仅当启用了多令牌操作时才允许子程序调用。12. RETURN描述 RETURN 指令可用于 DFB(导出功能块)和 SR(子程序)中。 RETUR

42、N 指令不可用于主程序中。 · 在 DFB 中,RETURN 指令强制返回称为 DFB 的程序。 不执行包含 RETURN 指令的剩余 DFB 段。 也不执行 DFB 的下一段。 从 DFB 返回后,将执行称为 DFB 的程序 如果另一个 DFB 调用了此 DFB,将在返回后执行调用 DFB。 · 在 SR 中,RETURN 指令强制返回称为 SR 的程序。 不执行包含 RETURN 指令的剩余 SR。 从 SR 返回后,将执行称为 SR 的程序。 13. 空指令描述 单个分号 ; 表示空指令。 例如: IF x THEN ; ELSE .在此示例中,THEN 指令后面就跟

43、着一个空指令。这意味着,只要 IF 条件为 1,程序就会立即退出 IF 指令。 14. 标签和跳转简介 标签用作跳转的目标。 ST 中的跳转和标签是对 IEC 61131-3 的补充,且必须显式启用。 标签属性 标签属性: · 标签必须始终是行中的第一个元素。 · 标签只能出现在第一级指令前(不能在循环中)。 · 其名称在整个目录中都必须明确,并且不区分大小写。 · 标签必须符合一般命名约定。 · 标签用冒号 :与后面的指令分隔。 跳转属性 跳转属性 · 可在程序和 DFB 段中进行跳转。 · 只能在当前段中进行跳转。 示例

44、 IF var1 THEN JMP START; :START: .15. 注释描述 在 ST 编辑器中,注释总是以字符串 (* 开始,以字符串 *) 结束。在这两个字符串之间可以输入任何注释。可在 ST 编辑器的任何位置输入注释,但不能在关键字、数值、标识符和变量中输入注释。 IEC 61131-3 不允许嵌套注释。如果已经嵌套了注释,则必须显式启用。 三调用基本功能、基本功能块、导出的功能块和过程概述 使用 ST 编程语言调用基本功能、基本功能块、导出的功能块和过程。 本节包含了哪些内容? 本节包含了以下主题: · 调用基本功能 · 调用基本功能块和导出的功能

45、块 · 过程 1. 调用基本功能 基本功能 基本功能以库的形式提供。功能的逻辑是使用编程语言 C 创建的,不能在 ST 编辑器中进行修改。 功能没有内部状态。如果输入值相同,则每次执行该功能后输出的值都相同。例如,每次执行两个值相加后都能得到相同的结果。 有些基本功能可扩展为具有 2 个以上的输入。 基本功能只具有一个返回值(输出)。 参数 将值传入或传出功能需要“输入”和一个“输出”。这些输入/输出称为形式参数。 当前过程状态传递给形式参数。这些参数称为实际参数。 以下各项可用作功能输入的实际参数: · 变量 地址 数值 ST 表达式 以下各项可用作功能输出的实际参数:

46、· 变量 · 地址 实际参数的数据类型必须与形式参数的数据类型匹配。唯一的例外是泛型形式参数,其数据类型由实际参数决定。 处理泛型ANY_BIT 形式参数时,可使用数据类型为INT 或DINT (不是UINT 和UDINT)的实际参数。 这是对 IEC 61131-3 的补充,且必须显式启用。 示例: 允许: AND (AnyBitParam := IntVar1, AnyBitParam2 := IntVar2); 不允许: AND_WORD (WordParam1 := IntVar1, WordParam2 := IntVar2); (在这种情况下,必须使用AND_I

47、NT 。) AND_ARRAY_WORD (ArrayInt, .); (在这种情况下,必须使用INT_ARR_TO_WORD_ARR (.); 执行显式类型转换。). 并非所有形式参数都必须赋值。必须赋值的形式参数类型可参见此表: 参数类型EDTSTRINGARRAYANY_ARRAYIODDTSTRUCTFBANYInput-+-+-VAR_IN_OUT+/+Output-/-+ 需要实际参数- 不需要实际参数/ 不适用如果没有为形式参数赋值,则会使用初始值执行功能块。如果尚未定义初始值,则使用缺省值 (0)。 编程说明 请注意以下信息: · 所有通用功能都被过载。这意味着调用功

48、能时是否输入数据类型无关紧要。 例如 i1 := ADD (i2, 3); 等同于 i1 := ADD_INT (i2, 3); · 功能可以嵌套(另请参见.). · 仅当输入EN = 1 或未使用EN 输入时,才会执行功能(另请参见EN 和 ENO). · 有两种调用功能的方式: 形式调用(使用形式参数名称调用功能) 非形式调用(不使用形式参数名称调用功能) 形式调用 对于形式调用(带形式参数名称的调用),调用所使用的指令序列为:实际输出参数,后跟赋值指令:=,然后是功能名称,之后是用括号括起的列表(其中为实际参数对形式参数的赋值)。形式参数在功能调用中的列出顺

49、序无关紧要. EN 和ENO 可用于此类型的调用。 使用形式参数名称调用功能: 使用 FBD 调用相同的功能: 对于形式调用,没有必要为所有形式参数赋值(另请参见参数). out:=LIMIT (MN:=0, IN:=var1) 使用 FBD 调用相同的功能: 非形式调用 对于非形式调用(不带形式参数名称的调用),调用所使用的指令序列为:实际输出参数,后跟赋值指令符号:=,然后是功能名称,之后是用括号括起的输入实际参数的列表。实际参数在功能调用中的列出顺序非常重要. EN 和ENO 不能 用于此类型的调用。 不使用形式参数名称调用功能: 使用 FBD 调用相同的功

50、能: 对于非形式调用,没有必要为所有形式参数赋值(另请参见参数). 这是对 IEC 61131-3 的补充,且必须显式启用。 空参数字段用于跳过参数。 带空参数字段的调用: out:=LIMIT ( ,var1, 5 + var) 使用 FBD 调用相同的功能: 如果忽略位于末尾的形式参数,则无需使用空参数字段。 out:=LIMIT (0, var1) 使用 FBD 调用相同的功能: 嵌套功能 功能调用可包含进一步的功能调用。嵌套深度不受限制。 嵌套调用数组功能: out:=LIMIT (MN

51、:=4, IN:=MUL(IN1:=var1, IN2:=var2), MX:=5) 使用 FBD 调用相同的功能: 返回值为ANY_ARRAY 数据类型的函数不能 在功能调用内 使用。 未授权 嵌套,数据类型为ANY_ARRAY: ANY_ARRAY 允许用作调用的功能的返回值或嵌套功能的参数。 授权 嵌套,数据类型为ANY_ARRAY: EN 和 ENO 所有功能都可以配置一个EN 输入和一个ENO 输出。 如果调用功能时EN 的值为“0”,则不会执行该功能所定义的算法,并且ENO 设置为“0”。 如果调用功能时EN 的值为“1”,则执行该功能所定义的算法。成功执行这些算法之后,

52、ENO 的值设置为“1”。如果在执行这些算法的过程中出错,则ENO 将设置为“0”。 如果EN 引脚未赋值,则在调用 FFB 时,会执行 FFB 所定义的算法(与EN 等于“1”时的情况相同)。 如果ENO 设置为“0”(由于EN=0 或执行过程中出错),则功能的输出设置为“0”。 功能的输出行为不依赖于调用功能时是未使用EN/ENO 还是EN=1. 如果使用了EN/ENO ,则功能调用必须是形式调用。 out:=LIMIT (EN:=1, MN:=0, IN:=var1, MX:=5, ENO=>var2) 使用 FBD 调用相同的功能

53、: 2.调用基本功能块和导出的功能块 基本功能块 基本功能块具有内部状态。即使输入值不变,每次操作的输出值也可以不同。例如,计数器的输出值是递增的。 功能块可有多个输出值(输出)。 导出的功能块 导出的功能块 (DFB) 具有与基本功能块相同的特性。用户可以采用编程语言 FBD、LD、IL 和/或 ST 创建这类功能块。 参数 将值传入或传出功能块需要“输入和输出”。这些输入/输出称为形式参数。 当前过程状态传递给形式参数。它们称为实际参数。 以下各项可用作功能块输入的实际参数: · 变量 · 地址 · 数值 以下各项可用作功能块输出的实际参数: · 变

54、量 · 地址 实际参数的数据类型必须与形式参数的数据类型匹配。唯一的例外是泛型形式参数,其数据类型由实际参数决定。 处理泛型 ANY_BIT 形式参数时,可使用数据类型为 INT 或 DINT(不是 UINT 和 UDINT)的实际参数。 这是对 IEC 61131-3 的补充,且必须显式启用。 示例: 允许: AND (AnyBitParam := IntVar1, AnyBitParam2 := IntVar2); 不允许: AND_WORD (WordParam1 := IntVar1, WordParam2 := IntVar2); (在这种情况下,必须使用 AND_INT。

55、) AND_ARRAY_WORD (ArrayInt, .); (在这种情况下,必须使用 INT_ARR_TO_WORD_ARR (.); 执行显式类型转换。) 并非所有形式参数都必须赋值。必须赋值的形式参数类型可参见下表: 参数类型EDTSTRINGARRAYANY_ARRAYIODDTSTRUCTFBANYEFB:VAR_IN_OUT+/+EFB:Output-+-/+DFB:Input-/-/-DFB:VAR_IN_OUT+/+DFB:Output-+/-/+ 需要实际参数- 不需要实际参数/ 不适用如果没有为形式参数赋值,则会使用初始值执行功能块。如果尚未定义初始值,则使用缺省值 (0

56、)。 如果形式参数未被赋值,并且功能块/DFB 被多次实例化,则后续实例将以旧值运行。 公共变量 除输入和输出外,某些功能块还具有公共变量。 这些变量向功能块传输统计值(不受过程影响的值)。这些值用于设置功能块的参数。 公共变量是对 IEC 61131-3 的补充。 对公共变量的赋值是通过设置初始值或使用赋值操作来进行的。 示例: 公共变量是通过功能块的实例名称和公共变量的名称来读取的。 示例: 私有变量 除输入、输出和公共变量外,某些功能块还提供了私有变量。 与公共变量类似,私有变量用于将统计值(不受过程影响的值)传输给功能块。 用户程序不能访问私有变量。只有动态数据表才能访问此类型的这些变量。 注意: 嵌套

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论