5.算术运算类
这类指令包括ADD、SUB、MUL、DIV和MOD等。编程语言的格式如下:
ADD 操作数//当前结果加操作数对应的数据存储单元内容,运算结果存在当前结果存储器。
SUB 操作数//当前结果减操作数对应的数据存储单元内容,运算结果存在当前结果存储器。
MUL 操作数//当前结果乘操作数对应的数据存储单元内容,运算结果存在当前结果存储器。
DIV 操作数//当前结果除操作数对应的数据存储单元内容,运算结果(商)存在当前结果存储器。
MOD 操作数//当前结果以操作数对应的数据存储单元内容进行取模运算结果(取余数),将运算结果存在当前结果存储器。
【例4.4】温度补偿系数的运算示例。
![cbc1331af108a18ddbc25283985fd9ef.png](https://i-blog.csdnimg.cn/blog_migrate/3748b33b5dc0e0bc16abbdb194502a46.jpeg)
例4.4中用于对气体流量进行温度补偿,其中rTem1是实际温度,单位是℃。程序在第一行读取273.15;第二行将温度实际值rTem1与273.15进行累加并作为当前值。第三行将该当前值除以设计温度值,结果存放在当前值存储器;第四行将运算结果作为温度补偿值存放在rCompensate中。可以看到,程序中ADD和DIV的运算都是实数数据类型的运算。样例代码请参考样例程序01 Sample第4章02_ IL_Arithmetic中。
6.比较运算类
比较指令包括:GT(>)、GE(≥)、EQ(=)、NE(≠)、LE(<)和LT(≤)。编程语言的格式如下:
GT 操作数//当前操作数>操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
GE 操作数//当前操作数≥操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
EQ操作数//当前操作数=操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
NE操作数//当前操作数≠操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
LE操作数//当前操作数<操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
LT操作数//当前操作数≤操作数对应数据存储单元内容,运算结果TRUE送当前结果寄存器。
这类指令用于将他当前结果与操作数对应的数据存储单元内容进行比较,满足操作符规定的比较条件时,当前结果被置为TRUE,反之为FALSE。比较累指令将当前结果存储器的数据类型改变为布尔数据类型。使用时需要注意的事项为:
注意:
1.该指令直接将比较结果存放在存储单元,用户可根据存储单元的状态进行后续程序的执行。
2.比较运算类指令适用于不同数据类型的变量比较,而不局限与单一位的比较,可扩大其应用范围。
【例4.5】比较运算类指令示例。
![7c61fb6d996f4170c48264b298330441.png](https://i-blog.csdnimg.cn/blog_migrate/1a69c5d0815506cffdd67f7a3556ffeb.jpeg)
例4.X中,变量rRealVar为过程测量值,当其值大于50时,表示测量值超限,红色警报等bRed为TRUE,反之,bGreen为TRUE。样例代码请参考样例程序01 Sample第4章 03_IL_Compare中。
7.跳转与返回指令
跳转指令为JMP,返回指令为RET。两者的编程语言格式如下:
JMP 标号 //跳转到标号的位置继续执行
RET //返回到跳转时的断点后继续执行
跳转指令的操作数是标号,不是操作数对应的数据存储单元地址。
返回指令是没有操作数的指令,用于调用函数、功能块及程序的返回。
JMP是Jump缩写。执行该指令时,如果当前结果为TRUE,则跳转条件满足,程序在该点中断,并跳转到该标号所在的程序行继续执行。它与RET指令配合,用于实现子程序的执行。可以带修饰符C或N,表示根据当前结果存储器内容执行或取反。
RET是Return的缩写。执行该指令后,程序返回,并从原断电后第一条指令开始执行。可带修饰符C或N,表示根据当前结果存储器内容执行或取反。
使用跳转和返回指令时注意下列事项:
注意:
1.跳转指令是从主程序跳转到子程序的指令。子程序不能用跳转指令跳转到主程序,只能用返回指令返回。
2.子程序开始标志是标号,子程序结束标志是RET指令。
3.程序中标号具有唯一性。
【例4.6】跳转指令的示例
![7df91c6c4f618ce7f113634ea95ca99c.png](https://i-blog.csdnimg.cn/blog_migrate/eda8203d59fe5e6ec26790bfaf59e73d.jpeg)
例4.6用于自动和手动程序的切换控制。当AUTO开关切到自动位置,则AUTO为TRUE,程序则会执行跳转指令JMPC。因此程序跳转到AUTOPRO子程序,及执行在自动条件下的有关程序。当跳转条件不满足时,执行JMP指令,因此,程序跳转到MANPRO子程序,即执行手动操作时的有关程序。
在此需要特别注意的是AUTOPRO和MANPRO为子程序的标号,并非程序名。
8.调用指令
IEC 61131-3的标准调用指令为CAL指令。编程语言的格式如下:
CAL 操作数 //调用操作数表示的函数、功能块或程序
通过执行该指令,可以调用函数、功能块和程序,使程序结构简洁化,程序描述清晰。调用通用格式如下。
CAL是Call的缩写,表是调用。CAL指令的操作数是函数名或功能块实例名。实例名中的参数用逗号分隔。
9.圆括号指令
IEC 61131-3的标准采用圆括号对指令进行修正,即进行优先执行的操作。
左圆括号“(”用于将当前累加器的内容压入堆栈,并将操作符的操作命令存储,这时,堆栈的其他内容向下移一层。右圆括号“)”用于将堆栈最上层的内容弹出,并于当前累加器内容进行对应的操作,操作结果放在当前累加器内,此时,堆栈的内容向上移一层。因此左圆括号被称为操作延迟,它产生的瞬时结果不影响当前累加器。表4-5为圆括号的表达特性。
![3441ae6180ce654c9cada69ae98d6c30.png](https://i-blog.csdnimg.cn/blog_migrate/8d92c610b7ec76fcdc71853680ebfc48.jpeg)
【例4.7】圆括号对算术运算操作的修正。
![134926e09449ed8c9810019e04fba1f8.png](https://i-blog.csdnimg.cn/blog_migrate/499cd88a4360698490423a272b5c54fe.jpeg)
从例4.7中,其最终实现的算法为rVar1+rVar2*(rVar3+rVar4),整个操作过程中,数据类型需保持一致。此外,数据类型被传递。操作从最里层的可圆括号开始,逐层向外操作,直到最外层圆括号。样例代码请参考样例程序01 Sample第4章04_ IL_Bracket_1。
【例4.8】圆括号对逻辑运算操作的修正。
![bb8b1ae0a5dc036c1407398e07874a06.png](https://i-blog.csdnimg.cn/blog_migrate/1ecf36447a1e5bfd78ed1d145be90ec1.jpeg)
样例代码请参考样例程序01 Sample第4章05_ IL_Bracket_2。
【例4.9】圆括号在程序块并联中的应用。
![390540b97c8538084dbd3d19eb36ce13.png](https://i-blog.csdnimg.cn/blog_migrate/43837c7683b18ba410b6782fa12e4835.jpeg)
在此示例中,两个OR开始的指令是两个程序块,是两个触点串联的程序,最后经或运算后,将运算结果存放到bOutput变量中。样例代码请参考样例程序01 Sample第4章06_IL_ Bracket_3。
数学运算中,圆括号具有括号相类似的功能,即括号外的操作被延迟执行。
【例4.10】圆括号的延迟功能。
![4a94609391d98f5658f46a810141f6a2.png](https://i-blog.csdnimg.cn/blog_migrate/c5d607fdc4f5cc6f7913ebd69300d3e8.jpeg)
例4.10中,其运算结果为(rVar1+ rVar2)* (rVar3- rVar4)。样例代码请参考样例程序01 Sample第4章07_ IL_Bracket_4。
通过如下的示例说明累加器和堆栈之间的关系。
【例4.11】累加器和堆栈之间的关系。
![f7e9a556d71d39a4b67242aa59822460.png](https://i-blog.csdnimg.cn/blog_migrate/c01e0ffdc21d0d9af04a77e30f9188e8.jpeg)
例4.11中堆栈内数据和当前累加器数据内容如表4-6所示。
![8b1c2a5ff7dcae90f6310d9b78b49385.png](https://i-blog.csdnimg.cn/blog_migrate/c1d93ef857af2efa6f4d455b8637b204.jpeg)
最终,例4.11的运算结果为rVar1+ rVar2* (rVar3- rVar4)。样例代码请参考样例程序01 Sample第4章08_ IL_Bracket_5。
所以对较复杂运算关系使用结构化文本或梯形图语言实现较简单。从圆括号指令内进行跳转有时会产生不可预测的结果,故在使用时需要谨慎应对。