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