Modbus TCP協(xié)議
(1)、Modbus TCP數(shù)據(jù)幀:
在TCP/IP以太網(wǎng)上傳輸,支持Ethernet II和802.3兩種幀格式。圖3所示,Modbus TCP數(shù)據(jù)幀包含報文頭、功能代碼和數(shù)據(jù)3部分。
圖6:TCP/IP上的MODBUS的請求/響應(yīng)
(2)、MBAP報文頭描述:
MBAP報文頭(MBAP、Modbus Application Protocol、Modbus應(yīng)用協(xié)議)分4個域,共7個字節(jié),如表1所示。
表1:MBAP報文頭
域 | 長度(B) | 描述 |
傳輸標(biāo)識 | 2個字節(jié) | 標(biāo)志某個MODBUS詢問/應(yīng)答的傳輸 |
協(xié)議標(biāo)志 | 2個字節(jié) | 0=MODBUS協(xié)議 |
長度 | 2個字節(jié) | 后續(xù)字節(jié)計數(shù) |
單元標(biāo)識符 | 1個字節(jié) | 串行鏈路或其它總線上連接的遠(yuǎn)程從站的識別碼 |
(3)、Modbus功能代碼:
Modbus功能碼分為3種類型,分別是:
(1)公共功能代碼:已定義好的功能碼,保證其唯一性,由Modbus.org認(rèn)可;
(2)用戶自定義功能代碼有兩組,分別為65~72和100~110,無需認(rèn)可,但不保證代碼使用的唯一性。如變?yōu)楣泊a,需交RFC認(rèn)可;
(3)保留的功能代碼,由某些公司使用在某些傳統(tǒng)設(shè)備的代碼,不可作為公共用途。
在常用的公共功能代碼中,IBF96支持部分的功能碼,詳見如下:
功能碼 | 名稱 | 說明 | |
01 | Read Coil Status | 讀取線圈狀態(tài) | 1表示高電平, 0表示低電平。 |
03 | Read Holding Register | 讀保持寄存器 | 1表示高電平, 0表示低電平。 |
05 | Write Single Coil | 寫單個線圈 | 1表示三極管導(dǎo)通, 0表示三極管斷開。 |
06 | Write Single Register | 寫單個寄存器 | 1表示三極管導(dǎo)通, 0表示三極管斷開。 |
15 | Write Multiple Coils | 寫多個線圈 | |
16 | Write Multiple Registers | 寫多個寄存器 |
(4)、支持的功能碼描述
01(0x01)讀線圈
在一個遠(yuǎn)程設(shè)備中,使用該功能碼讀取線圈的1 至2000 連續(xù)狀態(tài)。請求PDU詳細(xì)說明了起始地址,即指定的第一個線圈地址和線圈編號。從零開始尋址線圈。因此尋址線圈1-16 為0-15。
根據(jù)數(shù)據(jù)域的每個位(bit)將響應(yīng)報文中的線圈分成為一個線圈。指示狀態(tài)為1= ON和0= OFF。第一個數(shù)據(jù)作為字節(jié)的LSB(最低有效位),后面的線圈數(shù)據(jù)依次向高位排列,來組成8位一個的字節(jié)。如果返回的輸出數(shù)量不是八的倍數(shù),將用零填充最后數(shù)據(jù)字節(jié)中的剩余位(bit)(一直到字節(jié)的高位端)。字節(jié)數(shù)量域說明了數(shù)據(jù)的完整字節(jié)數(shù)
功能碼01舉例,讀8通道DI數(shù)據(jù),寄存器地址00033~00040:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 04 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 01 | 功能碼 | 01 | ||
起始地址Hi | 00 | 字節(jié)數(shù) | 01 | ||
起始地址Lo | 20 | 輸出狀態(tài)DI7-DI0 | 00 | ||
輸出數(shù)量Hi | 00 | ||||
輸出數(shù)量Lo | 08 |
03(0x03)讀保持寄存器
在一個遠(yuǎn)程設(shè)備中,使用該功能碼讀取保持寄存器連續(xù)塊的內(nèi)容。請求PDU說明了起始寄存器地址和寄存器數(shù)量。從零開始尋址寄存器。因此,尋址寄存器1-16 為0-15。在響應(yīng)報文中,每個寄存器有兩字節(jié),第一個字節(jié)為數(shù)據(jù)高位,第二個字節(jié)為數(shù)據(jù)低位。
功能碼03舉例,讀8通道DI數(shù)據(jù),寄存器地址40033:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 05 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 03 | 功能碼 | 03 | ||
起始地址Hi | 00 | 字節(jié)數(shù) | 02 | ||
起始地址Lo | 20 | 寄存器值Hi(0x00) | 00 | ||
寄存器編號Hi | 00 | 寄存器值Lo(DI7-DI0) | 00 | ||
寄存器編號Lo | 01 |
05(0x05)寫單個線圈
在一個遠(yuǎn)程設(shè)備上,使用該功能碼寫單個輸出為ON 或OFF。請求PDU說明了強(qiáng)制的線圈地址。從零開始尋址線圈。因此,尋址線圈地址1為0。線圈值域的常量說明請求的ON/OFF狀態(tài)。十六進(jìn)制值0xFF00請求線圈為ON。十六進(jìn)制值0x0000請求線圈為OFF。其它所有值均為非法的,并且對線圈不起作用。
正確的響應(yīng)應(yīng)答是和請求一樣的。
功能碼05舉例,設(shè)置通道DO0為ON,也就是為1,寄存器地址00001:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 06 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 05 | 功能碼 | 05 | ||
輸出地址Hi | 00 | 輸出地址Hi | 00 | ||
輸出地址Lo | 00 | 輸出地址Lo | 00 | ||
輸出值Hi | FF | 輸出值Hi | FF | ||
輸出值Lo | 00 | 輸出值Lo | 00 |
06(0x06)寫單個寄存器
在一個遠(yuǎn)程設(shè)備中,使用該功能碼寫單個保持寄存器。請求PDU說明了被寫入寄存器的地址。從零開始尋址寄存器。因此,尋址寄存器地址1為0。
正確的響應(yīng)應(yīng)答是和請求一樣的。
功能碼06舉例,設(shè)置通道DO0~DO7全部為1,16進(jìn)制為0xFF,寄存器地址40001:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 06 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 06 | 功能碼 | 06 | ||
寄存器地址Hi | 00 | 寄存器地址Hi | 00 | ||
寄存器地址Lo | 00 | 寄存器地址Lo | 00 | ||
寄存器值Hi | 00 | 寄存器值Hi | 00 | ||
寄存器值Lo | FF | 寄存器值Lo | FF |
15(0x0F)寫多個線圈
在一個遠(yuǎn)程設(shè)備上,使用該功能碼寫多個輸出為ON 或OFF。請求PDU說明了強(qiáng)制的線圈地址。從零開始尋址線圈。因此,尋址線圈地址1為0。線圈值域的常量說明請求的ON/OFF狀態(tài)。數(shù)據(jù)由16進(jìn)制換算成二進(jìn)制按位排列,位值為1請求線圈為ON,位值為0請求線圈為OFF。
功能碼15舉例,設(shè)置通道DO0,DO1為ON,也就是為00000011,寄存器地址00001:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 06 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 0F | 功能碼 | 0F | ||
開始地址Hi | 00 | 開始地址Hi | 00 | ||
開始地址Lo | 00 | 開始地址Lo | 00 | ||
線圈數(shù)量Hi | 00 | 線圈數(shù)量Hi | 00 | ||
線圈數(shù)量Lo | 02 | 線圈數(shù)量Lo | 02 | ||
字節(jié)數(shù) | 01 | ||||
輸出值 | 02 |
16(0x10)寫多個寄存器
在一個遠(yuǎn)程設(shè)備中,使用該功能碼寫多個保持寄存器。請求PDU說明了被寫入寄存器的地址。從零開始尋址寄存器。因此,尋址寄存器地址1為0。功能碼16舉例,設(shè)置通道DO0和DO1的PWM值為5和6,寄存器地址40001:
請求 | 響應(yīng) | ||||
字段名稱 | 十六進(jìn)制 | 字段名稱 | 十六進(jìn)制 | ||
MBAP報文頭 | 傳輸標(biāo)識 | 01 | MBAP報文頭 | 傳輸標(biāo)識 | 01 |
00 | 00 | ||||
協(xié)議標(biāo)志 | 00 | 協(xié)議標(biāo)志 | 00 | ||
00 | 00 | ||||
長度 | 00 | 長度 | 00 | ||
06 | 06 | ||||
單元標(biāo)識符 | 01 | 單元標(biāo)識符 | 01 | ||
功能碼 | 10 | 功能碼 | 10 | ||
開始寄存器地址Hi | 00 | 開始寄存器地址Hi | 00 | ||
開始寄存器地址Lo | 00 | 開始寄存器地址Lo | 00 | ||
寄存器數(shù)量Hi | 00 | 寄存器數(shù)量Hi | 00 | ||
寄存器數(shù)量Lo | 02 | 寄存器數(shù)量Lo | 02 | ||
字節(jié)數(shù) | 04 | ||||
寄存器值Hi | 00 | ||||
寄存器值Lo | 05 | ||||
寄存器值Hi | 00 | ||||
寄存器值Lo | 06 |
-
編碼器
+關(guān)注
關(guān)注
45文章
3650瀏覽量
134761 -
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120668 -
MODBUS
+關(guān)注
關(guān)注
28文章
1812瀏覽量
77092 -
TCP
+關(guān)注
關(guān)注
8文章
1372瀏覽量
79142 -
采集模塊
+關(guān)注
關(guān)注
0文章
138瀏覽量
9607
發(fā)布評論請先 登錄
相關(guān)推薦
評論