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