协议crc计算_从零了解modbus协议 第三篇
Modbus 介紹
協議介紹
MODBUS協議是一種消息傳遞結構,廣泛用于智能設備間建立主從通信。一個MODBUS消息從主機發給從機,包含了從機地址、命令(例如,讀寄存器或者寫寄存器)、數據、校驗碼(LRC或者CRC)。
由于Modbus協議只是一種消息傳遞結構,因此它獨立于底層物理層。 傳統上使用RS232,RS422或RS485實現。
查詢
查詢中的功能碼告訴被尋址的從機設備要執行哪種類型操作。從機設備完成功能所需要的所有信息,都包含在了數據字節中。舉個例子,功能碼03將會向從機設備請求讀取保持寄存器,并且返回他們的內容。數據段必須包含寄存器的起始地址和寄存器的個數。校驗段為從機設備提供了一種驗證消息內容完整性的方法。
應答
如果從機設備做出一個正常應答,功能碼將會和查詢中的功能碼一樣。數據字節包含從從機收集的數據,比如寄存器的值或狀態。如果發生了一個錯誤,功能碼將會被修改,用來表明這是一個錯誤應答。而且,數據字節中會包含描述錯誤內容的代碼。校驗碼可以讓主機檢查消息內容的有效性。
在標準Modbus網絡,控制器可以設置為ASCII或者RTU傳輸模式。
ASCII模式
在一個Modbus網絡中,當控制器設置為ASCII(American Standard Code For Information Interchange)模式時,每一個8位的字節被當成兩個ASCII碼發送。這個模式的主要優點是它允許字符之間發生長達一秒的時間間隔而不會導致錯誤。
編碼系統
十六進制ASCII可打印字符0...9, A...F
字節的各個位
1位起始位
7位數據位,最低有效位先發送
1位寄偶校驗位,無校驗時該位不存在
如果使用奇偶校驗位,則1位停止位。如果沒有使用奇偶校驗位,則2位停止位
錯誤檢查
縱向冗余檢查(LRC)
RTU模式
在一個Modbus網絡中,當控制器設置為RTU(Remote Terminal Unit)模式時,每一個8位字節包含2個4位的十六進制字符。這種模式的主要優點是,對于相同的波特率,其更大的字符密度可以比ASCII帶來更好的數據吞吐量。 每條消息必須以連續的流方式進行傳輸。
編碼系統
8位二進制,十六進制0...9,A....F
兩個16進制的字符包含在一個8位的字節里面
字節的各個位
1位起始位
8位數據位,最低有效位先發送
1位奇偶校驗位,無校驗時該位不存在
如果使用奇偶校驗位,則1位停止位。如果沒有使用奇偶校驗位,則2位停止位
錯誤檢查
循環冗余校驗(CRC)
ASCII幀
ASCII碼模式,消息以冒號(:)字符(十六進制是0x3A)開頭,以回車換行(十六進制是0x0D和0x0A)結束。
所有其他字符允許傳輸的字符時十六進制的0...9,A...F。為了尋找冒號,網絡設備不斷地監聽網絡總線。當收到一個時,每一個設備將解碼接下來字段(地址字段)來確認它是否是被尋址的設備。
消息中的字符之間可以經過最多一秒的間隔。 如果出現更大的間隔,則接收設備會假定發生了錯誤。 典型的消息幀如下所示。
RTU幀
RTU模式,消息以至少3.5個字符時間的靜默間隔開始。在網絡上,一種很容易實現的方式是使用波特率的倍數字符時間(就像下圖展示的T1-T2-T3-T4)。第一個傳輸的字段是設備地址。
所有其他字符允許傳輸的字符時十六進制的0...9,A...F。為了尋找冒號,網絡設備不斷地監聽網絡總線。當接收到第一個字段(地址字段),每一個設備解碼這個設備地址來確認它是否是被尋址的設備。
在傳輸的字符之后,至少需要3.5個字符時間的間隔來標記消息的結束。 此間隔后可以開始新消息。
整個消息幀必須作為連續流傳輸。在消息幀全部傳輸完前,如果靜默間隔超過1.5個字符時間,則接受設備刷新當前收到的不完整消息。并且,接下來的一個字節將會是新消息的地址字段。
類似的,如果新消息在前一個消息結束之前來到(就是早于前一個消息的3.5個結束靜默時間),接收設備將會認為前一個消息還沒有結束。這將導致一個錯誤。因為最終CRC字段中的值將會對這個組合信息無效。典型的消息幀如下。
地址字段
消息的地址字段包含兩種格式,一種是2個字符的ASCII,另一種是8位的RTU。獨立的從機設備地址是從1到247。
功能字段
功能碼字段告訴從機設備執行什么功能。
Modbus poll支持以下功能:
1. 讀線圈狀態
2. 讀輸入狀態
3. 讀保持寄存器
4. 讀輸入寄存器
5. 寫單個線圈
6. 寫單個寄存器
15. 寫多個線圈
16. 寫多個寄存器
22. 掩碼寫寄存器
23. 讀/寫寄存器
數據段包含請求或者發送的數據。
錯誤校驗段
在標準Modbus網絡中,廣泛使用者兩種錯誤校驗方式。采用的校驗方式,決定了錯誤校驗段中的內容。
ASCII
當消息幀使用ASCII模式,錯誤校驗碼字段包含兩個ASCII碼字符。通過對消息內容進行縱向冗余檢查(LRC)計算,計算出的結果就是錯誤校驗碼,不對消息頭的冒號和結束符回車換行進行計算。
LRC字符在回車換行字符前添加到消息幀中。
RTU
當消息幀使用RTU模式,錯誤校驗碼為16位,由兩個8位組成。通過對消息內容進行循環冗余計算(CRC),得到的結果就是錯誤校驗碼。CRC字段是消息的最后一個字段。低位CRC字節先添加到消息中,然后是CRC字段的高字節。消息中最后一個需要發送的字節時CRC高位字節。
總結
以上是生活随笔為你收集整理的协议crc计算_从零了解modbus协议 第三篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器人摘果子看图写话_看图写话——聪明的
- 下一篇: 保存模型后无法训练_模型构建到部署实践