(點(diǎn)擊上方紅字,,免費(fèi)領(lǐng)取資料) CRC即循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check):是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯(cuò)校驗(yàn)碼,其特征是信息字段和校驗(yàn)字段的長(zhǎng)度可以任意選定,。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯(cuò)功能,,對(duì)數(shù)據(jù)進(jìn)行多項(xiàng)式計(jì)算,并將得到的結(jié)果附在幀的后面,,接收設(shè)備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性,。 在Modbus RTU通訊中數(shù)據(jù)報(bào)文中有一幀是CRC校驗(yàn)碼,,用來(lái)進(jìn)行錯(cuò)誤檢測(cè),。其原理是由發(fā)送設(shè)備將數(shù)據(jù)幀進(jìn)行一定的運(yùn)算得出一個(gè)檢驗(yàn)碼,然后加在數(shù)據(jù)幀后一起發(fā)送過(guò)去,,接收設(shè)備接收到數(shù)據(jù)后重新運(yùn)算,再講運(yùn)算出來(lái)的校驗(yàn)碼與發(fā)送過(guò)去的校驗(yàn)碼進(jìn)行比較,,如果一致則說(shuō)明數(shù)據(jù)無(wú)錯(cuò)誤,如果不一致則說(shuō)明數(shù)據(jù)傳輸錯(cuò)誤,。 CRC運(yùn)算過(guò)程如下: CRC是先存入0 XFFFF到CRC寄存器,然后調(diào)用一個(gè)過(guò)程將消息中連續(xù)的8Bit字節(jié)與當(dāng)前寄存器中的值進(jìn)行處理,。僅每個(gè)字符中的8Bⅰt數(shù)據(jù)對(duì)CRC有效,起始位和停止位以及奇偶校驗(yàn)位均無(wú)效,。CRC產(chǎn)生過(guò)程中:每個(gè)8位字符都單獨(dú)和CRC寄存器內(nèi)容相異或(X0R),結(jié)果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測(cè),如果LSB為1,CRC寄存器單獨(dú)和預(yù)置的值相異或,如果LSB為0,則不進(jìn)行,。整個(gè)過(guò)程要重復(fù)8次。在最后一位(第8位)完成后,下一個(gè)8位字節(jié)又單獨(dú)和CRC寄存器的當(dāng)前值相異或,。最終CRC寄存器中的值,是消息中所有的字節(jié)都執(zhí)行之后的CRC值。 下面為產(chǎn)生GRG的計(jì)算過(guò)程 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ǔ)零,移出并檢查L(zhǎng)SB。 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)建成庫(kù),,在主程序中調(diào)用即可算出CRC結(jié)果: |
|
來(lái)自: 金玉滿堂jjnla8 > 《SMART》