Modbus RTU通訊協(xié)議在數(shù)據(jù)通訊上采用主從應(yīng)答的方式進(jìn)行。只能由主機(jī)(PC,HMI等)通過(guò)唯一從機(jī)地址發(fā)起請(qǐng)求,從機(jī)(終端設(shè)備)根據(jù)主機(jī)請(qǐng)求進(jìn)行響應(yīng),即半雙工通訊。該協(xié)議只允許主機(jī)發(fā)起請(qǐng)求,從機(jī)進(jìn)行被動(dòng)響應(yīng),因此從機(jī)不會(huì)主動(dòng)占用通訊線路造成數(shù)據(jù)沖突。
類似Modbus RTU協(xié)議的主從應(yīng)答協(xié)議還有西門子的PPI、電表常用的DL/T645-2007等協(xié)議。
一、協(xié)議格式
信息傳輸為異步方式,使用16進(jìn)制進(jìn)行通訊,信息幀格式:
|
地址碼 |
功能碼 |
數(shù)據(jù)區(qū) |
CRC校驗(yàn)碼 |
|
1字節(jié) |
1字節(jié) |
N字節(jié) |
2字節(jié) |
地址碼
地址碼是每個(gè)通訊信息幀的第一個(gè)字節(jié),一般支持1到247,部分設(shè)備也支持0地址,用于接收主機(jī)的廣播數(shù)據(jù),每個(gè)從機(jī)在總線上地址必須唯一,只有與主機(jī)發(fā)送的地址碼相符的從機(jī)才能響應(yīng)返回?cái)?shù)據(jù)。
功能碼
功能碼是每個(gè)通訊信息幀的第二個(gè)字節(jié)。主機(jī)發(fā)送,通過(guò)功能碼告知從機(jī)設(shè)備應(yīng)當(dāng)執(zhí)行何種操作。
常見(jiàn)的八種功能碼:
|
功能碼 |
定義 |
操作 |
|
01H |
讀取線圈 |
讀取一個(gè)或多個(gè)連續(xù)線圈狀態(tài) |
|
05H |
寫單個(gè)線圈 |
操作指定位置的線圈狀態(tài) |
|
0FH |
寫多個(gè)線圈 |
操作多個(gè)連續(xù)線圈狀態(tài) |
|
02H |
讀取離散量輸入 |
讀取一個(gè)或多個(gè)連續(xù)離散輸入狀態(tài) |
|
04H |
讀取輸入寄存器 |
讀取一個(gè)或多個(gè)連續(xù)輸入寄存器數(shù)據(jù) |
|
03H |
讀保持寄存器 |
讀取一個(gè)或多個(gè)保持寄存器數(shù)據(jù) |
|
06H |
寫單個(gè)保持寄存器 |
把兩個(gè)十六進(jìn)制數(shù)據(jù)寫入對(duì)應(yīng)位置 |
|
10H |
寫多個(gè)保持寄存器 |
把4*N個(gè)十六進(jìn)制數(shù)據(jù)寫入N個(gè)連續(xù)保持寄存器 |
數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)隨功能碼以及數(shù)據(jù)方向的不同而不同,這些數(shù)據(jù)可以是“寄存器首地址+讀取寄存器數(shù)量”、“寄存器地址+操作數(shù)據(jù)”、“寄存器首地址+操作寄存數(shù)量+數(shù)據(jù)長(zhǎng)度+數(shù)據(jù)”等不同的組合,在“功能碼分析”詳解不同功能碼的數(shù)據(jù)區(qū)。
Modbus CRC校驗(yàn)
Modbus RTU協(xié)議常用與工業(yè)現(xiàn)場(chǎng)對(duì)數(shù)據(jù)傳輸?shù)姆€(wěn)定性和正確性有較高的要求,因此通過(guò)CRC校驗(yàn)保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
二、錯(cuò)誤反饋
地址與CRC校驗(yàn)錯(cuò)誤并不會(huì)收到從機(jī)的數(shù)據(jù)反饋,其他錯(cuò)誤將向主機(jī)返回錯(cuò)誤碼。數(shù)據(jù)幀的第二位加上0X80表示請(qǐng)求發(fā)生錯(cuò)誤(非法功能碼、非法數(shù)據(jù)值等),錯(cuò)誤數(shù)據(jù)幀如下:
|
地址碼 |
功能碼 |
錯(cuò)誤碼 |
CRC校驗(yàn)碼 |
|
1字節(jié) |
1字節(jié) |
1字節(jié) |
2字節(jié) |
常見(jiàn)錯(cuò)誤碼如下:
|
值 |
名稱 |
說(shuō)明 |
|
01H |
非法的功能碼 |
不支持該功能碼操作寄存器 |
|
02H |
非法的寄存器地址 |
訪問(wèn)設(shè)備禁止訪問(wèn)的寄存器 |
|
03H |
非法的數(shù)據(jù)值 |
寫入不支持的參數(shù)值 |
|
04H |
從機(jī)故障 |
設(shè)備工作異常 |
三、通訊信息傳輸過(guò)程
通訊命令由主機(jī)發(fā)送從機(jī)時(shí),與主機(jī)發(fā)送的地址碼相符的從機(jī)接收通訊命令,如果CRC校驗(yàn)無(wú)誤,則執(zhí)行相應(yīng)的操作,然后把執(zhí)行結(jié)果(數(shù)據(jù))返回給主機(jī)。返回信息中包含地址碼、功能碼、執(zhí)行后的數(shù)據(jù)以及CRC校驗(yàn)碼。如果地址不匹配或者CRC校驗(yàn)出錯(cuò)就不返回任何信息。
四、功能碼分析
功能碼01H:讀線圈
例如:主機(jī)要讀取從機(jī)地址為01H,起始線圈地址為00H的1個(gè)線圈狀態(tài),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
01 |
|
|
起始線圈地址 |
高字節(jié) |
00 |
|
低字節(jié) |
00 |
|
|
線圈數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
01 |
|
|
CRC校驗(yàn) |
低字節(jié) |
FD |
|
高字節(jié) |
CA |
|
如果從機(jī)寄存器00H線圈閉合,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
01 |
|
|
字節(jié)數(shù) |
01 |
|
|
線圈狀態(tài) |
01 |
|
|
CRC校驗(yàn)碼 |
低字節(jié) |
90 |
|
高字節(jié) |
48 |
|
仿真演示:

