施耐德UnityPro结构化文本ST.docx
《施耐德UnityPro结构化文本ST.docx》由会员分享,可在线阅读,更多相关《施耐德UnityPro结构化文本ST.docx(56页珍藏版)》请在冰豆网上搜索。
施耐德UnityPro结构化文本ST
结构化文本(ST)
概述
本章介绍符合IEC61131的编程语言结构化文本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;
此功能由IEC61131-3作为"不希望"的服务列出。
直接使用地址
地址可直接使用(无需事先声明)。
在本例中,地址数据类型是直接分配的。
该数据类型的分配通过使用"大前缀"进行。
下表列出了不同的大前缀:
大前缀/符号
示例
数据类型
无前缀
%I10、%CH203.MOD、%CH203.MOD.ERR
BOOL
X
%MX20
BOOL
B
%QB102.3
BYTE
W
%KW43
INT
D
%QD100
DINT
F
%MF100
REAL
使用其他数据类型
要将其他数据类型指定为地址的缺省数据类型,必须通过显式声明进行。
使用变量编辑器可方便地完成变量的声明。
地址的数据类型不能在ST段中直接声明(例如,不允许声明AT%MW1:
UINT)。
例如,在变量编辑器中声明以下变量:
UnlocV1:
ARRAY[1..10]OFINT;
LocV1:
ARRAY[1..10]OFINTAT%MW100;
LocV2:
TIMEAT%MW100;
下面的调用具有正确的语法:
%MW200:
=5;
UnlocV1[2]:
=LocV1[%MW200];
LocV2:
=t#3s;
访问字段变量
访问字段变量(ARRAY)时,只有数值和数据类型为INT、UINT、DINT以及UDINT的变量才允许用于索引项。
如果范围的阈值下限为负数,则ARRAY元素的索引也可为负数。
示例:
使用字段变量
var1[i]:
=8;
var2.otto[4]:
=var3;
var4[1+i+j*5]:
=4;
3.操作符
简介
操作符是一种符号,它表示:
∙要执行的算术运算,或
∙要执行的逻辑运算
∙功能编辑(调用)
操作符是泛型的,即,它们自动适应操作数的数据类型。
操作符表
操作符根据优先级按顺序执行,另请参见执行顺序。
ST编程语言操作符表:
操作符
含义
优先级
适用的操作数
描述
()
使用括号:
1(最高)
表达式
括号用于改变操作符的执行顺序。
示例:
如果操作数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运算时,操作数将逐位反转。
示例:
本示例中,如果IN1为1100110011,则OUT为0011001100。
OUT:
=NOTIN1;
**
幂
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的表达式、数值、变量或地址
乘法(*)运算时,将用第一个操作数的值乘以第二个操作数(指数)的值。
示例:
该示例中,如果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的除法。
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:
=IN1MODIN2;
+
加法
6
数据类型为INT、DINT、UINT、UDINT、REAL或TIME的表达式、数值、变量或地址
加法(+)运算时,将用第一个操作数的值加上第二个操作数的值。
示例:
本示例中
如果IN1为7,IN2为2,则OUT为9
OUT:
=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、REAL、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的表达式、数值、变量或地址
使用>将第一个操作数的值与第二个操作数的值进行比较。
如果第一个操作数的值大于第二个操作数的值,则结果为布尔值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的表达式、数值、变量或地址
使用<=将第一个操作数的值与第二个操作数的值进行比较。
如果第一个操作数的值小于或等于第二个操作数的值,则结果为布尔值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。
如果第一个操作数的值小于第二个操作数的值,则结果为布尔值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,则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;
&
逻辑与
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和IN3均为1,则OUT为1。
OUT:
=IN1ANDIN2ANDIN3;
XOR
逻辑异或
10
数据类型为BOOL、BYTE、WORD或DWORD的表达式、数值、变量或地址
对于XOR,操作数之间存在逻辑异或关联。
对于BYTE、WORD和DWORD数据类型,此关联是逐位进行的。
示例:
本示例中,如果IN1和IN2不相等,则OUT为1。
如果A和B的状态相同(均为0或均为1),则D为0。
OUT:
=IN1XORIN2;
如果将两个以上的操作数进行关联,当状态为1的操作数个数不是偶数时结果为1,而当状态为1的操作数个数是偶数时结果为0。
示例:
本示例中,如果有1个或3个操作数为1,则OUT为1,如果有0、2或4个操作数为1,则OUT为0。
OUT:
=IN1XORIN2XORIN3XORIN4;
OR
逻辑或
11(最低)
数据类型为BOOL、BYTE、WORD或DWORD的表达式、数值、变量或地址
对于OR,操作数之间存在逻辑或关联。
对于BYTE、WORD和DWORD数据类型,此关联是逐位进行的。
示例:
本示例中,如果IN1、IN2或IN3为1,则OUT为1。
OUT:
=IN1ORIN2ORIN3;
二.指令
概述
本节描述结构化文本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。
(这不是功能块调用)
多重赋值
多重赋值是对IEC61131-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,则不会执行。
IFFLAGTHEN
C:
=SIN(A)*COS(B);
B:
=C-A;
END_IF;
该条件可使用返回布尔结果的操作表达。
如果A大于B,将会执行指令;如果A小于或等于B,则不会执行。
IFA>BTHEN
C:
=SIN(A)*COS(B);
B:
=C-A;
END_IF;
示例IFNOT...THEN...END_IF
该条件可使用NOT反转(为0时执行这两个指令)。
IFNOTFLAGTHEN
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
IFA>BTHEN
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
IFA>BTHEN
C:
=SIN(A)*COS(B);
B:
=SUB(C,A);
ELSIFA=BTHEN
C:
=ADD(A,B);
B:
=MUL(C,A);
END_IF;
例如嵌套指令
IFA>BTHEN
IFB=CTHEN
C:
=SIN(A)*COS(B);
ELSE
B:
=SUB(C,A);
END_IF;
ELSIFA=BTHEN
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指令指示标签的开头。
所有标签都不包含选择器的值时,才会在