结构化文本语言(ST)
ST是结构化文本(Structured Text)的简称,是一种文本化的编程语言。
ST编辑器视图如下图所示,由两部分组成:变量声明编辑器及程序逻辑编辑器组成,变量声明编辑器的具体操作参见全局变量详细描述,程序逻辑编辑器描述参见本章节。
ST的程序代码由表达式和语句组合组成。您必须以分号 ; 结束每条语句。
ST表达式
ST 语言中的表达式由运算符和操作数组成。操作数可以是常量、变量、函数调用或另一个表达式。表达式的计算通过执行具有不同优先级的运算符完成。有最高优先级的运算符 先被执行,然后依次执行下一个优先级的运算符,直到所有的运算符被处理完。相同优先级的运算符按从左到右的顺序执行。ST语言运算符如下表所示。
运算 | 符号 | 举例 | 优先级 |
---|---|---|---|
括号 | ( 表达式 ) | (A+B)/C | 10(最高) |
函数调用 | 函数名/功能块实例 ( 参数列表 ) | LN(real1), MAX(a,b), fb_inst(in1:=a); | 9 |
取值 | ^ | pt_int^ | 8 |
求反 | - | -A, - A | 7 |
一元加 | + | +A, + A | 7 |
取补 | NOT | NOT C | 7 |
乘 | * | A*B, A * B | 6 |
除 | / | A/B, A / B / C | 6 |
取余 | MOD | A MOD B | 6 |
加 | + | A+B, A + B + C | 5 |
减 | - | A-B, A - B - C | 5 |
比较 | <, >, <=, >= | A < B, A >= B | 4 |
相等 | = | A = B | 4 |
不等 | <> | A <> B | 4 |
布尔与 | & AND | A&B, A & B, A & B & C A AND B | 3 |
布尔异或 | XOR | A XOR B | 2 |
布尔或 | OR | A OR B | 1(最低) |
ST语句
ST语言的语句如下表所示。
编号 | 描述 | 举例 |
---|---|---|
1 | 赋值语句 variable := expression | |
1a | 变量与基础数据类型表达式赋值 | A := B; CV := CV + 1; C := SIN(X); |
1b | 基础数据类型不同的变量与表达式赋值,根据表XXX进行隐式转换 | A_Real := B_Int; |
1c | 变量与自定义类型表达式赋值 | A_Sstruct1 := B_Struct1; C_Array1 := D_Array1; |
1d | 功能块实例赋值 | A_Instance1 := B_Instance1; |
2 | 调用 | |
2a | 函数调用 | FCT(17); |
2b | 功能块调用及输出变量用法 | CMD_TMR( IN := bIn1, PT := T#300ms, Q => bOut1); |
3 | 返回 | RETURN; |
选择 | ||
4 | IF ... THEN ... ELSIF ... THEN ... ELSE ...END_IF | D:= BB – 4.0AC; IF D < 0.0 THEN NROOTS:= 0; ELSIF D = 0.0 THEN NROOTS:= 1; X1:= - B/(2.0A); ELSE NROOTS:= 2; X1:= (- B + SQRT(D))/(2.0A); X2:= (- B - SQRT(D))/(2.0A); END_IF; |
5 | CASE ... OF ... ELSE ... END_CASE | TW:= WORD_BCD_TO_INT(THUMBWHEEL); TW_ERROR:= 0; CASE TW OF 1,5: DISPLAY:= OVEN_TEMP; 2: DISPLAY:= MOTOR_SPEED; 3: DISPLAY:= GROSS - TARE; 4,6..10: DISPLAY:= STATUS(TW - 4); ELSE DISPLAY := 0; TW_ERROR:= 1; END_CASE; QW100:= INT_TO_BCD(DISPLAY); |
循环 | ||
6 | FOR ... TO ... BY ... DO ... END_FOR | J:= 101; FOR I:= 1 TO 100 BY 2 DO IF WORDS[I] = 'KEY' THEN J:= I; EXIT; END_IF; END_FOR; |
7 | WHILE ... DO ... END_WHILE | J:= 1; WHILE J <= 100 & WORDS[J] <> 'KEY' DO J:= J+2; END_WHILE; |
8 | REPEAT ... UNTIL ... END_REPEAT | J:= -1; REPEAT J:= J+2; UNTIL J = 101 OR WORDS[J] = 'KEY' END_REPEAT; |
9 | CONTINUE | J:= 1; WHILE (J <= 100 AND WORDS[J] <> 'KEY') DO IF (J MOD 3 = 0) THEN CONTINUE; END_IF; (* if j=1,2,4,5,7,8, ... then this statement*); ... END_WHILE; |
10 | EXIT 退出循环 | 参见本表格序号6示例 |
11 | 空语句 | ; |
赋值语句
赋值语句将表达式的求值结果赋值给单个或多个元素变量。赋值语句应该包括:左侧的变量引用,接着是赋值操作符“:=”,后面是要求值的表达式。
例如,语句 A := B,如果两者都属于类型INT或者变量B可以隐式转换为INT,那么该语句用变量B的当前值替代变量A的值。
如果A和B是多元素变量(结构体,数组,功能块),A和B应该具有相同的数据类型。这种情况下,变量A的元素的由变量B中元素的值替代。
比较
比较语句返回一个布尔类型的值。一个比较语句应包括:左侧的变量引用,接着是比较操作符,其后是右边的变量引用。比较表达式 A = B,如果A和B属于相同的数据类型或者一个变量的类型可以隐式转化为另一个类型的值,那么该语句用来比较变量A和变量B的数值。
返回值
赋值语句还可被用来给函数的返回值赋值。如果一个程序组织单元(POU)定义了一个返回值,那么至少有一个赋值语句赋值给该POU名。返回值应该是最近赋值操作运算的结果。
调用
调用包含函数(包含PRG类型POU)及功能块的调用。
- 函数:函数应通过语句调用,该语句由POU名称和跟随其后的带括号的参数表组成,如ST语句列表中所示。
- 功能块:功能块应通过语句调用,同时需要定义功能块的实例变量,该语句由功能块实例名称和跟随其后带括号的参数表组成,如ST语句表中所示。
- 返回:函数及功能块调用应支持RETURN语句的提前退出功能。
选择语句(IF, CASE)
选择语句包括IF语句和CASE语句。选择语句基于所规定的条件,选择其组成员语句之一(或一组)来执行。
IF语句
IF语句规定,仅当相关的布尔表达式求值为TRUE时,才会执行一组语句,如果条件为FALSE时,(1)将执行ELSE关键字或ELSIF关键字(若其相关布尔条件为真)的语句组,(2)如果后面没有ELSE和ELSIF语句,则没有语句会被执行。
CASE语句
CASE语句由一个对基本数据类型(选择符)变量求值的表达式和一个语句列表组成。每组都可应用一个或多个直接数据值、枚举值或子范围值来标记。这些标记的数据类型应该与选择符变量的数据类型匹配,选择符号变量的值应该可以和标号进行比较运算。
对于CASE的语句列表,其范围之一包含选择符的计算值,即执行改组逻辑,如果选择符的计算值不满足CASE语句列表的任何一个条件时,将执行ELSE关键字的语句序列。如果没有ELSE分支则不执行任何逻辑。
迭代语句(WHILE,REPEAT,EXIT,CONTINUE,FOR)
迭代语句将按照条件重复的执行相关语句组。
如何可以事先确定循环次数则建议您使用FOR语句,否则请使用WHILE或REPEAT结构。
FOR语句
FOR语句将FOR与END_FOR关键字之间的语句序列循环执行。循环次数由起始值、结束值和步进表达式决定。
FOR语句将控制变量从起始值向上或向下增加至结束值,其增量由步进表达式决定,如果省略BY结构,则增量默认为1.
示例:FOR i := 3 TO 1 BY -1 DO ...; //当变量i的值为0时终止。
终止条件在每次循环前进行检查,当控制变量超过结束值(当步进为正时控制变量大于结束值,步进为负时控制变量小于结束值),结束循环,否则执行一次循环体语句序列。
WHILE语句
WHILE语句将WHILE与END_WHILE关键字之间的语句序列循环执行。循环次数由条件表达式决定,条件为FALSE时结束循环。
WHILE循环直到条件表达式为FALSE时,将结束循环,否则将执行WHILE语句序列。如果条件表达式初始为FALSE时,那么将不会执行任何逻辑。
REPEAT语句
REPEAT语句将REPEAT与UNTIL关键字之间的语句序列循环执行,至少会执行一次。循环次数由条件表达式决定,条件为TRUE时结束循环。
REPEAT循环直到UNTIL条件表达式为TRUE时,将结束循环,否则将执行REPEAT语句序列。
CONTINUE语句
CONTINUE语句用来跳过本次循环中CONTINUE之后语句,直接返回循环条件判断语句。
EXIT语句
EXIT语句用来提前终止循环,执行后将跳出循环,执行循环语句之后的逻辑。
ST编辑器介绍
ST编辑器的界面如下图所示,AnyControl软件文件编辑器均使用相同的设计风格,IL编辑器的操作与ST完全类似,仅在语言语法方面有所区别。
左侧区域为行号区,显示ST逻辑的行号,设置的断点信息,以及单步调试状态下运行位置信息。
右侧区域为程序编辑区。
离线编辑
文本编辑器支持常规的文本编辑操作,包括文本输入、删除、撤销、重做、复制、粘贴等基本功能,同时支持IEC语法着色,关键字高亮,代码折叠等功能。系统支持了完备的辅助编程系统,包括代码段自动完成,变量及POU名智能感知及自动完成,复杂类型变量成员智能感知及自动完成功能。如上图中展示了代码段自动完成的功能。
智能感知列表弹出后您可以通过上下键或鼠标点击选择需要的元素,选择后选择元素将自动补全到逻辑编写区,大大提高了编辑的效率,减小了出错的概率。
在逻辑编辑区右键菜单中,还提供了常用功能的快捷入口,您可以通过右键菜单转到变量或POU定义处、查看变量交叉引用信息,将变量发送到监视列表等。
输入逻辑过程中支持变量自动声明功能,同时系统会尽可能智能识别变量类型,提高您编程的便捷性。
在线模式
当PLC设备处于在线状态后,ST逻辑编辑器也将进入在线模式。
在线模式下,系统将在每一行逻辑下面增加在线值查看行,将本行逻辑中使用的变量名及其在线值罗列出来,方便您查看变量的运行状态。
上图中展示了断点调试单步调试状态,行号区域显示了当前执行位置为逻辑第57行,同时该行高亮,方便用户进行单步调试功能。
双击逻辑中的变量区域,可以弹出变量调试对话框,您可以在线写入值来对程序进行调试及控制。
退出在线后,编辑区将恢复离线编辑模式。