1.簡介
歐姆龍CP1H PLC的CRC校驗。CP1H沒有CRC校驗指令或者功能塊,在串口自由協議通信中,如果涉及到CRC校驗,需要手動計算CRC值,本程序是一個輸入數據,自動計算CRC校驗碼的程序。
Mov #xx D100 #號表示16進制數據
Mov &xx D100 &號表示10進制數據
2.關鍵指令
2.1 MOVD_數據傳送
以位(4 位)單位進行傳送,具體用法請查詢CP1H編程手冊,此處不做具體描述,僅舉例說明。
例: D200=#AABB(16進制)
D201=#0000
D202=#0000
MOVD D200 #0010 D201
MOVD D200 #0212 D202
執行后 D201=#00AA
D202=#BB00
2.2ASR_右移
數據右移一位,相當於原數據除以2. 具體用法請查詢CP1H編程手冊,此處不做具體描述,僅舉例說明。
例:D200=#0003(二進制:0000 0000 0000 0011)
ASR D200
執行結果:D200=#0001(二進制:0000 0000 0000 0001)
2.3XORW_字異或運算
異或運算。字的異或運算。既位與位不同=1.
例:D200=#0001(二進制:0000 0000 0000 0001)
D201=#0003(二進制:0000 0000 0000 0011)
XORW D200 D201 D202
執行后D202=#0002(0000 0000 0000 0010)
2.4ANDW_字與運算
字內的位進行與運算,既兩個位都為1則結過=1.
例:D200=#0001(二進制:0000 0000 0000 0001)
D201=#0003(二進制:0000 0000 0000 0011)
ANDW D200 D201 D202
執行后:D202=#0001(二進制:0000 0000 0000 0001)
2.5指針
此處嚴格來說,不應該叫指針,但是功能與指針類似,姑且稱之為‘指針’。
此處指針僅針對D區域。
例如:MOV &1122 D100
MOV &100 D200
此時,D200中數值為100.
MOV @D200 D300
執行后,D300的值應為&1122而不是&100。因為@D200表示是將D200中的數據作為地址編號,把該地址里的內容傳送給D300。相當於間接尋址。
這樣的話有個優勢,我僅對D200進行運算,就可對相應的數據區進行間接操作,在對地址是連續的數據處理非常方便。
2.6FOR…NEXT_循環指令
循環處理指令。具體用法不做闡述,僅以示例說明。
例:
MOV #0 D100
FOR 6
++ D100
NEXT
執行后D100=6.
需要注意的是,在循環指令未執行完前,一般FOR循環體外面的指令將不會執行(此處不嚴謹,僅僅是個人測試出來的)。
2.7 全局子程序
CRC校驗程序放在全局子程序里,值得注意的是,全局子程序需要放在中斷任務0里。如圖2-1所示

圖2-1 中斷程序設置
3.程序簡解

圖3-1
GSBN 10:全局子程入口 編號10
W500.0:校驗開始
D7000:開始指針。如數據從D200開始,則:MOV &200 D7000
D7002:結束指針。如數據在D205結束,則:MOV &205 D7002
D7005:CRC寄存器。
使用示例:

圖3-2 字節校驗示例
下面用調試軟件驗證下,校驗是否正確

圖3-3 調試軟件校驗
從調試軟件看,似乎PLC程序計算出來的校驗碼5C86和調試軟件計算出來的校驗碼865C不一致,沒關系,如果需要CRC高低位互換,可以使用已經高低位互換過的值它保存在D7018中。
4.字校驗
字校驗和字節校驗一樣,只不過把高8位和低位拆分出來分別計算而已。具體不做詳述,請參照示例程序。
示例程序鏈接:https://pan.baidu.com/s/1_k3Ar6SwFT4Lb78i6MxpIQ
能力有限,部分解釋的不是很清楚,還有可能有一些錯誤之處,歡迎大家指出。
有什么疑惑的地方,可留言交流。
