1. 程式人生 > >modbus-tcp協議講解

modbus-tcp協議講解

MODBUS功能碼簡介 

程式碼

中文名稱

位操作/字操作

運算元量

01h

讀線圈狀態

位操作

單個或多個

02h

讀離散輸入狀態(只能讀到0或1)

位操作

單個或多個

03h

讀保持暫存器(保持暫存器可以通過06h功能寫入)

字操作

單個或多個

04h

讀輸入暫存器(輸入暫存器只能讀取,不能通過06h功能寫入)

字操作

單個或多個

05h

寫單個線圈(線圈表示用來控制輸出IO控制)

位操作

單個

06h

寫單個保持暫存器

字操作

單個

0Fh

寫多個線圈

位操作

多個

10h

寫多個保持暫存器

字操作

多個

 

Modbus TCP介紹

示例-通過03功能碼讀暫存器(從暫存器00開始,讀取兩個值,讀到01暫存器結束)

客戶端傳送 01 02 00 00 00 06 01 03 00 00 00 02

01 02 00 00 00 06 (固定報文頭)

  • 01 02:   客戶端發出的檢驗資訊, server端會將這兩個位元組內容複製到迴應的報文第一二位.一般我們會將第一二位進行不停遞加,然後根據伺服器返回的相應內容, 來驗證伺服器迴應資訊的時效性
  • 00 00:   表示tcp/ip 的協議的modbus的協議
  • 00 06:   表示客戶端傳送的後面帶了多少位元組.

01 03 00 00 00 02(使用者資料)

  • 01:   表示裝置地址
  • 03:  表示讀保持暫存器功能碼
  • 00 00:  表示客戶端讀取的暫存器起始地址
  • 00 02:  表示讀取的暫存器值個數(由於為02,所以會讀出暫存器00h和01h的值)

返回值如下圖所示:

 

伺服器返回值  01 02 00 00 00 07 01 03 04 04 7B 00 FF

  • 01 02:  伺服器迴應的檢驗資訊
  • 00 00: 表示tcp/ip 的協議的modbus的協議
  • 00 07: 表示伺服器傳送的後面帶了多少位元組.
  • 01:  表示裝置地址
  • 03:  表示功能碼
  • 04:  表示後面傳送的暫存器00的位元組長度
  • 04 7B:  表示暫存器00的值
  • 00 FF:  表示暫存器01的值

 

示例-06功能碼寫單個暫存器(向暫存器03地址裡寫值)

客戶端傳送 01 02 00 00 00 06 01 06 00 03 00 FF

01 02 00 00 00 06 (固定報文頭)

  • 01 02:  客戶端發出的檢驗資訊
  • 00 00:  表示tcp/ip 的協議的modbus的協議
  • 00 06:  表示客戶端傳送的後面帶了多少位元組.

01 06 00 03 00 FF (使用者資料)

  • 01:   表示裝置地址
  • 06:   表示寫單個保持暫存器功能碼
  • 00 FF:  表示寫入暫存器03h的值為0xFF

返回值如下圖所示:

 

伺服器返回  01 02 00 00 00 06 01 06 00 03 00 FF

後面的06 00 03 00 FF:表示客戶端使用06功能碼成功向暫存器03h分別寫入了0xFF值

 

示例-10功能碼寫多個暫存器(向暫存器03~06地址裡寫不同值)

客戶端傳送 01 02 00 00 00 10 01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06

01 02 00 00 00 10 (固定報文頭)

  • 01 02:  客戶端發出的檢驗資訊
  • 00 00:  表示tcp/ip 的協議的modbus的協議
  • 00 10:  表示客戶端傳送的後面帶了多少位元組.

01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06 (使用者資料)

  • 01:  表示裝置地址
  • 10:  表示寫多個保持暫存器功能碼
  • 00 03:  表示客戶端寫入的暫存器起始地址
  • 00 04:  表示寫入的暫存器值個數(由於為04,所以會寫入暫存器03h~06h的值)
  • 08:   表示後面寫入的位元組個數
  • FF FF:  表示寫入暫存器03h的值
  • 00 0A:  表示寫入暫存器04h的值
  • 00 0F:  表示寫入暫存器05h的值
  • 00 06:  表示寫入暫存器06h的值

返回值如下圖所示:

 

伺服器返回 01 02 00 00 00 06 01 10 00 03 00 04

後面的10 00 03 00 04:表示客戶端使用10功能碼成功向暫存器03h~06h分別寫入了值

 

部分參考內容:https://blog.csdn.net/mikasoi/article/details/8178