Modbus通訊協(xié)議詳解
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é)議還有西門(mén)子的PPI、電表常用的DL/T645-2007等協(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 | 寫(xiě)單個(gè)線圈 | 操作指定位置的線圈狀態(tài) |
0FH | 寫(xiě)多個(gè)線圈 | 操作多個(gè)連續(xù)線圈狀態(tài) |
02H | 讀取離散量輸入 | 讀取一個(gè)或多個(gè)連續(xù)離散輸入狀態(tài) |
04H | 讀取輸入寄存器 | 讀取一個(gè)或多個(gè)連續(xù)輸入寄存器數(shù)據(jù) |
03H | 讀保持寄存器 | 讀取一個(gè)或多個(gè)保持寄存器數(shù)據(jù) |
06H | 寫(xiě)單個(gè)保持寄存器 | 把兩個(gè)十六進(jìn)制數(shù)據(jù)寫(xiě)入對(duì)應(yīng)位置 |
10H | 寫(xiě)多個(gè)保持寄存器 | 把4*N個(gè)十六進(jìn)制數(shù)據(jù)寫(xiě)入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 RTU協(xié)議常用與工業(yè)現(xiàn)場(chǎng)對(duì)數(shù)據(jù)傳輸?shù)姆€(wěn)定性和正確性有較高的要求,因此通過(guò)CRC校驗(yàn)保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
地址與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ù)值 | 寫(xiě)入不支持的參數(shù)值 |
04H | 從機(jī)故障 | 設(shè)備工作異常 |
通訊命令由主機(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ò)就不返回任何信息。
例如:主機(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 |
仿真演示:
例如:主機(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 | |
寫(xiě)入字節(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 |
仿真演示:
例如:主機(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 |
仿真演示:
例如:主機(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é) | AD |
高字節(jié) | F3 |
仿真演示:
例如:主機(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 |
仿真演示:
例如:主機(jī)寫(xiě)入9988H的數(shù)據(jù)給從機(jī)地址為01H,寄存器地址為0050H的寄存器,主機(jī)發(fā)送:
主機(jī)發(fā)送 | 發(fā)送數(shù)據(jù)(HEX) | |
地址碼 | 01 | |
功能碼 | 06 | |
寄存器地址 | 高字節(jié) | 00 |
低字節(jié) | 50 | |
寫(xiě)入值 | 高字節(jié) | 99 |
低字節(jié) | 88 | |
CRC校驗(yàn) | 低字節(jié) | E3 |
高字節(jié) | ED |
從機(jī)返回與主機(jī)請(qǐng)求相同;
例如:主機(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 | |
寫(xiě)入字節(jié)數(shù) | 04 | |
0000H 寄存器待寫(xiě)入 | 高字節(jié) | 00 |
低字節(jié) | 05 | |
0001H 寄存器待寫(xiě)入 | 高字節(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 |
仿真演示:
今天的分享就到這里啦,億佰特人每一天都致力于更好的助力物聯(lián)化、智能化、自動(dòng)化的發(fā)展,提升資源利用率,更多產(chǎn)品更多資料,感興趣的小伙伴可以登錄我們的官網(wǎng)進(jìn)行了解,還有客服小姐姐在線答疑哦!