在PLC控制项目中,经常会用到PLC和其他设备通讯发送接收数据信息等,通讯必然会用到校验,比如求和校验、LRC校验、CRC校验等,一般来说MODBUSASCII通讯方式会采用LRC校验,MODBUSRTU通讯方式会采用CRC校验,其实这些校验程序中会利用到一些逻辑运算指令,那么这些校验程序应该怎么编写呢,下面小编就给大家介绍一下逻辑运算指令在PLC校验程序中的应用吧。
案例1、逻辑运算指令在求和校验中的应用。
求和校验算法:将参与校验的数据求和,取其低8位为校验码。
校验数据为D0~D7共8个,先用CCDD0 D100 K8进行求和运算(指令中的K8就代表D0开始的8个寄存器,即D0~D7),求和结果存在D100中,再用WANDH0FF D100D100进行逻辑与运算,根据逻辑与运算指令有0出0的特点,取出D100的低8位数据,再存放回D100中,所得出来的即为求和校验码。
案例2、逻辑运算指令在LRC校验中的应用。
LRC校验算法:将参与校验的数据求和,并将和的补码(低8位)作为校验码。
校验数据为D10~D19共10个,先用CCDD10 D110 K10进行求和运算,求和结果存在D110中,根据算法还要求出其补码,用NEG指令即可求出补码,Zui后再用WANDH0FF D110D110进行逻辑与运算,根据逻辑与运算指令有0出0的特点,取出D110的低8位数据,再存放回D110中,所得出来的即为求和校验码。
除了用NEG指令求补码,还可以采用求反再加1的方法,程序如下图,CCD求和之后,用SUBH0FFFF D120 D120进行减法运算,即为求反功能,再用INCD120加1,同样可以求出其补码出来。
案例3、逻辑运算指令在CRC校验中的应用。CRC校验算法:
1、设置CRC存储器为HFFFF;
2、把第一个参与校验的8位二进制数与CRC低8位进行异或运算,结果仍存于CRC存储器。
3、把CRC存储器右移一位,Zui高位补0,检查Zui低位b0位;
4、若b0=0,CRC存储器不变,若b0=1,CRC存储器与HA001(1010 0000 00000001)进行异或运算,结果仍存于CRC存储器;
5、重复3~4两步,直到右移8次,这样第一个8位数据全部进行了处理,结果仍存于CRC。
6、重复2~5步,处理第二个8位二进制数。
7、如此处理,直到所有参与校验的8位二进制数全部处理完毕,结果CRC寄存器所存的就是CRC校验码。
如果是将CRC校验程序做成子程序,需要先在主程序中用CALLP0指令进行调用,子程序的结尾需用SRET作为子程序的结束。
首先做之后需要用到的变址寄存器Z10进行清零,同时用 K0 D10指令,将HFFFF存到D10中,设置CRC存储器为HFFFF。根据算法第2步到第5步之间是需要循环的,同时用FORD0设置循环次数,循环多少次是取决于校验数据个数D0的。
然后把第一个参与校验的8位二进制数与CRC低8位进行异或运算,结果仍存于CRC存储器。用WANDH0FF D100Z10 D11取出第一个校验数据的低8位,并用WXOR D10 D11D10与CRC低8位进行异或运算,结果存回D10中,同时对Z10进行加1,这是为了让下次运算时是把下一个参与校验的数据D101进行处理。因为后面的第3步到第4步之间是需要循环8次的,也要用FORK8、NEXT指令进行循环,后面将第3步和第4步的程序编写在FOR NEXT指令之间。
根据算法的第3、4步,把CRC存储器右移一位,Zui高位补0,检查Zui低位b0位,用RCRD10 K1循环右移指令即可完成,若b0=0,CRC存储器不变,若b0=1,即进位标志SM8022为ON,CRC存储器D10与HA001(10100000 0000 0001)进行异或运算,结果仍存于CRC存储器D10中,直到右移8次,这样第一个8位数据全部进行了处理。
直到所有参与校验的8位二进制数全部处理完毕,CRC寄存器所存的就是CRC校验码,Zui后再用WAND指令取出CRC校验值的低8位和高8位,再用SWAP指令进行高低字节交换即可。