1. 常数
常数语法:<类型>#<数值>
<类型>指定所需的数据类型;可能BOOL,SINT,USINT,BYTE,INT,UNT,WORD,DNT,
UDINT,DWORD,REAL,LREAL该类型必须是书面的大写字母。
2#0110,10#321,16#EF,B00L#TURE,BYTE#12,INT#211,T#12h23m30s90ms,D#2024-02-01
2. 操作数
操作数语法:%<存储器区前缀><长度前缀><数字1>.<数字2>
例如:%IX0.0表示输入存储区域的二进制数第0个字节第0个bit位。
%:表示操作数
存储器区前缀:表示该操作数的存储位置区域,有I、Q、M类型
I:输入区域,物理输入;Q:输出区域,物理输出;M:内存区域
长度前缀:表示操作数的长度,有X、B、W、D
X:Bit,一位,X类型变量类型:BOOL
B:Byte,一个字节,B类型变量类型:BYTE,SINT,USINT,BOOL
W:Word,一个字,W类型变量类型:WORD,INT,UINT
D:Double Word,两个字,D类型变量类型:DWORD,DINT,UDINT、REAL
数字1:变量对应内存的偏移地址
数字2:作为BOOL或者WORD等类型时,偏移地址后的第几位
3. 变量
变量常数语法:<标识符>:<数据类型>{=<初值>};
直接地址变量:<标识符>AT<地址>:<数据类型>{:=<初始化值>};
VAR
Var1 AT%ID4:DWORD =1000:
END VAR
4. 数据类型
标准数据类型BOOL、INT、REAL、STRING、TIME等。
标准数据类型表:
字符串指令表:
IEC 61131-3标准扩展数据类型:
5. 操作符优先级
6. 赋值指令
变量 := 变量或表达式
意义:操作符“:=”右边变量或表达式的值被赋给了左边的变量
例如: Var2:=Var1*5;
该语句把Var1的值乘以5,再将得到的结果赋值给Var2。
7. IF指令
使用IF指令可以检查条件,并根据此条件执行相应的指令。
常见的IF指令结构有:
IF 条件A THEN
表达式B;
END_IF
当条件A满足时,执行表达式B。
例如:
IF temp<20 THEN
heating := TRUE;
END_IF
当温度降到20度以下时,开启加热器。
IF 条件A THEN
表达式B;
ELSE
表达式C;
END_IF
当条件A满足时,执行表达式B;否则,执行表达式C。
例如:
IF temp<20 THEN
heating := TRUE;
ELSE
heating := FALSE;
END_IF
当温度降到20度以下时,开启加热器, 否则加热器保持关闭。
IF 条件A THEN
表达式B;
ELSIF 条件C THEN
表达式D;
...
ELSIF 条件N-1 THEN
表达式N-1;
ELSE
表达式N;
END_IF
当条件A满足时,执行表达式B;否则,当条件C满足时,执行表达式D;… 当(条件N-1)满足时,执行(表达式M-1);如果以上条件都不满足,则执行表达式N; 指令结束。
例如:
IF temp<20 THEN
heating := TRUE;
ELSIF temp<35 THEN
Heating := FALSE;
Colding:= FALSE;
ELSE
Colding:= TRUE;
END_IF
当温度降到20度以下时,开启加热器;当温度升高到35度以上时,开启制冷器;当温度在20度~35度之间时,加热器、制冷器均保持关闭。
8. CASE指令
语法:
CASE <控制变量> OF
<数值1>: <表达式1>
<数值2>: <表达式2>
<数值3, 数值4, 数值5>: <表达式3>
<数值6 .. 数值10>: <表达式4>
...
<数值n>: <表达式n>
ELSE
<ELSE的表达式>
END_CASE
CASE指令用于将控制变量和若干个操作数进行比较,如果控制变量与其中一个值相同,则执行该值对应的语句。如果与任何一个值都不相同,则执行ELSE指令的语句。
例如:
CASE INT1 OF
1, 5: BOOL1 := TRUE;
2: BOOL2 := TRUE;
10..20: BOOL3:= TRUE;
ELSE
BOOL1 := BOOL2 :=BOOL3 :=FALSE;
END_CASE
当INT1=1或5时,BOOL1为真;
当INT1=2时, BOOL2为真;
当INT1=10~20之间的数值时, BOOL3为真;
否则, BOOL1、 BOOL2、 BOOL3均为假。
当使用IF指令有过多分层,或者需要使用多个ELSIF,才能完成程序功能时,使用CASE指令替代IF指令,可以简化程序,并且能提高程序的可读性。
9. FOR循环指令
FOR循环指令用于一些需要重复执行的语句,它可以使程序简短并且一目了然。但需要注意避免陷入死循环。FOR循环指令是有限制的循环指令, 当限制条件满足(变量值等于“循环结束时变量值”)时,程序就将退出FOR循环,执行下一条指令。
语法:
FOR <循环控制变量> := <循环开始时变量值> TO <循环结束时变量值>{BY <变量递增步长>} DO
<表达式>
END_FOR
其中,{}内语句可根据需要省略,省略时步长默认为1。
例如:
FOR Counter:=1 TO 5 BY 1 DO
Var1:=Var1*2;
END_FOR
此程序的循环控制变量为Counter,循环开始时控制变量初值为1,每一次循环Counter+1;当Counter等于5时,执行完FOR循环内容后,退出循环,执行下一条语句。语句Var1:=Var1*2一共执行5次;假设Var1的初始值是1,那么循环结束后, Var1的值为32。
注意: <循环结束时变量值>不能等于其数据类型的最大值,否则会进入死循环。
例如,假设上例中所使用的计数变量Counter的类型是SINT(范围从-128到127),如果语句为
“FOR Counter:=1 TO 127 BY 1 DO”
则会进入死循环。编程时应避免此类情况的发生。
10. WHILE循环指令
WHILE循环与FOR循环使用方法类似。二者的不同之处是, WHILE循环的结束条件不是指定的循环次数,而是任意的逻辑表达式。当满足该表达式叙述的条件满足时,执行循环。
语法:
WHILE <循环条件>
<表达式>
END_WHILE
WHILE循环执行前先检查<循环条件>是否为TRUE,如果为TRUE,则执行<表达式>;当执行完一次后,再次检查<循环条件>,如果仍为TRUE,则再次执行,直到<循环条件>为FALSE。如果一开始<循环条件>就为FALSE,则不会执行WHILE循环里的指令。
例如:
WHILE Counter<>0 DO
Var1 := Var1*2;
Counter := Counter-1;
END_WHILE
此程序只要Counter不等于0,则一直会执行WHILE循环中的指令,直到Counter等于0为止。每执行一次循环,通过指令“Counter := Counter-1”使Counter的值减1,当Counter等于0时,循环结束。注意: WHILE循环因为没有循环次数的限定,因此相对FOR循环更容易发生死循环;因此可以在循环指令的内容中,增加语句来避免死循环的产生。如上述程序中的“Counter := Counter-1”即可避免程序进入死循环。
11. REPEAT循环指令
REPEAT循环与WHILE循环一样,也是没有明确循环次数的循环。与WHILE循环的区别在于,REPEAT循环在指令执行以后,才检查结束条件。这就意味着无论结束条件怎样,循环至少执行一次。
语法:
REPEAT <表达式>
UNTIL <循环结束条件>
END_REPEAT
语句一直执行,直到<循环结束条件>为TRUE时, REPEAT循环结束。如果<循环结束条件>一开始就为TRUE,则循环只执行一次。
例如,上述WHILE示例程序也可写为:
REPEAT Var1 := Var1*2;
Counter := Counter-1;
UNTIL Counter=0
END_REPEAT
注意:REPEAT循环同样需要避免死循环的发生。
在一定的意义上, WHILE循环和REPEAT循环比FOR循环的功能更加强大,这是因为在执行循环前, WHILE循环和REPEAT循环不需要知道循环的次数。因此,在有些情况下,只使用这两种循环就可以了。然而,如果清楚地知道了循环的次数,那么FOR循环更好,因为FOR循环可以避免产生死循环。
12. CONTINUE指令
CONTINUE指令可以在FOR、WHILE和REPEAT三种循环中使用,其作用为中断本次循环,直接执行下次循环。
例如:
FOR Counter:=1 TO 5 BY 1 DO
INT1:= INT1/2;
IF INT1=0 THEN
CONTINUE; (* 避免被零除 *)
END_IF
Var1:=Var1/INT1; (* 仅在INT1不为“0”时执行 *)
END_FOR
此程序使用CONTINUE指令,当INT1等于0时,直接结束本次循环,开始下一次循环,以避免指令“Var1:=Var1/INT1”中对INT1的除零操作。
13. EXIT指令
EXIT用于退出FOR循环、 WHILE循环、 REPEAT循环。
例如:
FOR Counter:=1 TO 5 BY 1 DO
INT1:= INT1/2;
IF INT1=0 THEN
EXIT; (* 避免被零除 *)
END_IF
Var1:=Var1/INT1;
END_FOR
当INT1等于0时, FOR循环结束。
14. RETURN指令
返回指令,用于根据一定条件退出POU。
例如:
IF b=TRUE THEN
RETURN;
END_IF
a := a + 1;
如果b为TRUE,将不会执行a := a +1(a保持b为true之前的值) ,而是直接退出POU。
15. JMP指令
<label>:
JMP <label>;
跳转指令,跳转到label所在的位置执行程序。
例如:
i := 0;
label: i := i+1;
......
IF i<10 THEN
JMP label;
END_IF
当i<10时,跳转回label所在行,执行i:=i+1。
JMP指令容易造成程序结构混乱,降低代码可读性,不建议使用。
