ModbusTcp協議詳解

簡介

Modbus由MODICON公司於1979年開發,是一種工業現場總線協議標準。1996年施耐德公司推出基於以太網TCP/IP的Modbus協議:ModbusTCP。

Modbus協議是一項應用層報文傳輸協議,包括ASCII、RTU、TCP三種報文類型。

標準的Modbus協議物理層接口有RS232、RS422、RS485和以太網接口,採用master/slave方式通信。

ModbusTCP數據幀

ModbusTCP的數據幀可分爲兩部分:MBAP+PDU。

報文頭MBAP

MBAP爲報文頭,長度爲7字節,組成如下:

內容 解釋
事務處理標誌 可以理解爲報文的序列號,一般每次通信之後就要加1以區別不同的通信數據報文。
協議標識符 00 00表示ModbusTCP協議。
長度 表示接下來的數據長度,單位爲字節。
單元標識符 可以理解爲設備地址。

事務處理標誌
傳輸標識用於將請求與未來響應之間建立聯繫。因此,對TCP 連接來說,在同一時刻,這個標識符必須是唯一的。有幾種使用此標識符的方式:

  • 例如:可以作爲一個帶有計數器的簡單“TCP順序號”,在每一個請求時增加計數器;
  • 也可以用作智能索引或指針,來識別事務處理的內容,以便記憶當前的遠端服務器和未處理的請求。
    服務器收接受的請求數量取決於其容量,即:服務器資源量和TCP 窗口尺寸。同樣,客戶機同時啓動事務處理的數量也取決於客戶機的資源容量。這個實現參數稱爲“NnmberMaxofClientTransaction”,必須作爲MODBUS 客戶機的一個特性進行描述。根據設備的類型,此參數取值爲1~16。

單元標識符
在MODBUS或MODBUS+串行鏈路子網中對設備進行尋址時,這個域是用於路由的目的。在這種情況下,“Unit Identifier”攜帶一個遠端設備的MODBUS從站地址:

  • 如果MODBUS服務器連接到MODBUS+或MODBUS串行鏈路子網,並通過一個橋或網關配置地址這個服務器,MODBUS單元標識符對識別連接到網橋或網關後的子網的從站設備是必需的。目的IP地址識別了網橋本身的地址,而網橋則使用MODBUS單元標識符將請求轉交給正確的從站設備。
  • 分配串行鏈路上MODBUS從站設備地址爲1~247(10進制),地址0作爲廣播地址。
    對TCP/IP 來說,利用IP 地址尋址MODBUS 服務器;因此,MODBUS 單元標識符是無用的。必需使用值0xFF。
  • 當對直接連接到TCP/IP網絡上的MODBUS服務器尋址時,建議不要在“單元標識符”域使用有效的MODBUS從站地址。在一個自動系統中重新分配IP地址的情況下,並且如果以前分配的MODBUS服務器的IP地址又被指配給網關,使用一個有效的從站地址可能會由於網關的路由不暢而引起麻煩。使用無效的從站地址,網關僅是簡單地廢棄MODBUD PDU,而不會有任何問題。建議:在採用0xFF作爲“單元標識符”的無效值。
    注:0也可以用作與MODBUS/TCP設備直接通信。

幀結構PDU

PDU由功能碼+數據組成。功能碼爲1字節,數據長度不定,由具體功能決定。
功能碼
Modbus的操作對象有四種:線圈、離散輸入、輸入寄存器、保持寄存器。

對象 含義
線圈 PLC的輸出位,開關量,在Modbus中可讀可寫
離散量 PLC的輸入位,開關量,在Modbus中只讀
輸入寄存器 PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀
保持寄存器 PLC中用於輸出模擬量信號的寄存器,在Modbus中可讀可寫

根據對象的不同,Modbus的功能碼有:

功能碼 含義
0x01 讀線圈
0x05 寫單個線圈
0x0F 寫多個線圈
0x02 讀離散量輸入
0x04 讀輸入寄存器
0x03 讀保存寄存器
0x06 寫單個保持寄存器
0x10 寫多個保持寄存器

PDU詳細結構

