yxc111
級別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 204 個
工控威望: 292 點
下載積分: 1669 分
在線時間: 86(小時)
注冊時間: 2010-03-12
最后登錄: 2020-04-15
查看yxc111的 主題 / 回貼
樓主  發(fā)表于: 2010-07-10 21:39
用RTU模式通訊  里面有個CRC的值怎么計算啊  最好有詳細的書或視屏傳個
sjm213
有小知識,無大學問。
級別: 論壇版主

精華主題: 7 篇
發(fā)帖數(shù)量: 5240 個
工控威望: 7464 點
下載積分: 159490 分
在線時間: 3188(小時)
注冊時間: 2007-11-21
最后登錄: 2025-02-07
查看sjm213的 主題 / 回貼
1樓  發(fā)表于: 2010-07-11 10:00
前一陣也有好幾個關于CRC的問題,樓上已經(jīng)逐個給出了解答。

在網(wǎng)上流行的CRC碼的計算方法如下:

1、 預置1個16位的寄存器為十六進制FFFF(即全為1);稱此寄存器為CRC寄存器;

2、 把第一個8位二進制數(shù)據(jù)(既通訊信息幀的第一個字節(jié))與16位的CRC寄存器的低 8位相異或,把結(jié)果放于CRC寄存器;

3、 把CRC寄存器的內(nèi)容右移一位(朝低位)用0填補最高位,并檢查移出位;

4、 如果移出位為0:重復第3步(再次右移一位); 如果移出位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進行異或;

5、 重復步驟3和4,直到右移8次,這樣整個8位數(shù)據(jù)全部進行了處理;

6、 重復步驟2到步驟5,進行通訊信息幀下一個字節(jié)的處理;

7、 將該通訊信息幀所有字節(jié)按上述步驟計算完成后,得到的16位CRC寄存器;

8、 最后得到的CRC寄存器的高、低字節(jié)進行交換即為:CRC碼。


據(jù)此,給出一個H05的CRC-16演算過程,
H05的CRC碼:
HFFFF:1111 1111 1111 1111
H05  :0000 0000 0000 0101
X0R  :1111 1111 1111 1010
--------------------------
N1-->  0111 1111 1111 1101
--------------------------
N2-->  0011 1111 1111 1110
HA001: 1010 0000 0000 0001
XOR : 1001 1111 1111 1111
--------------------------
N3-->  0100 1111 1111 1111
HA001: 1010 0000 0000 0001
XOR : 1110 1111 1111 1110
--------------------------
N4-->  0111 0111 1111 1111
--------------------------
N5-->  0011 1011 1111 1111
HA001: 1010 0000 0000 0001
XOR : 1001 1011 1111 1110
--------------------------
N6-->  0100 1101 1111 1111
--------------------------
N7-->  0010 0110 1111 1111
HA001: 1010 0000 0000 0001
XOR : 1000 0110 1111 1110
--------------------------
N8-->  0100 0011 0111 1111
||  H  4    3    7    F

大體就是這樣進行8次移位,希望您沒有暈。

所以最好是通過軟件,讓程序來做這樣的麻煩事。
以三菱為例,你可以這樣做:


在D10~D15輸入進行校驗的數(shù),在D20就能得到結(jié)果。
本帖最近評分記錄:
  • 下載積分:+5(xqx666) 優(yōu)秀文章
  • 下載積分:+5(lcl0904) 感謝分享
    sjm213
    有小知識,無大學問。
    級別: 論壇版主

    精華主題: 7 篇
    發(fā)帖數(shù)量: 5240 個
    工控威望: 7464 點
    下載積分: 159490 分
    在線時間: 3188(小時)
    注冊時間: 2007-11-21
    最后登錄: 2025-02-07
    查看sjm213的 主題 / 回貼
    2樓  發(fā)表于: 2010-07-11 23:37
    1.程序上傳不上傳,我很糾結(jié);
    2.判斷末位是0與否看的是移出位,即移位之前的那個末位,但做XOR的卻是移位后的數(shù),所以文字闡述可能造成誤解,但看程序就能推敲出來;
    3.這個程序里16位不行,至于為什么您自己推敲!當然您可以用別的辦法,避免使用32位!