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