施耐德Unity_Pro结构化文本(ST)
结构化文本(ST)
目录
结构化文本(ST) (1)
概述 (2)
一.结构化文本ST简介 (3)
1.结构化文本ST简介 (3)
2.操作数 (4)
3.操作符 (5)
二.指令 (10)
1.指令 (10)
2.赋值 (10)
3.选择指令IF...THEN...END_IF . (11)
4.选择指令ELSE (12)
5.选择指令ELSE...THEN.. (13)
6.选择指令CASE...OF...END_CASE. (13)
7.重复指令FOR...TO...BY...DO...END_FOR . (14)
8.重复指令WHILE...DO...END_WHILE . (15)
9.重复指令REPEAT...UNTIL...EN D_REPEAT .. (16)
10.重复指令 (16)
11. 子程序调用 (17)
12. RETURN (17)
13. 空指令 (17)
14. 标签和跳转 (18)
15. 注释 (18)
三.调用基本功能、基本功能块、导出的功能块和过程 (19)
1. 调用基本功能 (19)
2.调用基本功能块和导出的功能块基本功能块 (23)
3.过程 (29)
概述
本章介绍符合 IEC 61131 的编程语言结构化文本 ST。
本章包含了哪些内容?
本章包含了以下部分:
结构化文本 ST 简介
指令
调用基本功能、基本功能块、导出的功能块和过程
一.结构化文本ST简介
概述
本节包含结构化文本 ST 的概述。
本节包含了哪些内容?
本节包含了以下主题:
结构化文本 ST 简介
操作数
操作符
1.结构化文本ST简介
简介
使用结构化文本 (ST) 的编程语言,可以执行多种操作,例如调用功能块、执行功能和赋值、有条件地执行指令和重复任务。
表达式
ST 编程语言使用\"表达式\"。
表达式是由操作符和操作数组成的结构,在执行表达式时会返回值。
操作符
操作符是表示要执行的操作的符号。
操作数
操作符供操作数使用。操作数为变量、数值、FFB 输入/输出等。
说明
指令用于将表达式返回的值赋给实际参数,并构造和控制表达式。
ST 段的表示形式
ST 段的表示形式:
段大小
指令行的长度不应超过 300 个字符。
ST 段的长度在编程环境中没有限制。ST 段的长度仅受 PLC 存储器大小的限制。
语法
标识符和关键字不区分大小写。
例外:不允许使用空格和制表符
关键字
数值
值
标识符
变量和
限制符组合 [例如用于注释的 (*]
执行顺序
计算表达式时将根据操作符的优先级所定义的顺序将操作符应用于操作数(请参见操作符表)。
首先执行表达式中具有最高优先级的操作符,接着执行具有次优先级的操作符,依此类推,直到完成整个计算过程。优先级相同的操作符将根据它们在表达式中的书写顺序从左至右执行。可使用括号更改此顺序。
例如,如果 A、B、C 和D 的值分别为 1、2、3 和 4,并按以下方式计算:
A+B-C*D
结果则为 -9。
在下面的计算中:
(A+B-C)*D
结果则为 0。
如果操作符包含两个操作数,则先执行左边的操作数,例如在表达式
SIN(A)*COS(B)
中,先计算表达式 SIN(A),后计算 COS(B),然后计算它们的乘积。
错误行为
下面的情况在执行表达式时作为错误处理:
尝试除以 0。
操作数包含的数据类型不适合对应的运算。
数字运算的结果超出了其数据类型的值范围。
如果执行运算的过程中出现错误,则会设置相应的系统位 (%S)(如果使用的 PLC 支持这一设置)。
IEC 遵从性
有关针对 ST 编程语言的 IEC 遵从性的描述,请参见IEC 遵从性。
2.操作数
简介
操作数可以是:
地址
数值
变量
多元素变量
多元素变量的元素
功能调用
FFB 输出
数据类型
处理操作数的指令中的数据类型必须相同。如果需要处理不同类型的操作数,则必须预先执行类型转换。
在下面的示例中,整数变量 i1 在添加到实数变量 r4 中之前会先转换为实数变量。
r3 := r4 + SIN(INT_TO_REAL(i1)) ;
此规则的例外情况是,数据类型为 TIME 的变量可乘以或除以数据类型为 INT、DINT、UINT 或UDINT 的变量。
允许的运算:
timeVar1 := timeVar2 / dintVar1;
timeVar1 := timeVar2 * intVar1;
timeVar := 10 * time#10s;
此功能由 IEC 61131-3 作为\"不希望\"的服务列出。
直接使用地址
地址可直接使用(无需事先声明)。在本例中,地址数据类型是直接分配的。该数据类型的分配通过使用\"大前缀\"进行。
要将其他数据类型指定为地址的缺省数据类型,必须通过显式声明进行。使用变量编辑器可方便地完成变量的声明。地址的数据类型不能在 ST 段中直接声明(例如,不允许声明 AT %MW1:UINT)。
例如,在变量编辑器中声明以下变量:
UnlocV1: ARRAY [1..10] OF INT;
LocV1: ARRAY [1..10] OF INT AT %MW100;
LocV2: TIME AT %MW100;
下面的调用具有正确的语法:
%MW200 := 5;
UnlocV1[2] := LocV1[%MW200];
LocV2 := t#3s;
访问字段变量
访问字段变量 (ARRAY) 时,只有数值和数据类型为 INT、UINT、的变量才允许用于索引项。
如果范围的阈值下限为负数,则 ARRAY 元素的索引也可为负数。示例:使用字段变量
var1[i] := 8 ;
var2.otto[4] := var3 ;
以及 UDINT DINT
var4[1+i+j*5] := 4 ;
3.操作符
简介
操作符是一种符号,它表示:
要执行的算术运算,或
要执行的逻辑运算
功能编辑(调用)
操作符是泛型的,即,它们自动适应操作数的数据类型。操作符表
操作符根据优先级按顺序执行,另请参见执行顺序。
二.指令
概述
本节描述结构化文本ST 编程语言的指令。
本节包含了哪些内容?
本节包含了以下主题:
指令
赋值
选择指令 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
空指令
标签和跳转
注释
1.指令
描述
指令是 ST 编程语言的\"命令\"。
指令必须以分号结尾。
一行中可以有多个指令(由分号分隔)。
单个分号表示空指令。
2.赋值
简介
执行赋值时,单元素或多元素变量的当前值会替换为表达式的计算结果。
赋值表达式的结构为:左边是变量名称,之后是赋值操作符 :=,然后是要求值的表达式。
两个变量(分别位于赋值操作符的左侧和右侧)的数据类型必须相同。
数组是个特例。显式启用后,也可对长度不同的两个数组执行赋值操作。
将一个变量的值赋给另一个变量
赋值用于将一个变量的值赋给另一个变量。
例如,指令
A :=
B ;
用于将变量 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。
例如,指令
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 变量之间的赋值
数组和 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.选择指令IF…THEN…END_IF
描述
IF 指令只有确定其相关布尔表达式的值为 1(真)时,才会执行指令或一组指令。如果条件为 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 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(假)时,才会执行该指令或指令组。如果 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.选择指令ELSE…THEN
描述
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:=SUB(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.选择指令CASE…OF…END_CASE
描述
CASE 指令包含一个 INT 数据类型的表达式(选择器)和一个指令组列表。每组都具有一个包含一个或多个整数(INT、DINT、UINT 或 UDINT)或整数值范围的标签。将
执行的指令为其标签中包含选择器计算出的值的第一组指令。否则,将不执行任何标签对应的指令。
OF 指令指示标签的开头。
所有标签都不包含选择器的值时,才会在 CASE 指令内执行 ELSE 指令。
END_CASE 指令标记指令的结尾。
示例 CASE...OF...END_CASE
示例 CASE...OF...END_CASE
另请参见
ELSE
7.重复指令FOR…TO…BY…DO…END_FOR
描述
FOR 指令用于在发生次数可预先确定的情况下。否则可使用WHILE或REPEAT。
FOR 指令会重复执行指令序列,直到遇到 END_FOR 指令为止。发生次数由起始值、结束值和控制变量决定。
控制变量、起始值和结束值必须具有相同的数据类型(DINT 或INT)。
控制变量、起始值和结束值可由重复指令进行更改。这是对 IEC 61131-3 的补充。
FOR 指令以控制变量值为步幅递增起始值,直到达到结束值。增量值的缺省值为 1。如果要使用其他值,则可以指定显式增量值(变量或常量)。每个新的循环之前都要检查控制变量值。如果它位于起始值和结束值的范围之外,则将离开循环。
首次运行循环之前,会进行检查以确定从初始值开始的控制变量递增是否是朝着结束值的方向。
如果不是(例如,起始值≤ 结束值并且增量为负值),则不会对循环进行处理。控制变量值不是在循环外定义的。
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 < 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 > 0,将执行指令。
如果 j < 0,将不会执行指令,因为条件初始值 < 仅允许结束值的增量≥ 0。
如果 j = 0,将执行指令并且会创建一个无限循环,因为增量为 0 时永远都不会达到结束值。
FOR i:= 1 TO 10 BY j DO
C:= C * COS(B) ;
END_FOR ;
8.重复指令WHILE…DO…END_WHILE
说明
WHILE 指令可使一个指令序列重复执行,直到其相关布尔表达式为 0(假)。如果从一开始该表达式就为假,则根本不会执行该指令组。
DO 指令标识重复定义的结尾和指令的开头。
可以使用EXIT提前终止循环。
END_WHILE 指令标记指令的结尾。
下列情况下不应使用 WHILE,因为它可能导致无限循环,从而造成程序崩溃:
WHILE 不能用于过程之间的同步,例如,不能用作具有外部定义的结束条件的“等待循环”。
WHILE 不能用在算法中,因为无法确保完成循环结束条件或执行 EXIT 指令。
示例 WHILE...DO...END_WHILE
x := 1; WHILE x <= 100 DO x := x + 4; END_WHILE ;
另请参见
EXIT
9.重复指令REPEAT…UNTIL…END_REPEAT
描述
REPEAT 指令可使一个指令序列重复执行(至少执行一次),直到相关布尔条件为 1(真)。
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.重复指令
描述
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 := SUM + J ;
END_FOR ;
SUM := SUM + I ;
END_FOR
另请参见
CASE
WHILE
REPEAT
11. 子程序调用
子程序调用
子程序调用由子程序段名称后跟空参数列表组成。
子程序调用不返回值。
待调用的子程序必须与调用的 ST 段位于同一任务中。
也可以从子程序中调用子程序。
例如:
SubroutineName () ;
子程序调用是对 IEC 61131-3 的补充,且必须显式启用。
在 SFC 动作段中,仅当启用了多令牌操作时才允许子程序调用。
12. RETURN
描述
RETURN 指令可用于 DFB(导出功能块)和 SR(子程序)中。
RETURN 指令不可用于主程序中。
在 DFB 中,RETURN 指令强制返回称为 DFB 的程序。
不执行包含 RETURN 指令的剩余 DFB 段。
也不执行 DFB 的下一段。
从 DFB 返回后,将执行称为 DFB 的程序
如果另一个 DFB 调用了此 DFB,将在返回后执行调用 DFB。
在 SR 中,RETURN 指令强制返回称为 SR 的程序。
不执行包含 RETURN 指令的剩余 SR。
从 SR 返回后,将执行称为 SR 的程序。
13. 空指令
描述
单个分号 ; 表示空指令。
例如:
IF x THEN ; ELSE ..
在此示例中,THEN 指令后面就跟着一个空指令。这意味着,只要 IF 条件为 1,程序就会立即退出 IF 指令。
14. 标签和跳转
简介
标签用作跳转的目标。
ST 中的跳转和标签是对 IEC 61131-3 的补充,且必须显式启用。
标签属性
标签属性:
标签必须始终是行中的第一个元素。
标签只能出现在第一级指令前(不能在循环中)。
其名称在整个目录中都必须明确,并且不区分大小写。
标签必须符合一般命名约定。
标签用冒号 :与后面的指令分隔。
跳转属性
跳转属性
可在程序和 DFB 段中进行跳转。
只能在当前段中进行跳转。
示例
IF var1 THEN JMP START; ::START: ...
15. 注释
描述
在 ST 编辑器中,注释总是以字符串 (* 开始,以字符串 *) 结束。在这两个字符串之间可以输入任何注释。可在 ST 编辑器的任何位置输入注释,但不能在关键字、数值、标识符和变量中输入注释。
IEC 61131-3 不允许嵌套注释。如果已经嵌套了注释,则必须显式启用。
三.调用基本功能、基本功能块、导出的功能块和过程
概述
使用 ST 编程语言调用基本功能、基本功能块、导出的功能块和过程。
本节包含了哪些内容?
本节包含了以下主题:
调用基本功能
调用基本功能块和导出的功能块
过程
1. 调用基本功能
基本功能
基本功能以库的形式提供。功能的逻辑是使用编程语言 C 创建的,不能在 ST 编辑器中进行修改。
功能没有内部状态。如果输入值相同,则每次执行该功能后输出的值都相同。例如,每次执行两个值相加后都能得到相同的结果。
有些基本功能可扩展为具有 2 个以上的输入。
基本功能只具有一个返回值(输出)。
参数
将值传入或传出功能需要“输入”和一个“输出”。这些输入/输出称为形式参数。
当前过程状态传递给形式参数。这些参数称为实际参数。
以下各项可用作功能输入的实际参数:
变量
地址
数值
ST 表达式
以下各项可用作功能输出的实际参数:
变量
地址
实际参数的数据类型必须与形式参数的数据类型匹配。唯一的例外是泛型形式参数,其数据类型由实际参数决定。
处理泛型ANY_BIT形式参数时,可使用数据类型为INT或DINT(不是UINT和UDINT)的实际参数。
这是对 IEC 61131-3 的补充,且必须显式启用。
示例:
允许:
AND (AnyBitParam := IntVar1, AnyBitParam2 := IntVar2);
因篇幅问题不能全部显示,请点此查看更多更全内容