在PLC控制項(xiàng)目中,經(jīng)常會用到PLC和其他設(shè)備通訊發(fā)送接收數(shù)據(jù)信息等,通訊必然會用到校驗(yàn),比如求和校驗(yàn)、LRC校驗(yàn)、CRC校驗(yàn)等,一般來說MODBUS ASCII通訊方式會采用LRC校驗(yàn),MODBUS RTU通訊方式會采用CRC校驗(yàn),其實(shí)這些校驗(yàn)程序中會利用到一些邏輯運(yùn)算指令,那么這些校驗(yàn)程序應(yīng)該怎么編寫呢,下面小編就給大家介紹一下邏輯運(yùn)算指令在PLC校驗(yàn)程序中的應(yīng)用吧。
案例1、邏輯運(yùn)算指令在求和校驗(yàn)中的應(yīng)用。
求和校驗(yàn)算法:將參與校驗(yàn)的數(shù)據(jù)求和,取其低8位為校驗(yàn)碼。
2024-01-20
校驗(yàn)數(shù)據(jù)為D0~D7共8個,先用CCD D0 D100 K8進(jìn)行求和運(yùn)算(指令中的K8就代表D0開始的8個寄存器,即D0~D7),求和結(jié)果存在D100中,再用WAND H0FF D100 D100進(jìn)行邏輯與運(yùn)算,根據(jù)邏輯與運(yùn)算指令有0出0的特點(diǎn),取出D100的低8位數(shù)據(jù),再存放回D100中,所得出來的即為求和校驗(yàn)碼。
案例2、邏輯運(yùn)算指令在LRC校驗(yàn)中的應(yīng)用。
LRC校驗(yàn)算法:將參與校驗(yàn)的數(shù)據(jù)求和,并將和的補(bǔ)碼(低8位)作為校驗(yàn)碼。
校驗(yàn)數(shù)據(jù)為D10~D19共10個,先用CCD D10 D110 K10進(jìn)行求和運(yùn)算,求和結(jié)果存在D110中,根據(jù)算法還要求出其補(bǔ)碼,用NEG指令即可求出補(bǔ)碼,最后再用WAND H0FF D110 D110進(jìn)行邏輯與運(yùn)算,根據(jù)邏輯與運(yùn)算指令有0出0的特點(diǎn),取出D110的低8位數(shù)據(jù),再存放回D110中,所得出來的即為求和校驗(yàn)碼。
除了用NEG指令求補(bǔ)碼,還可以采用求反再加1的方法,程序如下圖,CCD求和之后,用SUB H0FFFF D120 D120進(jìn)行減法運(yùn)算,即為求反功能,再用INC D120加1,同樣可以求出其補(bǔ)碼出來。
案例3、邏輯運(yùn)算指令在CRC校驗(yàn)中的應(yīng)用。CRC校驗(yàn)算法:
1、設(shè)置CRC存儲器為HFFFF;
2、把第一個參與校驗(yàn)的8位二進(jìn)制數(shù)與CRC低8位進(jìn)行異或運(yùn)算,結(jié)果仍存于CRC存儲器。
3、把CRC存儲器右移一位,最高位補(bǔ)0,檢查最低位b0位;
4、若b0=0,CRC存儲器不變,若b0=1,CRC存儲器與HA001(1010 0000 0000 0001)進(jìn)行異或運(yùn)算,結(jié)果仍存于CRC存儲器;
5、重復(fù)3~4兩步,直到右移8次,這樣第一個8位數(shù)據(jù)全部進(jìn)行了處理,結(jié)果仍存于CRC。
6、重復(fù)2~5步,處理第二個8位二進(jìn)制數(shù)。
7、如此處理,直到所有參與校驗(yàn)的8位二進(jìn)制數(shù)全部處理完畢,結(jié)果CRC寄存器所存的就是CRC校驗(yàn)碼。
如果是將CRC校驗(yàn)程序做成子程序,需要先在主程序中用CALL P0指令進(jìn)行調(diào)用,子程序的結(jié)尾需用SRET作為子程序的結(jié)束。
首先做之后需要用到的變址寄存器Z10進(jìn)行清零,同時用WXOR H0FFFF K0 D10指令,將HFFFF存到D10中,設(shè)置CRC存儲器為HFFFF。根據(jù)算法第2步到第5步之間是需要循環(huán)的,同時用FOR D0設(shè)置循環(huán)次數(shù),循環(huán)多少次是取決于校驗(yàn)數(shù)據(jù)個數(shù)D0的。
然后把第一個參與校驗(yàn)的8位二進(jìn)制數(shù)與CRC低8位進(jìn)行異或運(yùn)算,結(jié)果仍存于CRC存儲器。用WAND H0FF D100Z10 D11取出第一個校驗(yàn)數(shù)據(jù)的低8位,并用WXOR D10 D11 D10與CRC低8位進(jìn)行異或運(yùn)算,結(jié)果存回D10中,同時對Z10進(jìn)行加1,這是為了讓下次運(yùn)算時是把下一個參與校驗(yàn)的數(shù)據(jù)D101進(jìn)行處理。因?yàn)楹竺娴牡?步到第4步之間是需要循環(huán)8次的,也要用FOR K8、NEXT指令進(jìn)行循環(huán),后面將第3步和第4步的程序編寫在FOR NEXT指令之間。
根據(jù)算法的第3、4步,把CRC存儲器右移一位,最高位補(bǔ)0,檢查最低位b0位,用RCR D10 K1循環(huán)右移指令即可完成,若b0=0,CRC存儲器不變,若b0=1,即進(jìn)位標(biāo)志SM8022為ON,CRC存儲器D10與HA001(1010 0000 0000 0001)進(jìn)行異或運(yùn)算,結(jié)果仍存于CRC存儲器D10中,直到右移8次,這樣第一個8位數(shù)據(jù)全部進(jìn)行了處理。
直到所有參與校驗(yàn)的8位二進(jìn)制數(shù)全部處理完畢,CRC寄存器所存的就是CRC校驗(yàn)碼,最后再用WAND指令取出CRC校驗(yàn)值的低8位和高8位,再用SWAP指令進(jìn)行高低字節(jié)交換即可。
以上就是PLC通訊程序中常用的求和、LRC和CRC校驗(yàn)程序
取消
清空記錄
歷史記錄
清空記錄
歷史記錄
取消
清空記錄
歷史記錄
清空記錄
歷史記錄