【導(dǎo)讀】【視頻+圖文】詳解ModbusTCP協(xié)議。
概述
Modbus由MODICON公司于1979年開發(fā),是一種工業(yè)現(xiàn)場總線協(xié)議標(biāo)準(zhǔn)。1996年施耐德公司推出基于以太網(wǎng)TCP/IP的Modbus協(xié)議:ModbusTCP。Modbus協(xié)議是一項應(yīng)用層報文傳輸協(xié)議,包括ASCII、RTU、TCP三種報文類型。標(biāo)準(zhǔn)的Modbus協(xié)議物理層接口有RS232、RS422、RS485和以太網(wǎng)接口,采用master/slave方式通信。
Modbus TCP數(shù)據(jù)幀
ModbusTCP的數(shù)據(jù)幀可分為兩部分:MBAP+PDU。
(一)報文頭MBAP :MBAP為報文頭,長度為7字節(jié),組成如下:
(二)幀結(jié)構(gòu)PDU :PDU由功能碼+數(shù)據(jù)組成。功能碼為1字節(jié),數(shù)據(jù)長度不定,由具體功能決定。
(1)功能碼: Modbus的操作對象有四種:線圈、離散輸入、保持寄存器、輸入寄存器。
(2)根據(jù)對象的不同,Modbus的功能碼有:
(3)說明更詳細(xì)的表:
PDU詳細(xì)結(jié)構(gòu)
(1)0x01:讀線圈: 在從站中讀1~2000個連續(xù)線圈狀態(tài),ON=1,OFF=0
請求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(一個地址的數(shù)據(jù)為1位)
如:在從站0x01中,讀取開始地址為0x0002的線圈數(shù)據(jù),讀0x0008位
00 01 00 00 00 06 01 01 00 02 00 08
回:數(shù)據(jù)長度為0x01個字節(jié),數(shù)據(jù)為0x01,第一個線圈為ON,其余為OFF
00 01 00 00 00 04 01 01 01 01
(2)0x05:寫單個線圈: 將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出為ON,0x000請求輸出為OFF。
請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
響應(yīng):MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節(jié))
如:將地址為0x0003的線圈設(shè)為ON
00 01 00 00 00 06 01 05 00 03 FF 00
回:寫入成功
00 01 00 00 00 06 01 05 00 03 FF 00
(3)0x0F:寫多個線圈: 將一個從站中的一個線圈序列的每個線圈都強(qiáng)制為ON或OFF,數(shù)據(jù)域中置1的位請求相應(yīng)輸出位ON,置0的位請求響應(yīng)輸出為OFF。
請求:MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L 字節(jié)長度 輸出值H 輸出值L
響應(yīng):MBAP 功能碼 起始地址H 起始地址L 輸出數(shù)量H 輸出數(shù)量L
(4)0x02:讀離散量輸入: 從一個從站中讀1~2000個連續(xù)的離散量輸入狀態(tài)。
請求:MBAP 功能碼 起始地址H 起始地址L 數(shù)量H 數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 數(shù)據(jù)(長度:9+ceil(數(shù)量/8))
如:從地址0x0000開始讀0x0012個離散量輸入
00 01 00 00 00 06 01 02 00 00 00 12
回:數(shù)據(jù)長度為0x03個字節(jié),數(shù)據(jù)為0x01 04 00,表示第一個離散量輸入和第11個離散量輸入為ON,其余為OFF
00 01 00 00 00 06 01 02 03 01 04 00
(5)0x04:讀輸入寄存器: 從一個遠(yuǎn)程設(shè)備中讀1~2000個連續(xù)輸入寄存器。
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
如:讀起始地址為0x0002,數(shù)量為0x0005的寄存器數(shù)據(jù)
00 01 00 00 00 06 01 04 00 02 00 05
回:數(shù)據(jù)長度為0x0A,第一個寄存器的數(shù)據(jù)為0x0c,其余為0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
(6)0x03:讀保持寄存器: 從遠(yuǎn)程設(shè)備中讀保持寄存器連續(xù)塊的內(nèi)容。
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
響應(yīng):MBAP 功能碼 數(shù)據(jù)長度 寄存器數(shù)據(jù)(長度:9+寄存器數(shù)量×2)
如:起始地址是0x0000,寄存器數(shù)量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
回:數(shù)據(jù)長度為0x06,第一個寄存器的數(shù)據(jù)為0x21,其余為0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
(7)0x06:寫單個保持寄存器: 在一個遠(yuǎn)程設(shè)備中寫一個保持寄存器。
請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
響應(yīng):MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節(jié))
如:向地址是0x0000的寄存器寫入數(shù)據(jù)0x000A
00 01 00 00 00 06 01 06 00 00 00 0A
回:寫入成功
00 01 00 00 00 06 01 06 00 00 00 0A
(8)0x10:寫多個保持寄存器: 在一個遠(yuǎn)程設(shè)備中寫連續(xù)寄存器塊(1~123個寄存器)。
請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L 字節(jié)長度 寄存器值(13+寄存器數(shù)量×2)
響應(yīng):MBAP 功能碼 起始地址H 起始地址L 寄存器數(shù)量H 寄存器數(shù)量L(共12字節(jié))
如:向起始地址為0x0000,數(shù)量為0x0001的寄存器寫入數(shù)據(jù),數(shù)據(jù)長度為0x02,數(shù)據(jù)為0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
回:寫入成功
00 01 00 00 00 06 01 10 00 00 00 01
Modbus TCP示例報文
ModBusTcp與串行鏈路Modbus的數(shù)據(jù)域是一致的,具體數(shù)據(jù)域可以參考串行Modbus。這里給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。
Modbus TCP通信
(一)通信方式
Modbus設(shè)備可分為主站(poll)和從站(slave)。主站只有一個,從站有多個,主站向各從站發(fā)送請求幀,從站給予響應(yīng)。在使用TCP通信時,主站為client端,主動建立連接;從站為server端,等待連接。
主站請求:功能碼+數(shù)據(jù)
從站正常響應(yīng):請求功能碼+響應(yīng)數(shù)據(jù)
從站異常響應(yīng):異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯類型
需要超時管理機(jī)制,避免無期限的等待可能不出現(xiàn)的應(yīng)答
IANA(Internet Assigned Numbers Authority,互聯(lián)網(wǎng)編號分配管理機(jī)構(gòu))給Modbus協(xié)議賦予TCP端口號為 502 ,這是目前在儀表與自動化行業(yè)中唯一分配到的端口號。
(二)通信過程
connect 建立TCP連接
準(zhǔn)備Modbus報文
使用send命令發(fā)送報文
在同一連接下等待應(yīng)答
使用recv命令讀取報文,完成一次數(shù)據(jù)交換
通信任務(wù)結(jié)束時,關(guān)閉TCP連接
仿真軟件
Modbus poll 和Modbus slave是一組Modbus仿真軟件,可以實現(xiàn)Modbus RTU、TCP、串口仿真等。
仿真軟件網(wǎng)址:https://modbustools.com/download.html
在ModbusTCP中,Modbus poll 作為客戶端請求數(shù)據(jù),Modbus slave 作為服務(wù)器端處理請求。
使用c語言編寫客戶端連接Modbus slave時,注意數(shù)據(jù)格式,一條指令一次性發(fā)出,否則連接會出錯。
使用軟件時,需要指定功能碼,在setup->slave definition或者poll definition中進(jìn)行設(shè)置。
– slave ID:從站編號(事務(wù)標(biāo)識符)
– function:功能碼,0x01對應(yīng)線圈操作,0x02對應(yīng)離散量操作,0x03對應(yīng)保持寄存器操作,0x04對應(yīng)輸入寄存器操作
– address:開始地址
– quantity:寄存器/線圈/離散量 的數(shù)量
審核編輯:湯梓紅
-
以太網(wǎng)
+關(guān)注
關(guān)注
40文章
5594瀏覽量
174990 -
通信
+關(guān)注
關(guān)注
18文章
6182瀏覽量
137434 -
PDU
+關(guān)注
關(guān)注
0文章
96瀏覽量
17258 -
總線協(xié)議
+關(guān)注
關(guān)注
0文章
127瀏覽量
15187 -
ModbusTCP
+關(guān)注
關(guān)注
0文章
187瀏覽量
4804
原文標(biāo)題:【干貨】ModbusTCP協(xié)議詳解
文章出處:【微信號:你身邊的機(jī)器人專家,微信公眾號:你身邊的機(jī)器人專家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
圖文詳解ModbusTCP協(xié)議
ModbusTCP轉(zhuǎn)CanOpen網(wǎng)關(guān)助力工控行業(yè)
一文知道ModbusTCP協(xié)議和上位機(jī)編寫
ModbusTCP報文詳解
智能樓宇系統(tǒng)canopen協(xié)議與ModbusTCP協(xié)議進(jìn)行通訊
智能樓宇系統(tǒng)canopen協(xié)議與ModbusTCP協(xié)議進(jìn)行通訊

【實用篇】ModbusTCP協(xié)議詳解

火力全開,ModbusTCP/RTU轉(zhuǎn)ethernet ip協(xié)議網(wǎng)關(guān)的不同應(yīng)用大揭秘

評論