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