中型PLC常用ST指令_常用ST指令介绍
<p><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">.常用ST指令介绍</span></span><br/><span style="">4.1 赋值指令</span><br/><span style=""> 赋值指令用于变量赋值,也就是赋值关键字的左边是变量,右侧为要赋的值,通过赋值关键字进行赋值。例如:Var1 := Var2 * 10;完成执行后,Var1值为Var2的10倍。其中的赋值关键字包含三种:“:=”、“S=”、“R=”。</span><br/><span style="">(1) “:=”为一般赋值,右值直接赋给左值,左值和右值相等。</span><br/><span style="">(2) “S=”为置位赋值,表示如果右值为TRUE,左值变量变为TRUE(置位), 直到调用R=命令来初始化。</span><br/><span style="">(3) “R=”为复位赋值,表示如果右值为TRUE,左值变量变为FALSE(复位)。用于复位S=指令置位的变量。例如:a S= b; 一旦b为 TRUE后,a会保持 TRUE, 即使b 变为 FALSE后。</span><br/><br/><span style="">4.2 功能块的调用</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法: <FB 实例名>(FB输入变量:=<值和地址>|, <更多FB 输入变量:=<值和地址>|...更多 FB 输入变量);</span></span><br/><span style="">下例中,一个延时功能块(TON)被调用,参数IN和PT被分配。那么结果变量Q被分配到变量A。延时FB通过"TMR:TON"实例化。</span><br/><span style=""><FB instance name>, <FB variable>:</span><br/><span style="">TMR(IN := %IX5, PT := 300);</span><br/><span style="">A:=TMR.Q;</span><br/><br/><span style="">4.3 RETUTN 指令</span><br/><span style="">RETURN指令表示当前置条件为TRUE时,离开此POU。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"> RETURN;</span></span><br/><span style="">示例</span><br/><span style="">IF b=TRUE THEN</span><br/><span style="">RETURN;</span><br/><span style="">END_IF;</span><br/><span style="">a:=a+1;</span><br/><span style="">如果b是TRUE,语句a:=a+1;不会被执行,POU会立即被返回。</span><br/><br/><span style="">4.4 IF 指令</span><br/><span style="">通过IF关键字,可以判断执行条件,根据执行条件,执行相应的指令。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">IF <布尔表达式1> THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><IF_指令></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">{ELSIF <布尔表达式2> THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><ELSIF_指令1></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSIF <布尔表达式n> THEN</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><ELSIF_指令-1></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSE</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><ELSE_指令>}</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_IF;</span></span><br/><span style="">其中,{}内部分是可选的,</span><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);"> 如果 <布尔表达式1> 为TRUE, 那么只有 <IF_指令> 被执行,其它不被执行,否则,从 <布尔表达式2>开始,一个一个计算布尔条件表达式直到其中一个表达式值为TRUE,然后执行此表达式对应的指令,如果没有表达式值为TRUE,那么执行 <ELSE_指令>对应的指令。</span><br/><span style="">示例</span><br/><span style="">IF temp<17</span><br/><span style="">THEN heating_on := TRUE;</span><br/><span style="">ELSE heating_on := FALSE;</span><br/><span style="">END_IF;</span><br/><span style="">这里,当温度低于17度时,加热打开,否则它保持关闭。</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.5 CASE 指令</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">使用CASE指令,可以根据一个条件变量,根据其对应的多个值罗列处理对应的命令。条件变量只能是整数。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">CASE <Var1> OF</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><value1>: <Instruction 1></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><value2>: <Instruction 2></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><value3, value4, value5>: <Instruction 3></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><value6 .. value10>: <Instruction4></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">...</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><value n>: <Instruction n></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">ELSE <ELSE Instruction></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_CASE;</span></span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">CASE指令根据以下流程处理:</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">* 如果变量<Var1>的值为 <valueI>, 那么<Instruction I>会被执行</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">* 如果 <Var1>没有匹配任何一个值,那么<ELSE Instruction>被执行</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">* 如果同一个指令在几个变量值时执行,那么可以把这些值一个接一个的写出来,用逗号隔开,因此共同执行</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">* 如果同一个指令会在一个变量范围内执行,可以写上初始值和结束值,中间用两个点隔开。你可以把这些情况合一 。</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.6 WHILE 循环</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">WHILE循环和FOR循环一样可以作为循环处理使用,但和FOR循环不同是循环条件可以是任意布尔表达式 。一旦循环条件满足,循环就执行,否则退出循环。</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">语法:</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">WHILE <boolean expression> DO</span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);"><instructions></span><br/><span style="overflow-wrap: break-word; font-weight: 700; color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">END_WHILE;</span><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">当<Boolean_expression>值为TRUE时,<Instructions>指令开始执行,直到<Boolean_expression>值为FALSE。<Boolean_expression>在第一次值为FALSE,那么 <Instructions>永不会被执行。如果<Boolean_expression> 永远不会为FALSE,那么 <Instructions> 重复执行不停,这叫做死循环,编程时一定确保不要出现死循环。</span><br/><span style="">示例</span><br/><span style="">WHILE Counter<>0 DO</span><br/><span style="">Var1:= Var1*2;</span><br/><span style="">Counter := Counter-1;</span><br/><span style="">END_WHILE</span><br/><span style="">在一定意义上来说,WHILE循环和REPEAT循环比FOR循环功能更强大,因为不需要在执行循环之前计算循环次数。因此,在有些情况下,用WHILE循环和REPEAT循环两种循环就可以了。然而,如果清楚知道循环次数,那么FOR循环更好。</span><br/><br/><span style="">4.7 REPEAT</span><br/><span style="">REPEAT循环不同于WHILE循环,因为循环条件是在循环指令执行后才检查的,这意味着,循环至少执行一次,不管循环条件值如何。语法:</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">REPEAT</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><instructions> </span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">UNTIL <Boolean expression></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_REPEAT;</span></span><br/><span style="">执行逻辑为:<Instructions>一直执行直到<Boolean expression>值为TRUE。如果<Boolean expression>在第一次值TRUE,那么 <Instructions> 只被执行一遍。如果 <Boolean_expression> 值永远不是TRUE,那么 <Instructions> 永远执行不停,导致死循环。</span><br/><span style="">示例</span><br/><span style="">REPEAT</span><br/><span style="">Var1:=Var1*2;</span><br/><span style="">Counter:=Counter-1;</span><br/><span style="">UNTIL Counter=0;</span><br/><span style="">END_REPEAT;</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.8 CONTINUE 语句</span><br/><span style="">CONTINUE指令在 FOR, WHILE和 REPEAT循环中使用,用于提前结束本轮循环,并重新开始下一轮循环。</span><br/><span style="">示例</span><br/><span style="">FOR Counter:=1 TO 5 BY DO</span><br/><span style="">INT1:=INT1/2;</span><br/><span style="">IF INT1=0 THEN</span><br/><span style="">CONTINUE;</span><br/><span style="">END_JF</span><br/><span style="">Var:=Var1/UBT1L</span><br/><span style="">END_FOR;</span><br/><span style="">Erg:=Var1;</span><br/><br/><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">4.9 </span><span style="">FOR循环</span><br/><span style="">通过FOR循环,可以编写重复处理逻辑。</span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">语法:</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">FOR <INT_Var> := <INIT_VALUE> TO <END_VALUE> {BY <Step size>} DO</span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;"><instructions></span></span><br/><span style=""><span style="overflow-wrap: break-word; font-weight: 700;">END_FOR;</span></span><br/><span style="">{} 内的部分是可选的。INT_Var是计数器,是整数类型,只要计数器<INT_Var>不大于<END_VALUE>,<Instructions>会被执行。在执行 <Instructions> 之前首先要检查该条件,如果 <INIT_VALUE>大于 <END_VALUE>,<instructions> 不会被执行。</span><br/><span style="">当 <Instructions>执行一次后, <INT_Var>自动增加<Step size>。<Step size>可以是任意整数值,如果不写此参数,默认值为1。当<INT_Var>大于<END_VALUE>时,循环停止。</span><br/><span style="">示例</span><br/><span style="">FOR Counter:=1 TO 5 BY 1 DO</span><br/><span style="">Var1:=Var1*2;</span><br/><span style="">END_FOR;</span><br/><span style="">Erg:=Var1;</span><br/><span style="">我们假设Var1默认值是2, 经过FOR循环后,它的值是32。</span><br/><br/><span style="">4.10 注释</span><br/><span style="">在结构化文本中有两种写注释的方法。</span><br/><span style="">多行注释,用“(*”开始,“*)”结束。这允许注释跨行注释。例如: "(*This is a comment.*)"</span><br/><span style="">单行注释,用“//”作为注释的开始直到本行结束。例如: "// This is a comment."</span><br/><span style="">注释可以在ST编辑器声明或实现部分的任意地方。</span><br/><span style="">注释的嵌套:注释可以放置在其他注释中</span><br/><span style="">示例</span><span style="color: rgb(51, 51, 51); font-family: "Microsoft Yahei", Tahoma, Helvetica, SimSun, sans-serif; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">(*a:=inst.out; (*to be checked*)b:=b+1;*)</span></p>
页:
[1]