MODBUS-RTU報文模型
設備地址 | 功能代碼 | 數據格式 | CRC校驗L | CRC校驗H |
---|---|---|---|---|
8bit | 8bit | N*8bit | 8bit | 8bit |
一個(ge) 報文就是一幀數據,一個(ge) 數據幀就一個(ge) 報文: 指的是一串完整的指令數據,就像上麵的一串數據。
主機對從機寫數據操作
如果單片機接收到一個(ge) 報文那麽(me) 就對報文進行解析執行相應的處理
0x01 | 06 | 00 01 | 00 17 | 98 04 |
---|---|---|---|---|
從機地址 | 功能號 | 數據地址 | 數據 | CRC校驗 |
主機對從機讀數據操作
0x01 | 03 | 00 01 | 00 01 | D5 CA |
---|---|---|---|---|
從機地址 | 功能號 | 數據地址 | 讀取數據個數 | CRC校驗 |
單片機接收到這串數據根據數據計算CRC校驗判斷數據是否正確,如果判斷數據無誤,則結果是:返回信息給主機,返回的信息也是有格式的:
從(cong) 機對主機返回內(nei) 容
0x01 | 03 | 02 | 00 17 | F8 4A |
---|---|---|---|---|
從機地址 | 功能號 | 數據字節個數 | 兩個字節數據 | CRC校驗 |
這樣MODBUS主機就完成了一次對從(cong) 機數據的讀操作,實現了通訊。
MODBUS-RTU常用功能碼
數據類型 |
讀功能碼 |
寫(xie) 功能碼 |
對象類型 |
離散量輸入 |
02 |
|
單個(ge) 位 |
線圈狀態 |
01 |
05,15 |
單個(ge) 位 |
輸入寄存器 |
04 |
|
16位字 |
保持寄存器 |
03 |
06,16 |
16位字 |
寄存器起始地址(起始數據地址)
數據類型 |
參數地址,寄存器編號 |
離散量輸入 |
00001~0FFFF |
線圈狀態 |
10001~1FFFF |
輸入寄存器 |
30001~3FFFF |
保持寄存器 |
40001~4FFFF |
舉(ju) 例:
Modbus協議中寄存器地址從(cong) 1開始,而實際存儲(chu) 中地址從(cong) 0開始。假如要讀取寄存器編號為(wei) 40005(4為(wei) 塊編號,5為(wei) modbus中寄存器地址)的寄存器的數據,則應把00
04放入報文的地址域。寄存器定義(yi) ,又名碼表或者信息點表,應由廠家提供的。
寄存器編號 |
屬性 |
定義(yi) |
係數 |
備注 |
40001 |
RO |
A相電壓 |
|
從(cong) 40048中讀取電壓係數 |
40002 |
RO |
B相電壓 |
|
如要讀A相電壓,則應將0x00 0x00放入寄存器起始地址域中。
報文實例
1、讀40005、40006兩(liang) 個(ge) 寄存器,假設從(cong) 機地址為(wei) 1
下行報文:01 03 00 04 00 02 85 ca
從(cong) 機地址 |
功能碼 |
寄存器起始地址 |
讀取寄存器個(ge) 數 |
CRC校驗 |
01 |
03 |
00 04 |
00 02 |
85 ca |
上行報文:01 03 04 00 00 00 00 21 33
從(cong) 機地址 |
功能碼 |
返回字節個(ge) 數 |
寄存器40005數據 |
寄存器40006數據 |
CRC校驗 |
01 |
03 |
04 |
00 00 |
00 00 |
21 33 |
2、向40005寄存器中寫(xie) 入0x12,0x34,假設從(cong) 機地址為(wei) 1
下行報文:01 06 00 04 00 01 12 34 4a b0
從(cong) 機地址 |
功能碼 |
寄存器起始地址 |
讀取寄存器個(ge) 數 |
要寫(xie) 入的數據 |
CRC校驗 |
01 |
03 |
00 04 |
00 01 |
12 34 |
85 ca |
上行報文:01 06 00 04 00 01 12 34 4a b0
從(cong) 機地址 |
功能碼 |
寄存器起始地址 |
讀取寄存器個(ge) 數 |
寫(xie) 入的數據 |
CRC校驗 |
01 |
03 |
00 04 |
00 01 |
12 34 |
85 ca |