3.4 数学运算指令
本节的程序在项目“数学运算指令应用”的OB1中。
3.4.1 数学函数指令
1.四则运算指令
数学函数指令中的ADD、SUB、MUL和DIV分别是加、减、乘、除指令,它们执行的操作见表3-4。操作数的数据类型可选整数(SInt、Int、DInt、USInt、UInt、UDInt)和浮点数Real,IN1和IN2可以是常数。IN1、IN2和OUT的数据类型应相同。
整数除法指令将得到的商截尾取整后,作为整数格式的输出OUT。
ADD和MUL指令允许有多个输入,单击方框中参数IN2后面的,将会增加输入IN3,以后增加的输入的编号依次递增。
【例3-6】压力变送器的量程为0~10MPa,输出信号为0~10V,被CPU集成的模拟量输入的通道0(地址为IW64)转换为0~27648的数字。假设转换后的数字为N,试求以kPa为单位的压力值。
解:0~10MPa(0~10000kPa)对应于转换后的数字0~27648,转换公式为
P=(10000×N)/27648(kPa) (3-1)
值得注意的是,在运算时一定要先乘后除,否则将会损失原始数据的精度。
表3-4 数学函数指令
公式中乘法运算的结果可能会大于一个字能表示的最大值,因此应使用数据类型为双整数的乘法和除法(见图3-46)。为此首先使用CONV指令,将IW64转换为双整数(DInt)。
将指令列表中的MUL和DIV指令拖放到梯形图中后,单击指令方框内指令名称下面的问号,再单击出现的按钮,用下拉式列表框设置操作数的数据类型为双整数DInt。在OB1的块接口区定义数据类型为DInt的临时局部变量Temp1,用来保存运算的中间结果。
图3-46 使用整数运算指令的压力计算程序
双整数除法指令DIV的运算结果为双整数,但是由式(3-1)可知运算结果实际上不会超过16位正整数的最大值32767,所以双字MD10的高位字MW10为0,运算结果的有效部分在MD10的低位字MW12中。
【例3-7】使用浮点数运算计算上例以kPa为单位的压力值。将式(3-1)改写为式(3-2):
P=(10000×N)/27648=0.361690×N(kPa) (3-2)
在OB1的接口区定义数据类型为Real的局部变量Temp2,用来保存运算的中间结果。
首先用CONV指令将IW64的值转换为实数(Real),再用实数乘法指令完成式(3-2)的运算(见图3-47)。最后使用四舍五入的ROUND指令,将运算结果转换为整数。
图3-47 使用浮点数运算指令的压力计算程序
2.CALCULATE指令
可以使用“计算”指令CALCULATE定义和执行数学表达式,根据所选的数据类型计算复杂的数学运算或逻辑运算。
单击图3-48指令框中CALCULATE下面的“???”,用出现的下拉式列表选择该指令的数据类型为Real。根据所选的数据类型,可以用某些指令组合的函数来执行复杂的计算。单击指令框右上角的图标,或用鼠标双击指令框中间的数学表达式方框,打开图3-48下面的对话框。对话框给出了所选数据类型可以使用的指令,在该对话框中输入待计算的表达式,表达式可以包含输入参数的名称(INn)和运算符,不能指定方框外的地址和常数。
图3-48 CALCULATE指令实例
在初始状态下,指令框只有两个输入IN1和IN2。单击方框左下角的符号,可以增加输入参数的个数。功能框按升序对插入的输入编号,表达式可以不使用所有已定义的输入。
运行时使用方框外输入的值执行指定的表达式的运算,运算结果传送到MD36中。
3.浮点数函数运算指令
浮点数(实数)数学运算指令(见表3-4)的操作数IN和OUT的数据类型为Real。
“计算指数值”指令EXP和“计算自然对数”指令LN中的指数和对数的底数e=2.718282。
“计算平方根”指令SQRT和LN指令的输入值如果小于0,输出OUT为无效的浮点数。
三角函数指令和反三角函数指令中的角度均为以弧度为单位的浮点数。如果输入值是以度为单位的浮点数,使用三角函数指令之前应先将角度值乘以π/180.0,转换为弧度值。
“计算反正弦值”指令ASIN和“计算反余弦值”指令ACOS的输入值的允许范围为-1.0~1.0,ASIN和“计算反正切值”指令ATAN的运算结果的取值范围为-π/2~+π/2弧度,ACOS的运算结果的取值范围为0~π弧度。
求以10为底的对数时,需要将自然对数值除以2.302585(10的自然对数值)。例如lg100=ln100/2.302585=4.605170/2.302585=2。
【例3-8】测量远处物体的高度时,已知被测物体到测量点的距离L和以度为单位的夹角θ,求被测物体的高度H,H=Ltanθ,角度的单位为度。假设以度为单位的实数角度值在MD40中,乘以π/180=0.0174533,得到角度的弧度值(见图3-49),运算的中间结果用实数临时局部变量Temp2保存。MD44中是L的实数值,运算结果在MD48中。
图3-49 浮点数函数运算指令的应用
4.其他数学函数指令
(1)MOD指令
除法指令只能得到商,余数被丢掉。可以用“返回除法的余数”指令MOD来求各种整数除法的余数(见图3-50)。输出OUT中的运算结果为除法运算IN1/IN2的余数。
图3-50 MOD指令和INC指令
(2)NEG指令
“求二进制补码”(取反)指令NEG(negation)将输入IN的值的符号取反后,保存在输出OUT中。IN和OUT的数据类型可以是SInt、Int、DInt和Real,输入IN还可以是常数。
(3)INC与DEC指令
执行“递增”指令INC与“递减”指令DEC时,参数IN/OUT的值分别被加1和减1。IN/OUT的数据类型为各种有符号或无符号的整数。
如果图3-50中的INC指令用来计I0.4动作的次数,应在INC指令之前添加检测能流上升沿的PTRIG指令。否则在I0.4为1状态的每个扫描周期,MW64都要加1。
(4)ABS指令
“计算绝对值”指令ABS用来求输入IN中的有符号整数(SInt、Int、DInt)或实数(Real)的绝对值,将结果保存在输出OUT中。IN和OUT的数据类型应相同。
(5)MIN与MAX指令
“获取最小值”指令MIN比较输入IN1和IN2的值(见图3-51),将其中较小的值送给输出OUT。“获取最大值”指令MAX比较输入IN1和IN2的值,将其中较大的值送给输出OUT。输入参数和OUT的数据类型为各种整数和浮点数,可以增加输入的个数。
(6)LIMIT指令
“设置限值”指令LIMIT(见图3-51)将输入IN的值限制在输入MIN与MAX的值范围之间。如果IN的值没有超出该范围,将它直接保存在OUT指定的地址中。如果IN的值小于MIN的值或大于MAX的值,将MIN或MAX的值送给输出OUT。
图3-51 MIN指令和LIMIT指令
(7)提取小数与取幂指令
“提取小数”指令FRAC将输入IN的小数部分传送到输出OUT。“取幂”指令EXPT计算以输入IN1的值为底,以输入IN2为指数的幂(OUT=IN1IN2),计算结果在OUT中。
3.4.2 字逻辑运算指令
1.字逻辑运算指令
字逻辑运算指令对两个输入IN1和IN2逐位进行逻辑运算,运算结果在输出OUT指定的地址中(见图3-52)。
图3-52 字逻辑运算指令
“‘与’运算”(AND)指令的两个操作数的同一位如果均为1,运算结果的对应位为1,否则为0(见表3-5)。“‘或’运算”(OR)指令的两个操作数的同一位如果均为0,运算结果的对应位为0,否则为1。“‘异或’运算”(XOR)指令的两个操作数的同一位如果不相同,运算结果的对应位为1,否则为0。以上指令的操作数IN1、IN2和OUT的数据类型为位字符串Byte、Word或DWord。
允许有多个输入,单击方框中的,将会增加输入的个数。
“求反码”指令INVERT(见图3-53中的INV指令)将输入IN中的二进制整数逐位取反,即各位的二进制数由0变1,由1变0,运算结果存放在输出OUT指定的地址。
表3-5 字逻辑运算举例
2.解码与编码指令
如果输入参数IN的值为n,“解码”(即译码)指令DECO(Decode)将输出参数OUT的第n位置位为1,其余各位置0,相当于数字电路中译码电路的功能。利用解码指令,可以用输入IN的值来控制OUT中指定位的状态。如果输入IN的值大于31,将IN的值除以32以后,用余数来进行解码操作。
图3-53中DECO指令的参数IN的值为5,OUT为2#00100000(16#20),仅第5位为1。
“编码”指令ENCO(Encode)与“解码”指令相反,将IN中为1的最低位的位数送给输出参数OUT指定的地址。如果IN为2#00101000(即16#28,见图3-53),OUT指定的MW98中的编码结果为3。如果IN为1或0,MW98的值为0。如果IN为0,ENO为0状态。
图3-53 字逻辑运算指令
3.SEL与MUX、DEMUX指令
“选择”指令SEL(Select)的Bool输入参数G为0时选中IN0(见图3-54),G为1时选中IN1,选中的数值被保存到输出参数OUT指定的地址。
图3-54 字逻辑运算指令
“多路复用”指令MUX(Multiplex)根据输入参数K的值,选中某个输入数据,并将它传送到输出参数OUT指定的地址。K=m时,将选中输入参数INm。如果参数K的值大于可用的输入个数,则参数ELSE的值将复制到输出OUT中,并且ENO为0状态。
单击方框内的符号,可以增加输入参数INn的个数。INn、ELSE和OUT的数据类型应相同,它们可以取多种数据类型。参数K的数据类型为整数。
“多路分用”指令DEMUX根据输入参数K的值,将输入IN的内容复制到选定的输出,其他输出则保持不变。K=m时,将复制到输出OUTm。单击方框中的符号,可以增加输出参数OUTn的个数。参数K的数据类型为整数,IN、ELSE和OUTn的数据类型应相同,它们可以取多种数据类型。如果参数K的值大于可用的输出个数,参数ELSE输出IN的值,并且ENO为0状态。