0x01:讀線圈
在從站中讀1~2000個連續線圈狀態,ON=1,OFF=0

  • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
  • 響應:MBAP 功能碼 數據長度 數據(一個地址的數據爲1位)
  • 如:在從站0x01中,讀取開始地址爲0x0002的線圈數據,讀0x0008位
    00 01 00 00 00 06 01 01 00 02 00 08
  • 回:數據長度爲0x01個字節,數據爲0x01,第一個線圈爲ON,其餘爲OFF
    00 01 00 00 00 04 01 01 01 01

0x05:寫單個線圈
將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出爲ON,0x000請求輸出爲OFF

  • 請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
  • 響應:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
  • 如:將地址爲0x0003的線圈設爲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

0x0F:寫多個線圈
將從站中的一個輸出寫成ON或OFF,0xFF00請求輸出爲ON,0x000請求輸出爲OFF

  • 請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)
  • 響應:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L

0x02:讀離散量輸入
從一個從站中讀1~2000個連續的離散量輸入狀態

  • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)
  • 響應:MBAP 功能碼 數據長度 數據(長度:9+ceil(數量/8))
  • 如:從地址0x0000開始讀0x0012個離散量輸入
    00 01 00 00 00 06 01 02 00 00 00 12
  • 回:數據長度爲0x03個字節,數據爲0x01 04 00,表示第一個離散量輸入和第11個離散量輸入爲ON,其餘爲OFF
    00 01 00 00 00 06 01 02 03 01 04 00

0x04:讀輸入寄存器
從一個遠程設備中讀1~2000個連續輸入寄存器

  • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
  • 響應:MBAP 功能碼 數據長度 寄存器數據(長度:9+寄存器數量×2)
  • 如:讀起始地址爲0x0002,數量爲0x0005的寄存器數據
    00 01 00 00 00 06 01 04 00 02 00 05
  • 回:數據長度爲0x0A,第一個寄存器的數據爲0x0c,其餘爲0x00
    00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

0x03:讀保持寄存器
從遠程設備中讀保持寄存器連續塊的內容

  • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
  • 響應:MBAP 功能碼 數據長度 寄存器數據(長度:寄存器數量×2)
  • 如:起始地址是0x0000,寄存器數量是 0x0003
    00 01 00 00 00 06 01 03 00 00 00 03
  • 回:數據長度爲0x06,第一個寄存器的數據爲0x21,其餘爲0x00
    00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

0x06:寫單個保持寄存器
在一個遠程設備中寫一個保持寄存器

  • 請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
  • 響應:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)
  • 如:向地址是0x0000的寄存器寫入數據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

0x10:寫多個保持寄存器
在一個遠程設備中寫連續寄存器塊(1~123個寄存器)

  • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L 字節長度 寄存器值(13+寄存器數量×2)
  • 響應:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)
  • 如:向起始地址爲0x0000,數量爲0x0001的寄存器寫入數據,數據長度爲0x02,數據爲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的數據域是一致的,具體數據域可以參考串行Modbus。這裏給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

ModbusTCP通信

通信方式
Modbus設備可分爲主站(poll)和從站(slave)。主站只有一個,從站有多個,主站向各從站發送請求幀,從站給予響應。在使用TCP通信時,主站爲client端,主動建立連接;從站爲server端,等待連接。

  • 主站請求:功能碼+數據
  • 從站正常響應:請求功能碼+響應數據
  • 從站異常響應:異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯類型
  • 注意:需要超時管理機制,避免無期限的等待可能不出現的應答

IANA(Internet Assigned Numbers Authority,互聯網編號分配管理機構)給Modbus協議賦予TCP端口號爲502,這是目前在儀表與自動化行業中唯一分配到的端口號。

通信過程

  1. connect 建立TCP連接
  2. 準備Modbus報文
  3. 使用send命令發送報文
  4. 在同一連接下等待應答
  5. 使用recv命令讀取報文,完成一次數據交換
  6. 通信任務結束時,關閉TCP連接

本文借鑑兩位大佬文章,原文鏈接:
雲逸:https://www.cnblogs.com/ioufev/articles/10830028.html
http://devdiary.blog.sohu.com/188191457.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章