Modbus介紹與協議解析

一、Modbus介紹

Modbus是一種通訊協議,主要應用於電子控制器上的一種通用語言。Modbus支持多種電氣接口,如RS232、RS485、TCP/IP等。多數Modbus設備通信是通過串口或TCP/IP進行連接。

通常情況下 Modbus是主從架構,即通信節點是Master,其它使用Modbus協議參與通信的是slave節點(最多247個,地址範圍爲1-247,0節點是廣播地址)。每個slave設備都具有一個唯一的地址。總線上只能有一個Master節點。

Modbus傳輸模式可分爲 ASCII和RTU兩種模式,同一網絡中所有設備必須保持統一,要麼是ASCII,要麼統一爲RTU模式,兩者不可共存。相對來說RTU模式傳輸效率較高,

ASCII模式下,消息以冒號字符開始,以回車換行字符結束。

RTU模式下,消息發送和接收至少間隔3.5字符時間的停頓間隔作爲標誌。

Modbus寄存器介紹

所有數據都存在寄存器中,寄存器可指物理寄存器,也可是一塊內存區域。Modbus根據數據類型及各自讀寫特性,將寄存器分爲了4個部分,分別如下。

Modbus地址、功能碼、數據域介紹

Modbus消息幀的地址,在ASCII模式下包含2個字符,在RTU模式下包含1個字符。單個設備地址實際範圍是在1-247值之間。0爲廣播地址、248-255爲保留地址。

功能碼由1個字節構成,因此取值範圍1-255。常用功能碼如下:

01:讀線圈狀態

02:讀輸入狀態

03:讀保持寄存器

04:讀輸入寄存器

05:強制單線圈

06:預製單寄存器

15:強制多線圈

17:報告從設備ID

22:屏蔽寫寄存器

23:讀/寫寄存器

數據內容與功能碼緊密相關,存放功能碼需要操作的具體數據,數據域以字節爲單位,長度可變,對於有些功能碼此域可爲空。

二、Modbus協議解析

ModbusTCP通常使用端口502作爲接收報文端口。

ModbusTCP包含一個應用報文頭,該頭佔用7個字節。Modbus TCP/IP協議最大數據幀長度爲260字節。

傳輸標識:Transaction Identifier。佔用2個字節。標記某個Modbus 查詢/應答的傳輸過程,可設置爲0,每次通訊+1;由客戶端生成(主站設備),應答時複製該值。

協議標識:Protocol Identifier。佔用2個字節。 Modbus協議爲 0x00。由客戶端生成,應答時複製該值。

字節長度:Length。佔用2個字節。高4位爲設置爲0X00,因此後續字節必須在256個字節內;第四位記錄後續的字節個數;由客戶端生成(主站設備),應答時重新生成。

單位標識符:Unit Identifier。佔用1個字節。用以識別從機設備。由客戶端生成,應答時複製該值。

0x01 讀取線圈輸出狀態

下圖爲query請求報文,Modbus傳輸內容爲 “05 91 00 00 00 06 ff 01 00 00 00 0a”。

05 91(十六進制) 爲傳輸標識,即1425(十進制);

00 00爲協議標識;

00 06爲字節長度;

ff爲單位標識符,即255(十進制);

01爲功能碼,佔1個字節;

00 爲Modbus起始地址高位;

00 爲Modbus起始地址低位;

00 爲寄存器高位;

0a爲寄存器低位。

下圖爲query後的響應報文,Modbus傳輸內容爲 “05 91 00 00 00 05 ff 01 02 01 00”。

05 91(十六進制) 爲傳輸標識,即1425(十進制);

00 00爲協議標識;

00 05爲字節長度;

ff爲單位標識符,即255(十進制);

01爲功能碼,佔1個字節;

02爲數據域字節數;

01 00 爲數據字段。響應報文的數據字段中,每個線圈佔用1位(bit),01=0000 0001,00=0000 0000。1=ON,0=OFF。如果最後的數據字節不能填滿8個線圈的狀態(1個字節),則由0填充。

0x02 讀取離散量輸入值

下圖爲query請求報文,Modbus傳輸內容爲 “05 92 00 00 00 06 ff 02 00 00 00 0b”。

05 92(十六進制) 爲傳輸標識,即1426(十進制);

00 00爲協議標識;

00 06爲字節長度;

ff爲單位標識符,即255(十進制);

02爲功能碼;

00 爲Modbus起始地址高位;

00 爲Modbus起始地址低位;

00 爲寄存器高位;

0b爲寄存器低位。

下圖爲query後的響應報文,Modbus傳輸內容爲 “05 92 00 00 00 05 ff 02 02 02 00”。

05 92(十六進制) 爲傳輸標識,即1426(十進制);

00 00爲協議標識;

00 06爲字節長度;

ff爲單位標識符,即255(十進制);

02爲功能碼;

02爲數據域字節數

02 00 爲數據字段。響應報文的數據字段中,每個線圈佔用1位(bit),02=0000 00010,00=0000 0000。1=ON,0=OFF。如果最後的數據字節不能填滿8個線圈的狀態(1個字節),則由0填充。

0x04 讀取輸入寄存器值

下圖爲query請求報文,Modbus傳輸內容爲 “07 45 00 00 00 06 ff 04 01 8f 00 02”。下圖請求報文大體含義爲:需讀取輸入寄存器地址30144-30145,共計2個寄存器內容。即讀取Modbus協議地址143至144的內容。

07 45(十六進制) 爲傳輸標識,即1861(十進制);

00 00爲協議標識;

00 06爲字節長度;

ff爲單位標識符,即255(十進制);

04爲功能碼;

01 爲Modbus起始地址高位;

8f 爲Modbus起始地址低位,起始地址爲143。

00 爲寄存器高位;

02爲寄存器低位,讀取數量爲2。

下圖爲query後的響應報文,Modbus傳輸內容爲 “07 45 00 00 00 07 ff 04 04 b6 00 47 7f”。

07 45(十六進制) 爲傳輸標識,即1861(十進制);

00 00爲協議標識;

00 07爲字節長度;

ff爲單位標識符,即255(十進制);

04爲功能碼;

04爲數據域字節數。

b6 00 47 7f爲數據字段。響應報文的數據字段中,每個線圈佔用1位(bit),b6=1011 0110,00=0000 0000,47=1000 0111,7f=1111111。1=ON,0=OFF。如果最後的數據字節不能填滿8個線圈的狀態(1個字節),則由0填充。

三、關於Modbus數據審計/防護

Modbus數據審計/防護其核心是對協議報文進行深度解碼分析,記錄其操作時間、地點、操作人、和操作行爲等關鍵要素,依託操作行爲數據的有效存儲和行爲管控,從而實現對Modbus系統的安全日誌的審計分析及異常阻斷,加強組織事中管控能力,事後回溯追查、分析研判的能力。

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