CRC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check):是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,對數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
在Modbus RTU通訊中數(shù)據(jù)報(bào)文中有一幀是CRC校驗(yàn)碼,用來進(jìn)行錯(cuò)誤檢測。其原理是由發(fā)送設(shè)備將數(shù)據(jù)幀進(jìn)行一定的運(yùn)算得出一個(gè)檢驗(yàn)碼,然后加在數(shù)據(jù)幀后一起發(fā)送過去,接收設(shè)備接收到數(shù)據(jù)后重新運(yùn)算,再講運(yùn)算出來的校驗(yàn)碼與發(fā)送過去的校驗(yàn)碼進(jìn)行比較,如果一致則說明數(shù)據(jù)無錯(cuò)誤,如果不一致則說明數(shù)據(jù)傳輸錯(cuò)誤。
CRC運(yùn)算過程如下:
CRC是先存入0 XFFFF到CRC寄存器,然后調(diào)用一個(gè)過程將消息中連續(xù)的8Bit字節(jié)與當(dāng)前寄存器中的值進(jìn)行處理。僅每個(gè)字符中的8Bⅰt數(shù)據(jù)對CRC有效,起始位和停止位以及奇偶校驗(yàn)位均無效。CRC產(chǎn)生過程中:每個(gè)8位字符都單獨(dú)和CRC寄存器內(nèi)容相異或(X0R),結(jié)果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,CRC寄存器單獨(dú)和預(yù)置的值相異或,如果LSB為0,則不進(jìn)行。整個(gè)過程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè)8位字節(jié)又單獨(dú)和CRC寄存器的當(dāng)前值相異或。最終CRC寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。
下面為產(chǎn)生GRG的計(jì)算過程
1.將一個(gè)16位寄存器的值設(shè)置為FFFF(hex),稱之為CRC寄存器。
2.將數(shù)據(jù)的第一個(gè)8Bit字符與16位CRC寄存器的低8位進(jìn)行異或計(jì)算,并把結(jié)果存入CRC寄存器。
3.CRC寄存器向右移一位(向著最低位LSB),最高位MSB補(bǔ)零,移出并檢查LSB。
4.如果LSB為0:重復(fù)第三步(另一個(gè)移位)如果LSB為1:CRC寄存器與預(yù)置值:A001H(1010000000000001B)進(jìn)行異或操作。
5.重復(fù)第3與第4步直到8次移位全部完成,此時(shí)一個(gè)8Bit數(shù)據(jù)處理完畢。
6.重復(fù)第2與第5步直到所有數(shù)據(jù)全部處理完成。
7.最終CRC寄存的內(nèi)容即為CRC值。
注意:CRC校驗(yàn)碼使用時(shí)低字節(jié)在前,高字節(jié)在后。
用S7-200 SMART編寫運(yùn)算程序如下:
將CRC算法創(chuàng)建成庫,在主程序中調(diào)用即可算出CRC結(jié)果。
-
crc
+關(guān)注
關(guān)注
0文章
199瀏覽量
29465 -
SMART
+關(guān)注
關(guān)注
3文章
224瀏覽量
44694
原文標(biāo)題:SMART如何編寫CRC校驗(yàn)算法程序
文章出處:【微信號:GKYXT1508,微信公眾號:工控云學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論