1. 程式人生 > >ModbusTCP協議學習筆記

ModbusTCP協議學習筆記

這篇在簡書發過一次,增加了一點內容,嘗試一下用CSDN

1 簡介

modbus由MODICON公司於1979年開發,是一種工業現場匯流排協議標準。1996年施耐德公司推出基於乙太網TCP/IP的modbus協議:modbusTCP。

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

標準的Modbus協議物理層介面有RS232、RS422、RS485和乙太網介面,採用master/slave方式通訊。

2 ModbusTCP資料幀

ModbusTCP的資料幀可分為兩部分:MBAP+PDU

2.1 報文頭MBAP

MBAP為報文頭,長度為7位元組,組成如下:

事務處理標識 協議標識 長度 單元識別符號
2位元組 2位元組 2位元組 1位元組

事務處理標識 :可以理解為報文的序列號,一般每次通訊之後就要加1以區別不同的通訊資料報文。
協議識別符號 :00 00表示ModbusTCP協議。
長度 :表示接下來的資料長度,單位為位元組。
單元識別符號 :可以理解為裝置地址。

2.2 幀結構PDU

PDU由功能碼+資料組成。功能碼為1位元組,資料長度不定,由具體功能決定。

2.2.1 功能碼

modbus的操作物件有四種:線圈、離散輸入、輸入暫存器、保持暫存器。

  • 線圈:PLC的輸出位,開關量,在MODBUS中可讀可寫
  • 離散量:PLC的輸入位,開關量,在MODBUS中只讀
  • 輸入暫存器:PLC中只能從模擬量輸入端改變的暫存器,在MODBUS中只讀
  • 保持暫存器:PLC中用於輸出模擬量訊號的暫存器,在MODBUS中可讀可寫

根據物件的不同,modbus的功能碼有:

  • 0x01:讀線圈
  • 0x05:寫單個線圈
  • 0x0F:寫多個線圈
  • 0x02:讀離散量輸入
  • 0x04:讀輸入暫存器
  • 0x03:讀保持暫存器
  • 0x06:寫單個保持暫存器
  • 0x10:寫多個保持暫存器

2.2.2 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,資料域中置1的位請求相應輸出位ON,置0的位請求響應輸出為OFF

  • 請求:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L 位元組長度 輸出值H 輸出值L
  • 響應: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 功能碼 資料長度 暫存器資料(長度:9+暫存器數量×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

3 ModbusTCP通訊

3.1 通訊方式

modbus裝置可分為主站(poll)和從站(slave)。主站只有一個,從站有多個,主站向各從站傳送請求幀,從站給予響應。在使用TCP通訊時,主站為client端,主動建立連線;從站為server端,等待連線。

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

3.2 在linux下使用modbusTCP連線

IANA(Internet Assigned Numbers Authority,網際網路編號分配管理機構)給Modbus協議賦予TCP埠號為502,這是目前在儀表與自動化行業中唯一分配到的埠號。
通訊過程
1.connect 建立TCP連線
2.準備modbus報文
3.使用send命令傳送報文
4.在同一連線下等待應答
5.使用recv命令讀取報文,完成一次資料交換
6.通訊任務結束時,關閉TCP連線

4 Modbus poll / Modbus slave

  • modbus poll 和modbus slave是一組modbus模擬軟體,可以實現modbus RTU、TCP、串列埠模擬等。
  • 在modbusTCP中,modbus poll 作為客戶端請求資料,modbus slave 作為伺服器端處理請求。
  • 使用c語言編寫客戶端連線modbus slave時,注意資料格式,一條指令一次性發出,否則連線會出錯。
  • 使用軟體時,需要指定功能碼,在setup->slave definition或者poll definition中進行設定。
    – slave ID:從站編號(事務識別符號)
    – function:功能碼,0x01對應線圈操作,0x02對應離散量操作,0x03對應保持暫存器操作,0x04對應輸入暫存器操作
    – address:開始地址
    – quantity:暫存器/線圈/離散量 的數量
    Linux C作為客戶端連線modbus slave的原始碼:
    連結:https://pan.baidu.com/s/146svXpit0umpk809TV1Sdw 密碼:b6gn

參考:
https://wenku.baidu.com/view/c2a9e1cc376baf1ffd4fad5c.html
https://blog.csdn.net/zwxue251/article/details/24154951
https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1