---
說明:
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;