modbus協議數據格式


---

說明:

modbus協議一般適用於一個主設備訪問多個從設備的硬件開發環境,類似於zigbee網絡中的一個路由器多個協調器的一對多模型。

modbus常用的寄存器類型為 3X 輸入寄存器和 4X保持寄存器

從機3X 輸入寄存器對主機來說是可讀不可寫狀態,從機4X 保持寄存器對主機來說是可讀可寫狀態

---

功能碼含義

04:讀取輸入寄存器(3x)

03:讀取保持寄存器(4x)

06:寫入單個保持寄存器(4x)

16:寫入多個保持寄存器(4x)

---

常用的數據格式:

主機讀取從機輸入寄存器數據格式:

數據實例:03 04 05 61 00 01 61 3A

分解:

03         04      05          61
modbus地址  功能碼  寄存器地址高  寄存器地址低                   

00          01          61            3A
寄存器數量高  寄存器數量低  CRC校驗碼低位  CRC校驗碼高位

 

解釋:

主機讀取modbus地址為03的從機輸入寄存器,從0x0561(十進制為1377)地址開始讀取一個寄存器。

讀取讀取從機輸入寄存器返回數據格式:

03         04    02   00 02   41   31
modbus地址 功能碼 字節數 數據... CRC低 CRC高

-------

主機讀取從機保持寄存器數據格式:

數據實例:03 03 15 1a 00 01 A0 23

分解:

03          03    15          1A                 
modbus地址  功能碼  寄存器地址高   寄存器地址低  

00          01          A0    23
寄存器數量高  寄存器數量低  CRC低 CRC高

解釋:

  主機讀取modbus地址為03的從機保持寄存器,從0x151a(十進制為5402)地址開始讀取一個寄存器。

讀取讀取從機保持寄存器返回數據格式:

03         03    02   00 02   40   45
modbus地址 功能碼 字節數 數據... CRC低 CRC高

---

主機寫入單個保持寄存器數據格式:

數據實例:03 06 15 1a 00 32 2C 36

分解:

03          06    15          1A 
modbus地址  功能碼 寄存器地址高   寄存器地址低                   

00       32     2C    36
數據高    數據低  CRC低 CRC高

 

解釋:

  主機寫入modbus地址為03從機一個保持寄存器數據,從0x151a(十進制為5402)地址開始寫入一個寄存器,寫入數據為0x0032。

---

寫入單個保持寄存器返回數據格式:

如果寫入成功,返回數據和寫入數據相同

 

主機寫入多個保持寄存器數據格式:

數據實例:03 10 14 56 00 02 04 00 00 00 50 82 3D

分解:
03 10 14 56 modbus地址 功能碼 寄存器地址高 寄存器地址低 00 02 04 00 00 00 50 寄存器數量高 寄存器數量低 字節數 數據 (從高到低依次) 82 3D CRC低 CRC高

 

解釋:

  主機寫入modbus地址為03從機兩個保持寄存器數據,從0x1456(十進制為5206)地址開始寫入兩個寄存器,寫入數據為0x0000、0x0050。

 

寫入多個保持寄存器返回數據格式:

03         10   14         56 
modbus地址 功能碼 寄存器地址高 寄存器地址低 
00 02 A5 CA 寄存器數據高 寄存器數量低 CRC低 CRC高

 

常用功能碼:

數據類型 功能描述 功能碼 功能碼(Hex) 異常功能碼(hex)
輸入寄存器 讀寄存器 04 0x04 0x84
保持寄存器 讀寄存器     03 0x03 0x83
寫寄存器 06 0x06 0x86
寫寄存器 16 0x10 0x90

 

 

 

 

 

 

 

這個是我自己使用c代碼模擬的modbus數據協議打包格式

鏈接:https://pan.baidu.com/s/1AAflWfiBEh6l6lTAiwwWEQ
提取碼:11os

常用接口有:
//讀取輸入寄存器
int read_input_registers;
//讀取保持寄存器
int read_hold_registers;
//寫單個保持寄存器
int write_hold_register;
//寫多個保持寄存器
int write_hold_registers;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM