一、MODBUS RTU簡介
MODBUS RTU(Remote Terminal Unit)是一種基于串行通信(RS-485/RS-232)的工業標準協議,采用二進制數據格式,具有高效、可靠的特點,廣泛應用于PLC、傳感器、變頻器等工業設備。
1. 主要特點
-
通信方式:主從模式(Master/Slave)
-
傳輸介質:RS-485(推薦)/ RS-232
-
數據格式:二進制(HEX)
-
校驗方式:CRC-16(循環冗余校驗)
-
默認波特率:9600、19200、38400、115200等
-
最大從站地址:247(地址范圍1~247,0為廣播地址)
二、MODBUS RTU數據幀格式
1. 基本幀結構
字段 | 說明 | 長度(字節) |
---|---|---|
從站地址 | 設備地址(1~247) | 1 |
功能碼 | 操作類型(讀/寫等) | 1 |
數據域 | 寄存器地址、數據等 | N |
CRC校驗 | 循環冗余校驗(低字節在前) | 2 |
2. 常用功能碼
功能碼 | 名稱 | 操作 |
---|---|---|
01 | 讀取線圈狀態 | 讀取單個/多個DO(0x/1x) |
02 | 讀取輸入狀態 | 讀取DI(1x) |
03 | 讀取保持寄存器 | 讀取多個AO(4x) |
04 | 讀取輸入寄存器 | 讀取AI(3x) |
05 | 寫單個線圈 | 控制單個DO(0x) |
06 | 寫單個寄存器 | 寫入單個AO(4x) |
10(0x10) | 寫多個寄存器 | 寫入多個AO(4x) |
三、MODBUS RTU通信示例
1. 讀取保持寄存器(功能碼03)
請求幀(Master → Slave):
[從站地址][功能碼][起始地址高8位][起始地址低8位][寄存器數量高8位][寄存器數量低8位][CRC低8位][CRC高8位]
示例:讀取從站地址1的保持寄存器40001(0x0000),讀取1個寄存器
01 03 00 00 00 01 84 0A
解析:
-
01
:從站地址1 -
03
:功能碼03(讀保持寄存器) -
00 00
:寄存器地址0x0000(對應40001) -
00 01
:讀取1個寄存器 -
84 0A
:CRC校驗
響應幀(Slave → Master):
[從站地址][功能碼][字節數][數據1高8位][數據1低8位][CRC低8位][CRC高8位]
示例:返回數據1234(0x04D2)
01 03 02 04 D2 B8 5F
解析:
-
01
:從站地址1 -
03
:功能碼03 -
02
:返回2字節數據 -
04 D2
:數據0x04D2(十進制1234) -
B8 5F
:CRC校驗
四、MODBUS RTU調試方法
1. 使用串口調試助手
-
連接設備:
-
使用USB轉485轉換器連接PC和設備
-
確保A/B線正確連接(A-A,B-B)
-
終端電阻(120Ω)在長距離通信時需啟用
-
-
參數設置:
-
波特率:9600(默認)
-
數據位:8
-
停止位:1
-
校驗位:無
-
-
發送MODBUS RTU指令:
-
輸入16進制格式指令,如?
01 03 00 00 00 01 84 0A
-
點擊發送,觀察返回數據
-
-
解析響應:
-
檢查返回的CRC是否正確
-
解析數據域(如?
04 D2
?表示1234)
-
2. 使用MODBUS Poll(專業調試工具)
-
可自動計算CRC
-
支持多種功能碼測試
-
提供數據解析和圖表顯示
五、CRC-16校驗計算
MODBUS RTU采用CRC-16校驗,計算步驟如下(C語言示例):
c
#include <stdint.h>uint16_t crc16(uint8_t *data, uint16_t length) {uint16_t crc = 0xFFFF;for (uint16_t i = 0; i < length; i++) {crc ^= data[i];for (uint8_t j = 0; j < 8; j++) {if (crc & 0x0001) {crc >>= 1;crc ^= 0xA001;} else {crc >>= 1;}}}return crc; }
示例:
計算?01 03 00 00 00 01
?的CRC:
c
uint8_t data[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01}; uint16_t crc = crc16(data, 6); // 返回 0x840A(低字節在前:0A 84)
六、常見問題與解決方案
問題 | 可能原因 | 解決方案 |
---|---|---|
無響應 | 1. 接線錯誤(A/B反接) 2. 波特率不匹配 3. 從站地址錯誤 | 檢查接線、波特率、地址 |
CRC校驗錯誤 | 1. 數據損壞 2. 校驗算法錯誤 | 檢查通信線路,重新計算CRC |
返回異常碼(錯誤響應) | 1. 功能碼不支持 2. 寄存器不存在 | 檢查設備文檔,確認功能碼和寄存器范圍 |
七、總結
-
MODBUS RTU是工業自動化中最常用的串行通信協議之一。
-
數據幀包含?地址+功能碼+數據+CRC,采用?16進制(HEX)?傳輸。
-
調試時需確保?波特率、數據位、停止位、校驗位?一致。
-
CRC校驗?是確保數據完整性的關鍵。
掌握MODBUS RTU協議,可以高效調試PLC、傳感器、變頻器等設備,適用于工業自動化、SCADA系統、能源監控等場景。 🚀