「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位元組,組成如下:

事務處理標識

協議標識

長度

單元識別符號

2位元組

2位元組

2位元組

1位元組

內容

解釋

事務處理標識

可以理解為報文的序列號,一般每次通訊之後就要加1以區別不同的通訊資料報文。

協議識別符號

00 00表示ModbusTCP協議。

長度

表示接下來的資料長度,單位為位元組。

單元識別符號

可以理解為裝置地址。

幀結構PDU

PDU由

功能碼+資料

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

功能碼

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

物件

含義

線圈

PLC的輸出位,開關量,在Modbus中可讀可寫

離散量

PLC的輸入位,開關量,在Modbus中只讀

輸入暫存器

PLC中只能從模擬量輸入端改變的暫存器,在Modbus中只讀

保持暫存器

PLC中用於輸出模擬量訊號的暫存器,在Modbus中可讀可寫

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

功能碼

含義

0x01

讀線圈

0x05

寫單個線圈

0x0F

寫多個線圈

0x02

讀離散量輸入

0x04

讀輸入暫存器

0x03

讀保持暫存器

0x06

寫單個保持暫存器

0x10

寫多個保持暫存器

說明更詳細的表

程式碼

中文名稱

英文名

位操作/字操作

運算元量

01

讀線圈狀態

READ COIL STATUS

位操作

單個或多個

02

讀離散輸入狀態

READ INPUT STATUS

位操作

單個或多個

03

讀保持暫存器

READ HOLDING REGISTER

字操作

單個或多個

04

讀輸入暫存器

READ INPUT REGISTER

字操作

單個或多個

05

寫線圈狀態

WRITE SINGLE COIL

位操作

單個

06

寫單個保持暫存器

WRITE SINGLE REGISTER

字操作

單個

15

寫多個線圈

WRITE MULTIPLE COIL

位操作

多個

16

寫多個保持暫存器

WRITE MULTIPLE REGISTER

字操作

多個

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

Modbus TCP 示例報文

ModBusTcp與序列鏈路Modbus的資料域是一致的,具體資料域可以參考序列Modbus。這裡給出幾個ModbusTcp的鏈路解析說明,輔助新人分析報文。

「ModbusTCP協議詳解」內容有點多,但講得很詳細

「ModbusTCP協議詳解」內容有點多,但講得很詳細

「ModbusTCP協議詳解」內容有點多,但講得很詳細

「ModbusTCP協議詳解」內容有點多,但講得很詳細

功能碼 0x10:寫多個保持暫存器,上面2個圖片都寫錯了

ModbusTCP通訊

通訊方式

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

主站請求:功能碼+資料

從站正常響應:請求功能碼+響應資料

從站異常響應:異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯型別

注意:需要超時管理機制,避免無期限的等待可能不出現的應答

IANA(Internet Assigned Numbers Authority,網際網路編號分配管理機構)給Modbus協議賦予TCP埠號為

502

,這是目前在儀表與自動化行業中唯一分配到的埠號。

通訊過程

connect 建立TCP連線

準備Modbus報文

使用send命令傳送報文

在同一連線下等待應答

使用recv命令讀取報文,完成一次資料交換

通訊任務結束時,關閉TCP連線

模擬軟體

Modbus poll 和Modbus slave是一組Modbus模擬軟體,可以實現Modbus RTU、TCP、串列埠模擬等。

模擬軟體網址:https://modbustools。com/download。html

在ModbusTCP中,Modbus poll 作為客戶端請求資料,Modbus slave 作為伺服器端處理請求。

使用c語言編寫客戶端連線Modbus slave時,注意資料格式,一條指令一次性發出,否則連線會出錯。

使用軟體時,需要指定功能碼,在setup->slave definition或者poll definition中進行設定。

– slave ID:從站編號(事務識別符號)

– function:功能碼,0x01對應線圈操作,0x02對應離散量操作,0x03對應保持暫存器操作,0x04對應輸入暫存器操作

– address:開始地址

– quantity:暫存器/線圈/離散量 的數量

一些概念

在工業自動化控制中,經常會遇到開關量,數字量,模擬量,離散量,脈衝量等各種概念,而人們在實際應用中,對於這些概念又很容易混淆。現將各種概念羅列如下:

1。開關量:

一般指的是觸點的“開”與“關”的狀態,一般在計算機裝置中也會用“0”或“1”來表示開關量的狀態。開關量分為有源開關量訊號和無源開關量訊號,有源開關量訊號指的是“開”與“關”的狀態是帶電源的訊號,專業叫法為躍階訊號,可以理解為脈衝量,一般的都有220VAC, 110VAC,24VDC,12VDC等訊號,無源開關量訊號指的是“開”和“關”的狀態時不帶電源的訊號,一般又稱之為幹接點。電阻測試法為電阻0或無窮大。

2。數字量:

很多人會將數字量與開關量混淆,也將其與模擬量混淆。數字量在時間和數量上都是離散的物理量,其表示的訊號則為數字訊號。數字量是由0和1組成的訊號,經過編碼形成有規律的訊號,量化後的模擬量就是數字量。

3。模擬量:

模擬量的概念與數字量相對應,但是經過量化之後又可以轉化為數字量。模擬量是在時間和數量上都是連續的物理量,其表示的訊號則為模擬訊號。模擬量在連續的變化過程中任何一個取值都是一個具體有意義的物理量,如溫度,電壓,電流等。

4。離散量:

離散量是將模擬量離散化之後得到的物理量。即任何儀器裝置對於模擬量都不可能有個完全精確的表示,因為他們都有一個取樣週期,在該取樣週期內,其物理量的數值都是不變的,而實際上的模擬量則是變化的。這樣就將模擬量離散化,成為了離散量。

5。脈衝量:

脈衝量就是瞬間電壓或電流由某一值躍變到另一值的訊號量。在量化後,其變化持續有規律就是數字量,如果其由0變成某一固定值並保持不變,其就是開關量。

綜上所述,模擬量就是在某個過程中時間和數量連續變化的物理量,由於在實際的應用中,所有的儀器裝置對於外界資料的採集都有一個取樣週期,其採集的資料只有在下一個取樣週期開始時才有變動,取樣週期內其數值並不隨模擬量的變化而變動。

這樣就將模擬量離散化了,例如:某裝置的取樣週期為1秒,其在第五秒的時間採集的溫度為35度,而第六秒的溫度為36度,該裝置就只能標稱第五秒時間溫度35度,第六秒時間溫度36度,而第五點五秒的時間其標稱也只是35度,但是其實際的模擬量是35。5度。這樣就將模擬訊號離散化。其採集的資料就是離散化了,不再是連續的模擬量訊號。

由於計算機只識別0和1兩個訊號,即開關量訊號,用其來表示數值都是使用數字串來表示,由於計算能力的問題,其數字串不能無限長,即其表達的精度也是有限的,同樣的以溫度為例,由於數字串限制,其表達溫度的精度只能達到0。1度,小於該單位的數值則不能被標稱,這樣就必須將離散量進行量化,將其變為數字量。即35。68度的溫度則表示為35。6度。

免責宣告:本文轉自網路,版權歸原作者所有,如涉及作品版權問題,請及時與我們聯絡刪除,謝謝!

16款電工模擬軟體

「ModbusTCP協議詳解」內容有點多,但講得很詳細