Modbus通訊協(xié)議詳解
Modbus RTU通訊協(xié)議在數(shù)據(jù)通訊上采用主從應(yīng)答的方式進(jìn)行。只能由主機(jī)(PC,HMI等)通過唯一從機(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é)議。
一、modbus協(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ā)送,通過功能碼告知從機(jī)設(shè)備應(yīng)當(dāng)執(zhí)行何種操作。
常見的八種功能碼:
功能碼 |
定義 |
操作 |
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)定性和正確性有較高的要求,因此通過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é) |
常見錯(cuò)誤碼如下:
值 |
名稱 |
說明 |
01H |
非法的功能碼 |
不支持該功能碼操作寄存器 |
02H |
非法的寄存器地址 |
訪問設(shè)備禁止訪問的寄存器 |
03H |
非法的數(shù)據(jù)值 |
寫入不支持的參數(shù)值 |
04H |
從機(jī)故障 |
設(shè)備工作異常 |
三、通訊信息傳輸過程
通訊命令由主機(jī)發(fā)送從機(jī)時(shí),與主機(jī)發(fā)送的地址碼相符的從機(jī)接收通訊命令,如果CRC校驗(yàn)無誤,則執(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 |
仿真演示:

功能碼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(全部斷開)、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開始的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 |
仿真演示:

審核編輯:湯梓紅
-
MODBUS
+關(guān)注
關(guān)注
28文章
1868瀏覽量
77796 -
通訊協(xié)議
+關(guān)注
關(guān)注
10文章
281瀏覽量
20516 -
RTU
+關(guān)注
關(guān)注
0文章
423瀏覽量
28896
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
modbus協(xié)議講解modbus-rtu以及modbus-tcp協(xié)議詳解
STM32--MODBUS 通訊篇 精選資料分享
請(qǐng)問MODBUS通訊協(xié)議及PLC編程通訊實(shí)例有哪些
Modbus RTU通訊協(xié)議相關(guān)資料下載
Modbus_RTU的通訊方式是什么
Modbus-RTU協(xié)議包括哪些呢
如何快速實(shí)現(xiàn)Modbus RTU和Modbus TCP協(xié)議轉(zhuǎn)換?
Modbus-RTU協(xié)議

C#上位機(jī):Modbus RTU通訊實(shí)例

Modbus-RTU通訊協(xié)議是什么?
Profibus PA轉(zhuǎn)Modbus RTU協(xié)議網(wǎng)關(guān)

評(píng)論