Modbus RTU通訊協(xié)議在數(shù)據(jù)通訊上采用主從應答的方式進行。只能由主機(PC,HMI等)通過唯一從機地址發(fā)起請求,從機(終端設備)根據(jù)主機請求進行響應,即半雙工通訊。該協(xié)議只允許主機發(fā)起請求,從機進行被動響應,因此從機不會主動占用通訊線路造成數(shù)據(jù)沖突。
類似Modbus RTU協(xié)議的主從應答協(xié)議還有西門子的PPI、電表常用的DL/T645-2007等協(xié)議。
一、協(xié)議格式
信息傳輸為異步方式,使用16進制進行通訊,信息幀格式:
地址碼 |
功能碼 |
數(shù)據(jù)區(qū) |
CRC校驗碼 |
1字節(jié) |
1字節(jié) |
N字節(jié) |
2字節(jié) |
地址碼
地址碼是每個通訊信息幀的第一個字節(jié),一般支持1到247,部分設備也支持0地址,用于接收主機的廣播數(shù)據(jù),每個從機在總線上地址必須唯一,只有與主機發(fā)送的地址碼相符的從機才能響應返回數(shù)據(jù)。
功能碼
功能碼是每個通訊信息幀的第二個字節(jié)。主機發(fā)送,通過功能碼告知從機設備應當執(zhí)行何種操作。
常見的八種功能碼:
功能碼 |
定義 |
操作 |
01H |
讀取線圈 |
讀取一個或多個連續(xù)線圈狀態(tài) |
05H |
寫單個線圈 |
操作指定位置的線圈狀態(tài) |
0FH |
寫多個線圈 |
操作多個連續(xù)線圈狀態(tài) |
02H |
讀取離散量輸入 |
讀取一個或多個連續(xù)離散輸入狀態(tài) |
04H |
讀取輸入寄存器 |
讀取一個或多個連續(xù)輸入寄存器數(shù)據(jù) |
03H |
讀保持寄存器 |
讀取一個或多個保持寄存器數(shù)據(jù) |
06H |
寫單個保持寄存器 |
把兩個十六進制數(shù)據(jù)寫入對應位置 |
10H |
寫多個保持寄存器 |
把4*N個十六進制數(shù)據(jù)寫入N個連續(xù)保持寄存器 |
數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)隨功能碼以及數(shù)據(jù)方向的不同而不同,這些數(shù)據(jù)可以是“寄存器首地址+讀取寄存器數(shù)量”、“寄存器地址+操作數(shù)據(jù)”、“寄存器首地址+操作寄存數(shù)量+數(shù)據(jù)長度+數(shù)據(jù)”等不同的組合,在“功能碼分析”詳解不同功能碼的數(shù)據(jù)區(qū)。
Modbus CRC校驗
Modbus RTU協(xié)議常用與工業(yè)現(xiàn)場對數(shù)據(jù)傳輸?shù)姆€(wěn)定性和正確性有較高的要求,因此通過CRC校驗保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
二、錯誤反饋
地址與CRC校驗錯誤并不會收到從機的數(shù)據(jù)反饋,其他錯誤將向主機返回錯誤碼。數(shù)據(jù)幀的第二位加上0X80表示請求發(fā)生錯誤(非法功能碼、非法數(shù)據(jù)值等),錯誤數(shù)據(jù)幀如下:
地址碼 |
功能碼 |
錯誤碼 |
CRC校驗碼 |
1字節(jié) |
1字節(jié) |
1字節(jié) |
2字節(jié) |
常見錯誤碼如下:
值 |
名稱 |
說明 |
01H |
非法的功能碼 |
不支持該功能碼操作寄存器 |
02H |
非法的寄存器地址 |
訪問設備禁止訪問的寄存器 |
03H |
非法的數(shù)據(jù)值 |
寫入不支持的參數(shù)值 |
04H |
從機故障 |
設備工作異常 |
三、通訊信息傳輸過程
通訊命令由主機發(fā)送從機時,與主機發(fā)送的地址碼相符的從機接收通訊命令,如果CRC校驗無誤,則執(zhí)行相應的操作,然后把執(zhí)行結果(數(shù)據(jù))返回給主機。返回信息中包含地址碼、功能碼、執(zhí)行后的數(shù)據(jù)以及CRC校驗碼。如果地址不匹配或者CRC校驗出錯就不返回任何信息。
四、功能碼分析
功能碼01H:讀線圈
例如:主機要讀取從機地址為01H,起始線圈地址為00H的1個線圈狀態(tài),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
01 |
|
起始線圈地址 |
高字節(jié) |
00 |
低字節(jié) |
00 |
|
線圈數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
01 |
|
CRC校驗 |
低字節(jié) |
FD |
高字節(jié) |
CA |
如果從機寄存器00H線圈閉合,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
01 |
|
字節(jié)數(shù) |
01 |
|
線圈狀態(tài) |
01 |
|
CRC校驗碼 |
低字節(jié) |
90 |
高字節(jié) |
48 |
仿真演示:
功能碼05H:寫單個線圈
例如:主機要控制從機地址為01H,線圈地址為0000H的線圈狀態(tài),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
01 |
|
線圈地址 |
高字節(jié) |
00 |
低字節(jié) |
00 |
|
控制方式 |
高字節(jié) |
00(斷開)、FF(閉合) |
低字節(jié) |
01 |
|
CRC校驗 |
低字節(jié) |
XX |
高字節(jié) |
XX |
從機返回與主機請求相同;
仿真演示:
功能碼0FH:寫多個線圈
例如:主機要控制從機地址為01H,起始線圈地址為00H的4個線圈狀態(tài),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
0F |
|
起始線圈地址 |
高字節(jié) |
00 |
低字節(jié) |
00 |
|
線圈數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
04 |
|
寫入字節(jié)數(shù) |
01 |
|
控制方式 |
00(全部斷開)、0F(全部閉合) |
|
CRC校驗 |
低字節(jié) |
XX |
高字節(jié) |
XX |
功能碼0FH操作,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
0F |
|
起始線圈地址 |
高字節(jié) |
00 |
低字節(jié) |
00 |
|
線圈數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
04 |
|
CRC校驗 |
低字節(jié) |
54 |
高字節(jié) |
08 |
仿真演示:
功能碼02H:讀離散輸入
例如:主機要讀取從機地址為01H,起始離散量地址為00H的4個輸入狀態(tài),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
02 |
|
起始離散量地址 |
高字節(jié) |
00 |
低字節(jié) |
00 |
|
讀取數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
04 |
|
CRC校驗 |
低字節(jié) |
79 |
高字節(jié) |
C9 |
如果從機首地址00H開始的4離散輸入全部檢測到輸入,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
02 |
|
字節(jié)數(shù) |
01 |
|
離散輸入狀態(tài) |
0F |
|
CRC校驗碼 |
低字節(jié) |
E1 |
高字節(jié) |
8C |
仿真演示:
功能碼04H:讀取輸入寄存器
例如:主機要讀取從機地址為01H,起始寄存器地址為02H的1個輸入寄存器數(shù)據(jù),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
04 |
|
起始寄存器地址 |
高字節(jié) |
00 |
低字節(jié) |
02 |
|
寄存器數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
01 |
|
CRC校驗 |
低字節(jié) |
90 |
高字節(jié) |
0A |
如果從機輸入寄存器02H的數(shù)據(jù)為3344H,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
04 |
|
字節(jié)數(shù) |
02 |
|
寄存器05H數(shù)據(jù) |
高字節(jié) |
33 |
低字節(jié) |
44 |
|
CRC校驗碼 |
低字節(jié) |
|
高字節(jié) |
F3 |
仿真演示:
功能碼03H:讀保持寄存器
例如:主機要讀取從機地址為01H,起始寄存器地址為05H的2個保持寄存器數(shù)據(jù),主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
03 |
|
起始寄存器地址 |
高字節(jié) |
00 |
低字節(jié) |
05 |
|
寄存器數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
02 |
|
CRC校驗 |
低字節(jié) |
D4 |
高字節(jié) |
0A |
如果從機保持寄存器05H、06H的數(shù)據(jù)為1122H、3344H,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
03 |
|
字節(jié)數(shù) |
04 |
|
寄存器05H數(shù)據(jù) |
高字節(jié) |
11 |
低字節(jié) |
22 |
|
寄存器06H數(shù)據(jù) |
高字節(jié) |
33 |
低字節(jié) |
44 |
|
CRC校驗碼 |
低字節(jié) |
4B |
高字節(jié) |
C6 |
仿真演示:
功能碼06H:寫單個保持寄存器
例如:主機寫入9988H的數(shù)據(jù)給從機地址為01H,寄存器地址為0050H的寄存器,主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
06 |
|
寄存器地址 |
高字節(jié) |
00 |
低字節(jié) |
50 |
|
寫入值 |
高字節(jié) |
99 |
低字節(jié) |
88 |
|
CRC校驗 |
低字節(jié) |
E3 |
高字節(jié) |
ED |
從機返回與主機請求相同;
功能碼10H:寫多個保持寄存器
例如:主機要把數(shù)據(jù)0005H、2233H保存到從機地址為01H,起始寄存器地址為0020H的2個寄存器中,主機發(fā)送:
主機發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
10 |
|
起始寄存器地址 |
高字節(jié) |
00 |
低字節(jié) |
20 |
|
寄存器數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
02 |
|
寫入字節(jié)數(shù) |
04 |
|
0000H 寄存器待寫入 |
高字節(jié) |
00 |
低字節(jié) |
05 |
|
0001H 寄存器待寫入 |
高字節(jié) |
22 |
低字節(jié) |
33 |
|
CRC校驗 |
低字節(jié) |
B9 |
高字節(jié) |
03 |
功能碼10H操作,從機返回:
從機返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
地址碼 |
01 |
|
功能碼 |
10 |
|
起始寄存器地址 |
高字節(jié) |
00 |
低字節(jié) |
20 |
|
寄存器數(shù)量 |
高字節(jié) |
00 |
低字節(jié) |
02 |
|
CRC校驗 |
低字節(jié) |
40 |
高字節(jié) |
02 |
仿真演示:
審核編輯 :李倩
-
協(xié)議
+關注
關注
2文章
592瀏覽量
39053 -
MODBUS
+關注
關注
28文章
1718瀏覽量
76430 -
16進制
+關注
關注
1文章
13瀏覽量
8742
原文標題:Modbus協(xié)議詳解與案例演示
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論