指令说明使用给定表达式执行何种操作。
在 ST 中可使用以下指令:
指令 |
示例 |
---|---|
A:=B; CV := CV + 1; C:=SIN(X); |
|
调用功能块并使用功能块输出 |
CMD_TMR(IN := %IX5, PT := 300); |
RETURN; |
|
D:=B*B; |
|
CASE INT1 OF |
|
J:=101; |
|
J:=1; |
|
J:=-1; |
|
EXIT; |
|
CONTINUE; |
|
label1: i:=i+1; |
|
空指令 |
; |
缺省赋值
在赋值左侧,有一个操作数(变量、地址),该操作数上分配有右侧表达式的值,该值由赋值操作符 := 分配。
另请参阅具有相同功能的 MOVE 操作符的说明。
有关赋值示例,请参阅调用功能块章节的通过赋值调用的示例文段。
示例
a:= b;
a 获取 b 的值。
设置操作符 S=
将设置值:如果将其设置为“真”,将保持为“真”。
示例
a S= b;
如果在处理赋值时 b 为“真”,则 a 设置为“真”。
如果在处理赋值时 b 为“假”,则不会修改 a 的值。
复位操作符 R=
将复位值:如果将其设置为“假”,将保持为“假”。
示例
a R= b;
一旦 a 为“真”,b 将设置为“假”。
注意: 如果有多个赋值,置位和复位赋值将参考赋值的最后成员。
示例
a S= b R= fun1(par1,par2)
该情况下,b 将为 fun1 的复位输出值。但是 a 不会获得 b 的设置值,然而会获得 fun1 的置位输出值。
注意赋值可作为表达式使用。这是对于 IEC 61131-3 标准的扩展。
赋值操作符 REF
此操作符生成对值的引用。
语法
REF= <variable>
示例
A : REFERENCE TO DUT;
B : DUT;
C : DUT;
A REF= B; // corresponds to A := ADR(B);
A := C; // corresponds to A^ := C;
根据以下语法以结构化文本调用功能块(缩写为 FB):
<FB 实例名称>(FB 输入变量:=<值或地址>|、<其他 FB 输入变量:=<值或地址>|...其他 FB 输入变量);
示例
在以下示例中,将调用计时器功能块 (TON),其中有对参数 IN 和 PT 的赋值。然后将结果变量 Q 分配至变量 A。定时器功能块通过 TMR:TON; ; 实例化。结果变量和在 IL 中一样,根据语法 <FB 实例名称> 寻址。<FB 变量>:
TMR(IN := %IX5, PT := 300);
A:=TMR.Q;
还有另外一种语法可用于输出:
fb(in1:=myvar, out1=>myvar2);
您可使用 RETURN 指令来离开 POU。
语法
RETURN;
示例
IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;
如果 b 为“真”,将不会执行指令 a:=a+1;。因此,将立即离开 POU。
使用 IF 指令,您可测试条件,并根据该条件执行指令。
语法
IF <boolean_expression1> THEN
<IF_instructions>
{ELSIF <boolean_expression2> THEN
<ELSIF_instructions1>
..
..
ELSIF <boolean_expression n> THEN
<ELSIF_instructions-1>
ELSE
<ELSE_instructions>}
END_IF;
括号 {} 中的段为可选。
如果 <布尔表达式 1> 返回“真”,则仅会执行 <IF_指令>,因此,不会执行其他指令。否则,将逐个计算以 <布尔表达式 2> 开头的布尔表达式,直到其中一个表达式返回“真”。然后,将仅计算该布尔表达式后以及下个 ELSE 或 ELSIF 之前的那些指令。如果这些布尔表达式中没有一个生成“真”,则仅会计算 <ELSE_指令>。
示例
IF temp<17
THEN heating_on := TRUE;
ELSE heating_on := FALSE;
END_IF;
在此,会在温度低于 17 度时,将加热开启。否则,加热会处于关闭状态。
借助 CASE 指令,您可将数个条件指令与结构中的相同条件变量组合。
语法
CASE <Var1> OF
<value1>: <instruction 1>
<value2>: <instruction 2>
<value3, value4, value5>: <instruction 3>
<value6..value10>: <instruction4>
..
..
<value n>: <instruction n>
ELSE <ELSE instruction>
END_CASE;
根据以下模型处理 CASE 指令:
o如果 <Var1> 中的变量具有值 <值 I>,则将执行指令 <指令 I>。
o如果 <Var 1> 没有指示的值,则将执行 <ELSE 指令>。
o如果要为变量的数个值执行相同指令,则可以逗号分隔将这些值逐个写入,并由此确定共同执行的条件。
o如果要对变量一定范围内的值执行同一指令,可以写入 2 点分隔的初始值和末尾值。因此,可确定共用条件。
示例
CASE INT1 OF
1, 5: BOOL1 := TRUE;
BOOL3 := FALSE;
2: BOOL2 := FALSE;
BOOL3 := TRUE;
10..20: BOOL1 := TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;
借助 FOR 循环,您可对重复流程进行编程。
语法
INT_Var:INT;
FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <step size>} DO
<instructions>
END_FOR;
括号 {} 中的段为可选。
只要计数器 <INT_Var> 不大于 <末尾值>,就会执行 <指令>。在执行 <指令> 之前会对此进行检查,从而如果 <初始值> 大于 <末尾值>,将不会执行 <指令>。
在执行 <指令> 时,<INT_Var> 将按 <步长> 增加。步长可具有任何整数值。如果缺失该值,将把它设置为 1。该循环将在 <INT_Var> 大于 <末尾值> 时终止。
示例
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR;
Erg:=Var1;
假定Var1 的默认设置为 1。则在 FOR 循环后,它将具有值 32。
注意: 如果 <末尾值> 等于数据类型 <INT 变量> 的限制值(上面示例中的计数器),将生成无限或无穷循环。如果计数器类型为 SINT,而 <末尾值> 为 127(SINT 类型变量的最大正数值),则循环永远无法终止,这是因为向该最大值增加 1 会导致变量变为负,从而永远不会超出 FOR 指令施加的限值。
|
无穷循环会导致意外设备操作 |
确保 FOR 指令中使用的变量类型有足够容量(具有足够大的上限)来容纳 <末尾值> + 1。 |
不遵循上述说明可能导致人员伤亡或设备损坏。 |
您可在 CONTINUE 循环中使用 FOR 指令。这是对于 IEC 61131-3 标准的扩展。
对于 FOR 循环的备选项为 WHILE 循环,后者只要在布尔条件保持为“真”时就会执行 if 和 for 循环。如果条件最初并非为“真”,则不会执行循环。如果条件最初为“真”,现在变为“假”,则循环会终止。
语法
WHILE <boolean expression> DO
<instructions>
END_WHILE;
很明显,初始和当前布尔表达式必须在循环指令内的某些点设置值“假”。否则,循环将不会终止,导致无限、无穷循环条件。
|
无穷循环会导致意外设备操作 |
通过创建布尔表达式的“假”条件,确保 WHILE 循环将在循环指令中终止。 |
不遵循上述说明可能导致人员伤亡或设备损坏。 |
以下是循环中导致循环终止的指令的示例:
WHILE Counter>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
尚未引入 REPEAT 指令,因此移动段(带修改)至下面。
您可在 CONTINUE 循环中使用 WHILE 指令。
REPEAT 循环是 FOR 循环的另一种备选方法,也是 WHILE 循环的备选方法。REPEAT 循环与 WHILE 循环块的不同之处在于,前者仅在循环至少执行一次后才计算循环末尾的退出条件。
语法
REPEAT
<instructions>
UNTIL <boolean expression>
END_REPEAT;
只要 <布尔表达式> 返回“真”,就会反复执行 <指令>如果 <布尔表达式> 已经在第一个 UNTIL 计算生成,则只会将 <instructions> 执行一次。<布尔表达式> 必须在循环指令内的某些点设置值“真”。否则,循环将不会终止,导致无限、无穷循环条件。
|
无穷循环会导致意外设备操作 |
通过创建布尔表达式的“真”条件,确保 REPEAT 循环将在循环指令中终止。 |
不遵循上述说明可能导致人员伤亡或设备损坏。 |
以下是循环中导致循环终止的指令的示例:
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter=0
END_REPEAT;
您可在 CONTINUE 循环中使用 REPEAT 指令。这是对于 IEC 61131-3 标准的扩展。
WHILE 和 REPEAT 循环在某种意义上比 FOR 循环更强大,因为您在执行循环前无法知道循环的数目。因此,在某些情况下,您将仅能够使用这两种循环类型。但是,如果知道循环的次数,则优先使用 FOR 循环,因为在多数情况下,它会固有的执行无穷循环(参阅 FOR 循环段落中的危险消息)。
作为 IEC 61131-3 标准的扩展,将在 FOR、WHILE 和 REPEAT 循环中支持 CONTINUE指令。CONTINUE 将使执行在下个循环周期继续。
示例
FOR Counter:=1 TO 5 BY 1 DO
INT1:=INT1/2;
IF INT1=0 THEN
CONTINUE; (* to avoid division by zero *)
END_IF
Var1:=Var1/INT1; (* only executed, if INT1 is not "0" *)
END_FOR;
Erg:=Var1;
EXIT 指令会终止其所在的 FOR、WHILE 或 REPEAT 循环,不考虑任何条件。
可将无条件跳转的 JMP 指令用于跳转标签标记的代码行。
语法
JMP <标签>;
<标签> 是任意且唯一的标识符,位于程序行的开头。指令 JMP 必须后接跳转目标指示,该目标必须等于预先定义的标签。
|
无穷循环会导致意外设备操作 |
确保 JMP 指令的使用有条件,从而不会导致无限、无穷循环。 |
不遵循上述说明可能导致人员伤亡或设备损坏。 |
以下是创建逻辑条件中指令的示例,在该示例中避免跳转和其目标之间产生无限或无穷循环。
aaa:=0;
_label1: aaa:=aaa+1;
(*instructions*)
IF (aaa < 10) THEN
JMP _label1;
END_IF;
只要用 0 初始化了变量 i,并且其值小于 10,上面示例中的跳转指令将影响重复返回至标签 _label1 定义的程序行。因此,它将影响在标签和 JMP 指令之间构成的指令的重复处理。由于这些指令还包含变量 i 的增量,将不符合跳转条件(在第九次检查时),程序流将继续向前执行。
您也可通过在示例中使用 WHILE 或 REPEAT 循环来实现该功能。通常,使用跳转指令会降低代码的可读性。
在结构化文本对象中写入注释有两种可行方式:
o用 (* 开始注释并以 *) 结束。可让您插入在数行上运行的注释。示例:(*此为注释。*)
o单行注释是 IEC 61131-3 标准的扩展:// 指示注释的开头,该注释在该行的末尾结束。示例://此为注释。
您可将注释置于 ST 编辑器的声明或实施部分的任何位置。
嵌套注释:您可将注释置于其他注释中。
示例
(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)
在该示例中,以第一个括号作为开头的注释并没有以 checked 后面的括号结束,而只能以最后的括号结束。