在工程控制应用中,有些时候我们往往需要把接收到的数据进行分离以便使用,比如说在PLC的通信中,就会应用数据的分离功能。举个例子,如接收到某16位二进制数据,需要从16位数据把其高4位和低12位进行分离,要实现这个目的,我们可以用除法指令或逻辑卷运算指令去实现。
用整数除法实现
假设需要分离的16位二进制数存储在VW0中,为16#358E,将分离后的高4位存储在VW4中,低12位存储在VW2中。
=
用除法指令将VW0除以16#1000,则商为3,余数为16#58E,所以VD2的低16位(VW4)中存放16#3,VD2的高16位(VW2)中存放16#58E。
用逻辑运算指令实现
将VW0的数据与16#0FFF进行逻辑与运算,此时将VW0的高4位全部变成了0,从而实现了VW0的低12位的分离;将VW0的数据与16#F000进行逻辑与运算,将VW0的低12位全部变成了0,然后进行右移12位,从而实现了高4位的分离。
所以,我们可以灵活采用进行逻辑运算的值,并配合移位指令,就可以分离出任何所需的位。
在PLC的运算和显示中,我们经常会应用到运算和转换,比如速度与频率的转换、距离和脉冲的转换,或者是出现单位的转换,比如英寸转换成厘米等等。当我们进行运算时,需要先对数据的类型进行转换,数据类型转换成统一的之后才能进行运算,我们以英寸转换成厘米为例看一下。
根据单位转换,1英寸的2.54厘米,因为2.54是浮点数,需要进行浮点数运算,所得的英寸数据先通过I_DI、DI_R指令将整数转换成双整数,再转换成浮点数,之后再用MUL_R指令进行浮点数乘法运算。
此外,有时我们还会遇到需要将十进制数用七段数码显示管进行显示时,也需要用到转换指令,此时用的是BCD与整数指令的转换指令I_BCD、BCD_I,再将BCD码转换成七段码显示器的编码,通过输出口与七段数码管相连接,这样才能显示。
在某些工程应用场合中,我们可能需要用到比较多的数据,这时我们可以先把数据存到表中,之后再从表中把数据取出来使用,这种情况我们会应用到FIFO指令。对于表指令,还有LIFO、AD_T-TBL、FILL_N、TBL_FIND等指令可以灵活使用。
执行FIFO之前 | 执行FIFO之后 | ||||
VW0 | 6 | 大填表数 | VW0 | 6 | 大填表数 |
VW2 | 4 | 实际填表数 | VW2 | 3 | 实际填表数 |
VW4 | 1234 | 数据0 | VW4 | 2345 | 数据0 |
VW6 | 2345 | 数据1 | VW6 | 4567 | 数据1 |
VW8 | 4567 | 数据2 | VW8 | 6789 | 数据2 |
VW10 | 6789 | 数据3 | VW10 | 0 | 数据3 |
VW12 | 0 | 数据4 | VW12 | 0 | 数据4 |
VW14 | 0 | 数据5 | VW14 | 0 | 数据5 |
VW10=0 | VW10=1234 |
执行FIFO之前和之后,各个存储器的数据如图所示,执行一次之后,将VW10的数据取出来,并存储在VW10中,这其实就是先进先出的功能。
在模拟量控制中,涉及到传感器检测模拟量信号,比如说温度传感器检测温度,因为模拟量采集的信号是电压或电流值,要将传感器采集的值换算成被测物理量的实际值,这时就需要用到比例计算放大模拟量值。假设,温度传感器的低检测温度是Tmin,其对应的输出电压为Vmin,低检测温度是Tmax,其对应的输出电压为Vmax,要计算某个输出电压V所对应的温度T,我们可以利用如下公式计算: