指令说明使用给定表达式执行何种操作。
在 ST 中可使用以下指令:
指令 |
示例 |
---|---|
|
|
调用功能块并使用功能块输出 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
空指令 |
|
缺省赋值
在赋值左侧,有一个操作数(变量、地址),该操作数上分配有右侧表达式的值,该值由赋值操作符 :=
分配。
另请参阅具有相同功能的 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
此操作符生成对值的引用。
语法
<variable name> REF= <variablename> ;
示例
refA : 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
指令
您可使用 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
指令:
如果 <Var1>
中的变量具有值 <值 I>,则将执行指令 <指令 I>。
如果 <Var 1>
没有指示的值,则将执行 <ELSE Instruction>。
如果要为变量的数个值执行相同指令,则可以逗号分隔将这些值逐个写入,并由此确定共同执行的条件。
如果要对变量一定范围内的值执行同一指令,可以写入 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。
FOR
指令施加的限值。
警告 | |
---|---|
您可在 FOR
循环中使用 CONTINUE
指令。这是对于 IEC 61131-3 标准的扩展。
WHILE
循环
对于 FOR
循环的备选项为 WHILE
循环,后者只要在布尔条件保持为 TRUE 时就会执行 if 和 for 循环。如果条件最初并非为 TRUE,则不会执行循环。如果条件最初为 TRUE,现在变为 FALSE,则循环会终止。
语法
WHILE <boolean expression> DO
<instructions>
END_WHILE;
很明显,初始和当前布尔表达式必须在循环指令内的某些点设置值 FALSE。否则,循环将不会终止,导致无限、无穷循环条件。
警告 | |
---|---|
以下是循环中导致循环终止的指令的示例:
WHILE Counter>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
您可在 WHILE
循环中使用 CONTINUE
指令。
REPEAT
循环
与 WHILE
循环一样,FOR
循环的另一个备选项为 REPEAT
循环。REPEAT
循环与 WHILE
循环的不同之处在于,只有在循环执行至少一次之后(在循环结束时),才会计算退出条件。
语法
REPEAT
<instructions>
UNTIL <boolean expression>
END_REPEAT;
只要 <布尔表达式> 返回“真”,就会反复执行 <指令> 如果 <布尔表达式> 已经在第一个 UNTIL 计算生成,则只会将 <instructions> 执行一次。<布尔表达式> 必须在循环指令内的某些点设置值“真”。否则,循环将不会终止,导致无限、无穷循环条件。
警告 | |
---|---|
以下是循环中导致循环终止的指令的示例:
REPEAT
Var1 := Var1*2;
Counter := Counter-1;
UNTIL
Counter<=0
END_REPEAT;
您可在 REPEAT
循环中使用 CONTINUE
指令。这是对于 IEC 61131-3 标准的扩展。
CONTINUE
指令
作为 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;
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
循环来实现该功能。通常,使用跳转指令会降低代码的可读性。
您可将注释置于 ST 编辑器的声明或实施部分的任何位置。
在结构化文本对象中写入注释有两种可行方式:
用 (*
开始注释并以 *)
结束。可让您插入在数行上运行的注释。
示例:(*This is a comment.*)
使用单行注释作为 IEC 61131-3 标准的扩展,这些注释以两种不同的方式标记:
//
表示注释的开头,该注释在该行的末尾结束。
示例:// This is a comment.
///
表示注释的开头,该注释在该行的末尾结束。
示例:/// This is a comment.
工具提示和 POU 文档的注释示例:
A tooltip in the header of a POU is defined by the following comment:
// tooltip text – line 1
// tooltip text – line 2
// tooltip text – line 3
Afterwards the documentation is defined as follows:
/// reStructuredText
有关使用具有 LibDocContent 属性的 CODESYS LibDoc Scripting Collection 工具创建库文档时处理这两种注释的详细信息,请参阅 下。
嵌套注释:您可将注释置于其他注释中。
示例:
(*
a:=inst.out; (* to be checked *)
b:=b+1;
*)
在该示例中,以第一个括号作为开头的注释并没有以 checked
后面的括号结束,而只能以最后的括号结束。