功能碼05H:寫單個(gè)線圈
例如:主機(jī)要控制從機(jī)地址為01H,線圈地址為0000H的線圈狀態(tài),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
01 |
|
|
線圈地址 |
高字節(jié) |
00 |
|
低字節(jié) |
00 |
|
|
控制方式 |
高字節(jié) |
00(斷開(kāi))、FF(閉合) |
|
低字節(jié) |
01 |
|
|
CRC校驗(yàn) |
低字節(jié) |
XX |
|
高字節(jié) |
XX |
|
從機(jī)返回與主機(jī)請(qǐng)求相同;
仿真演示:

功能碼0FH:寫多個(gè)線圈
例如:主機(jī)要控制從機(jī)地址為01H,起始線圈地址為00H的4個(gè)線圈狀態(tài),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
0F |
|
|
起始線圈地址 |
高字節(jié) |
00 |
|
低字節(jié) |
00 |
|
|
線圈數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
04 |
|
|
寫入字節(jié)數(shù) |
01 |
|
|
控制方式 |
00(全部斷開(kāi))、0F(全部閉合) |
|
|
CRC校驗(yàn) |
低字節(jié) |
XX |
|
高字節(jié) |
XX |
|
功能碼0FH操作,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
0F |
|
|
起始線圈地址 |
高字節(jié) |
00 |
|
低字節(jié) |
00 |
|
|
線圈數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
04 |
|
|
CRC校驗(yàn) |
低字節(jié) |
54 |
|
高字節(jié) |
08 |
|
仿真演示:

功能碼02H:讀離散輸入
例如:主機(jī)要讀取從機(jī)地址為01H,起始離散量地址為00H的4個(gè)輸入狀態(tài),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
02 |
|
|
起始離散量地址 |
高字節(jié) |
00 |
|
低字節(jié) |
00 |
|
|
讀取數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
04 |
|
|
CRC校驗(yàn) |
低字節(jié) |
79 |
|
高字節(jié) |
C9 |
|
如果從機(jī)首地址00H開(kāi)始的4離散輸入全部檢測(cè)到輸入,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
02 |
|
|
字節(jié)數(shù) |
01 |
|
|
離散輸入狀態(tài) |
0F |
|
|
CRC校驗(yàn)碼 |
低字節(jié) |
E1 |
|
高字節(jié) |
8C |
|
仿真演示:

功能碼04H:讀取輸入寄存器
例如:主機(jī)要讀取從機(jī)地址為01H,起始寄存器地址為02H的1個(gè)輸入寄存器數(shù)據(jù),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
04 |
|
|
起始寄存器地址 |
高字節(jié) |
00 |
|
低字節(jié) |
02 |
|
|
寄存器數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
01 |
|
|
CRC校驗(yàn) |
低字節(jié) |
90 |
|
高字節(jié) |
0A |
|
如果從機(jī)輸入寄存器02H的數(shù)據(jù)為3344H,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
04 |
|
|
字節(jié)數(shù) |
02 |
|
|
寄存器05H數(shù)據(jù) |
高字節(jié) |
33 |
|
低字節(jié) |
44 |
|
|
CRC校驗(yàn)碼 |
低字節(jié) |
|
|
高字節(jié) |
F3 |
|
仿真演示:

