目錄
- Modbus通訊協議初學
- 什么是Modbus?
- Modbus用來做什么?
- 4個種類的寄存器
- 協議速記
- 功能碼
- Modbus 報文幀
- 示例解讀
Modbus通訊協議初學
什么是Modbus?
顧名思義,它是一個bus,即總線協議。比如串口協議、IIC協議、SPI都是通訊協議。你接觸到這種協議,相信你所處的行業是工業方面或者你的產品用于工業。
Modbus用來做什么?
用兩個來概括:通訊。
4個種類的寄存器
線圈狀態(Coil Status) 可讀可寫
離 散 輸入狀 態(Discrete Input Status) 只讀
保 持 寄 存 器(Holding Register) 可讀可寫
輸 入 寄 存 器( Input Register)只讀
協議速記
Modbus 是一主多從的協議
主控發出的數據里,必定含有如下信息:
① 設備地址:你要訪問從設備 1,還是訪問從設備 2
② 訪問哪類寄存器,是讀還是寫,只訪問 1 個寄存器,還是多個寄存器:這被稱為功能碼
③ 起始寄存器地址、寄存器數量:這在數據里定義
④ 為了保證數據傳輸的可靠,還附帶有 CRC 檢驗碼
以 Modbus RTU 協議為例,主控發出的數據包格式如下:
功能碼
功能代碼有哪些?常用的功能碼如下:
① 讀線圈狀態(01)
② 讀離散輸入狀態(02)
③ 寫單個線圈(05)、寫多個線圈(15)
④ 讀保持寄存器(03)
⑤ 讀輸入寄存器(04)
⑥ 寫單個保存寄存器(06)、寫多個保存寄存器(16)
Modbus 報文幀
一個報文就是一幀數據,一個數據幀就一個報文: 指的是一串完整的指令數據,本質就是一串數據。
Modbus 報文是指主機發送給從機的一幀數據,其中包含著從機的地址,主機想執行的操作,校驗碼等內容。
Modbus 協議 RTU 報文格式如下所示:
幀結構 = 地址 + 功能嗎 + 數據 + 校驗
地址: 占用一個字節,范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應答所有地址,正常的需要兩個設備的地址一樣才能進行查詢和回復)。
功能碼:占用一個字節,功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機的數據,也可以修改數據,所以不同功能碼對應不同功能。
數據:根據功能碼不同,有不同結構,在后續的實例中有說明。
校驗:為了保證數據不錯誤,增加這個,然后再把前面的數據進行計算看數據是否一致,如果一致,就說明這幀數據是正確的,我再回復;如果不一樣,說明你這個數據在傳輸的時候出了問題,數據不對的,所以就拋棄了。
示例解讀
以(0x01)讀取線圈為例
從我上圖的這個例子中,進行如下的解析
主機發送:07 01 00 00 00 08 3D AA
從機回復:07 01 01 20 50 D8解析如下:
07(從設備地址) 01(功能碼) 00 00(起始地址16bit,高位在前,低位在后) 00 08(寄存器數16bit 高位在前,低位在后) 3D AA (CRC校驗) 07(從設備地址) 01(功能碼) 01(數據域字節數) 20(數據 1) 50 D8(校驗)
參考資料:
https://blog.csdn.net/qq_39400113/article/details/118369506