天天看點

ModbusTCP協定學習

ModbusTCP協定學習

文章目錄

  • ​​ModbusTCP協定學習​​
  • ​​1、簡介​​
  • ​​2、ModbusTCP資料幀​​
  • ​​2.1、封包頭MBAP​​
  • ​​2.2、幀結構PDU​​
  • ​​2.2.1、功能碼​​
  • ​​2.2.2、PDU詳細結構​​
  • ​​3、ModbusTCP通信​​
  • ​​3.1、通信方式​​
  • ​​3.2、在linux下使用modbusTCP連接配接​​
  • ​​4、Modbus poll / Modbus slave​​

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時,注意資料格式,一條指令一次性發出,否則連接配接會出錯。

  • slave ID:從站編号(事務辨別符)
  • function:功能碼,0x01對應線圈操作,0x02對應離散量操作,0x03對應保持寄存器操作,0x04對應輸入寄存器操作
  • address:開始位址
  • quantity:寄存器/線圈/離散量 的數量