功能碼03H:讀保持寄存器
例如:主機(jī)要讀取從機(jī)地址為01H,起始寄存器地址為05H的2個(gè)保持寄存器數(shù)據(jù),主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
03 |
|
|
起始寄存器地址 |
高字節(jié) |
00 |
|
低字節(jié) |
05 |
|
|
寄存器數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
02 |
|
|
CRC校驗(yàn) |
低字節(jié) |
D4 |
|
高字節(jié) |
0A |
|
如果從機(jī)保持寄存器05H、06H的數(shù)據(jù)為1122H、3344H,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
03 |
|
|
字節(jié)數(shù) |
04 |
|
|
寄存器05H數(shù)據(jù) |
高字節(jié) |
11 |
|
低字節(jié) |
22 |
|
|
寄存器06H數(shù)據(jù) |
高字節(jié) |
33 |
|
低字節(jié) |
44 |
|
|
CRC校驗(yàn)碼 |
低字節(jié) |
4B |
|
高字節(jié) |
C6 |
|
仿真演示:

功能碼06H:寫單個(gè)保持寄存器
例如:主機(jī)寫入9988H的數(shù)據(jù)給從機(jī)地址為01H,寄存器地址為0050H的寄存器,主機(jī)發(fā)送:
|
主機(jī)發(fā)送 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
06 |
|
|
寄存器地址 |
高字節(jié) |
00 |
|
低字節(jié) |
50 |
|
|
寫入值 |
高字節(jié) |
99 |
|
低字節(jié) |
88 |
|
|
CRC校驗(yàn) |
低字節(jié) |
E3 |
|
高字節(jié) |
ED |
|
從機(jī)返回與主機(jī)請(qǐng)求相同;

功能碼10H:寫多個(gè)保持寄存器
例如:主機(jī)要把數(shù)據(jù)0005H、2233H保存到從機(jī)地址為01H,起始寄存器地址為0020H的2個(gè)寄存器中,主機(jī)發(fā)送:
|
主機(jī)發(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校驗(yàn) |
低字節(jié) |
B9 |
|
高字節(jié) |
03 |
|
功能碼10H操作,從機(jī)返回:
|
從機(jī)返回 |
發(fā)送數(shù)據(jù)(HEX) |
|
|
地址碼 |
01 |
|
|
功能碼 |
10 |
|
|
起始寄存器地址 |
高字節(jié) |
00 |
|
低字節(jié) |
20 |
|
|
寄存器數(shù)量 |
高字節(jié) |
00 |
|
低字節(jié) |
02 |
|
|
CRC校驗(yàn) |
低字節(jié) |
40 |
|
高字節(jié) |
02 |
|
仿真演示:

審核編輯 :李倩
-
協(xié)議
+關(guān)注
關(guān)注
2文章
619瀏覽量
41119 -
MODBUS
+關(guān)注
關(guān)注
28文章
2464瀏覽量
83398 -
16進(jìn)制
+關(guān)注
關(guān)注
1文章
13瀏覽量
9111
原文標(biāo)題:Modbus協(xié)議詳解與案例演示
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
PROFIBUS轉(zhuǎn)MODBUS協(xié)議轉(zhuǎn)換網(wǎng)關(guān):玻璃制造“智能熔爐”的數(shù)據(jù)紐帶
Modbus協(xié)議的深度剖析
Modbus協(xié)議轉(zhuǎn)HTTP協(xié)議,實(shí)現(xiàn)JSON格式對(duì)接MES等系統(tǒng)平臺(tái)
邁向工業(yè)4.0的第一步:從Modbus無(wú)線傳輸開(kāi)始
【RA4M2-SENSOR】—— 10.實(shí)現(xiàn)modbus從站協(xié)議棧
協(xié)議轉(zhuǎn)換魔法師”:Modbus轉(zhuǎn)Profinet網(wǎng)關(guān)如何讓變頻器“開(kāi)口說(shuō)話”
什么是Modbus TCP協(xié)議
Modbus協(xié)議轉(zhuǎn)換:讓工業(yè)設(shè)備輕松“對(duì)話”
Modbus轉(zhuǎn)Profinet網(wǎng)關(guān):工控機(jī)的“逆襲神器”
告別協(xié)議沖突!Modbus轉(zhuǎn)Profinet助力風(fēng)速風(fēng)向儀無(wú)縫對(duì)接
DLT645協(xié)議和Modbus協(xié)議有什么區(qū)別
西門子200smart ST20與三菱FX5U-64MT/ES的Modbus TCP通信
從"聾啞設(shè)備"到超級(jí)工廠:EtherCAT轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)正在重構(gòu)工業(yè)未來(lái)
Modbus協(xié)議詳解與案例演示
評(píng)論