指令

概述

指令说明使用给定表达式执行何种操作。

在 ST 中可使用以下指令:

指令

示例

赋值 

A:=B; CV := CV + 1; C:=SIN(X);

调用功能块并使用功能块输出

CMD_TMR(IN := %IX5, PT := 300);
A:=CMD_TMR.Q

RETURN

RETURN;

IF

D:=B*B;
IF D<0.0 THEN
C:=A;
ELSIF D=0.0 THEN
C:=B;
ELSE
C:=D;
END_IF;

CASE

CASE INT1 OF
1: BOOL1 := TRUE;
2: BOOL2 := TRUE;
ELSE
 BOOL1 := FALSE;
 BOOL2 := FALSE;
END_CASE;

FOR

J:=101;
FOR I:=1 TO 100 BY 2 DO
IF ARR[I] = 70 THEN
J:=I;
'EXIT;
END_IF;
END_FOR;

WHILE

J:=1;
WHILE J<= 100 AND ARR[J] <> 70 DO
J:=J+2;
END_WHILE;

REPEAT

J:=-1;
REPEAT
J:=J+2;
UNTIL J= 101 OR ARR[J] = 70
END_REPEAT;

EXIT

EXIT;

CONTINUE

CONTINUE;

JMP

label1: i:=i+1;
IF i=10 THEN
    JMP label2;
END_IF
JMP label1;
label2:

空指令

;

赋值操作符

缺省赋值

在赋值左侧,有一个操作数(变量、地址),该操作数上分配有右侧表达式的值,该值由赋值操作符 := 分配。

另请参阅具有相同功能的 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;

在 ST 中调用功能块

根据以下语法以结构化文本调用功能块(缩写为 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 指令

您可使用 RETURN 指令来离开 POU

语法

RETURN;

示例

IF b=TRUE THEN
RETURN;
END_IF;
a:=a+1;

如果 b 为“真”,将不会执行指令 a:=a+1;。因此,将立即离开 POU。

 IF 指令

使用 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 指令,您可将数个条件指令与结构中的相同条件变量组合。

语法

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 循环

借助 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 指令施加的限值。

Warning_Color.gif警告

无穷循环会导致意外设备操作

确保 FOR 指令中使用的变量类型有足够容量(具有足够大的上限)来容纳 <末尾值> + 1。

不遵循上述说明可能导致人员伤亡或设备损坏。

您可在 CONTINUE 循环中使用 FOR 指令。这是对于 IEC 61131-3 标准的扩展。

WHILE 循环

对于 FOR 循环的备选项为 WHILE 循环,后者只要在布尔条件保持为“真”时就会执行 if 和 for 循环。如果条件最初并非为“真”,则不会执行循环。如果条件最初为“真”,现在变为“假”,则循环会终止。

语法

WHILE <boolean expression> DO

<instructions>

END_WHILE;

很明显,初始和当前布尔表达式必须在循环指令内的某些点设置值“假”。否则,循环将不会终止,导致无限、无穷循环条件。

Warning_Color.gif警告

无穷循环会导致意外设备操作

通过创建布尔表达式的“假”条件,确保 WHILE 循环将在循环指令中终止。

不遵循上述说明可能导致人员伤亡或设备损坏。

以下是循环中导致循环终止的指令的示例:

WHILE Counter>0 DO
 Var1 := Var1*2;
 Counter := Counter-1;
END_WHILE

尚未引入 REPEAT 指令,因此移动段(带修改)至下面。

您可在 CONTINUE 循环中使用 WHILE 指令。

REPEAT 循环

REPEAT 循环是 FOR 循环的另一种备选方法,也是 WHILE 循环的备选方法。REPEAT 循环与 WHILE  循环块的不同之处在于,前者仅在循环至少执行一次后才计算循环末尾的退出条件。

语法

REPEAT

<instructions>

UNTIL <boolean expression>

END_REPEAT;

只要 <布尔表达式> 返回“真”,就会反复执行 <指令>如果 <布尔表达式> 已经在第一个 UNTIL 计算生成,则只会将 <instructions> 执行一次。<布尔表达式> 必须在循环指令内的某些点设置值“真”。否则,循环将不会终止,导致无限、无穷循环条件。

Warning_Color.gif警告

无穷循环会导致意外设备操作

通过创建布尔表达式的“真”条件,确保 REPEAT 循环将在循环指令中终止。

不遵循上述说明可能导致人员伤亡或设备损坏。

以下是循环中导致循环终止的指令的示例:

REPEAT
 Var1 := Var1*2;
 Counter := Counter-1;
UNTIL
 Counter=0
END_REPEAT;

您可在 CONTINUE 循环中使用 REPEAT 指令。这是对于 IEC 61131-3 标准的扩展。

WHILE 和 REPEAT 循环在某种意义上比 FOR 循环更强大,因为您在执行循环前无法知道循环的数目。因此,在某些情况下,您将仅能够使用这两种循环类型。但是,如果知道循环的次数,则优先使用 FOR 循环,因为在多数情况下,它会固有的执行无穷循环(参阅 FOR 循环段落中的危险消息)。

 CONTINUE 指令

作为 IEC 61131-3 标准的扩展,将在 FORWHILE 和 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 指令

EXIT 指令会终止其所在的 FORWHILE 或 REPEAT 循环,不考虑任何条件。

 JMP 指令

可将无条件跳转的 JMP 指令用于跳转标签标记的代码行。

语法

JMP <标签>;

<标签> 是任意且唯一的标识符,位于程序行的开头。指令 JMP 必须后接跳转目标指示,该目标必须等于预先定义的标签。

Warning_Color.gif警告

无穷循环会导致意外设备操作

确保 JMP 指令的使用有条件,从而不会导致无限、无穷循环。

不遵循上述说明可能导致人员伤亡或设备损坏。

以下是创建逻辑条件中指令的示例,在该示例中避免跳转和其目标之间产生无限或无穷循环。

aaa:=0;
_label1: aaa:=aaa+1;
(*instructions*)
IF (aaa < 10) THEN
JMP _label1;
END_IF;

只要用 0 初始化了变量 i,并且其值小于 10,上面示例中的跳转指令将影响重复返回至标签 _label1 定义的程序行。因此,它将影响在标签和 JMP 指令之间构成的指令的重复处理。由于这些指令还包含变量 i 的增量,将不符合跳转条件(在第九次检查时),程序流将继续向前执行。

您也可通过在示例中使用 WHILE 或 REPEAT 循环来实现该功能。通常,使用跳转指令会降低代码的可读性。

ST 中的注释

在结构化文本对象中写入注释有两种可行方式:

o(* 开始注释并以 *) 结束。可让您插入在数行上运行的注释。示例:(*此为注释。*)

o单行注释是 IEC 61131-3 标准的扩展:// 指示注释的开头,该注释在该行的末尾结束。示例://此为注释。

您可将注释置于 ST 编辑器的声明或实施部分的任何位置。

嵌套注释:您可将注释置于其他注释中。

示例

(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)

在该示例中,以第一个括号作为开头的注释并没有以 checked 后面的括号结束,而只能以最后的括号结束。