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
能力有限,部分解釋的不是很清楚,還有可能有一些錯誤之處,歡迎大家指出,
有什么疑惑的地方,可留言交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/115692.html
標籤:其他
上一篇:管理任務執行-如何制定有效的機制
