天天看點

ModBus協定基礎

作者:晖晖yyds

本篇作為modbusrtu問題的基礎篇,先講講modbus相關的協定,後篇再講問題是如何解決的,是怎麼的一個思路。

先列個引子,問題:現場plc接裝置,比如泵、液位計、鼓風機等裝置,然後plc接dtu進行4G資料傳輸,雲伺服器接受資料并進行裝置資料的顯示及反控。

一張腦圖了解modbus的架構:

ModBus協定基礎

一、 Modbus的定義

Modbus通信協定:由Modicon公司(現在的施耐德電氣Schneider Electric)于1979年為可程式設計邏輯控制(即PLC)通信而發表。目前,Modbus已經成為工業領域通信協定的業界标準,并且現在是工業電子裝置之間常用的連接配接方式。Modbus作為目前工業領域應用(比如說:PLC)最廣泛的協定。

相對其它通信協定modbus 協定的特點:免費;簡單;接口豐富。

(1)Modbus協定标準開放、公開發表且無版權要求。

(2)Modbus協定支援多種電氣接口,包括RS232、RS485、TCP/IP等,還可以在各種媒體上傳輸,如雙絞線、光纖、紅外、無線等。

(3)Modbus協定消息幀格式簡單、緊湊、通俗易懂。使用者了解和使用簡單,廠商容易開發和內建,友善形成工業控制網絡 Modbus協定是一種應用層封包傳輸協定,包括ASCII、RTU、TCP三種封包類型,協定本身并沒有定義實體層,隻是定義了控制器能夠認識和使用的消息結構。

二、 Modbus的内容

先了解兩個概念:線圈和寄存器。

線圈:從電氣角度來看,在電氣回路中,一般都是靠接觸器或中間繼電器來實作控制,接觸器或中繼最終靠的是線圈的得電和失電來控制觸點閉合和斷開,是以用線圈表示布爾量;

寄存器:用來暫時存放參與運算的資料和運算結果,具有接收資料、存放資料和輸出資料的功能。

而寄存器在計算機中,就是用來存儲資料的,是以非布爾的資料放在寄存器裡。

而按照兩種類型形成了modbus的存儲,由于有讀有寫就會有4種不同的組合,而為了友善使用,定義了代碼。

ModBus協定基礎

由于存儲區有4個,對4個存儲區進行讀寫就有了更多的組合,由于輸入線圈及輸入寄存器隻能讀,是以一共有6種情況。但寫入又分成單個寫入和多個寫入,于是又多了兩種情況,于是便有了8種情況(modbus核心功能碼)。

ModBus協定基礎

三、 Modbus協定分類

Modbus協定目前存在Modbus RTU、Modbus ASCII、Modbus TCP三個版本。通信媒體: 包括序列槽和網口。

說協定之前先說下位(bit)、位元組(byte)、字(word)之間的關系。

ModBus協定基礎

ASCII參照

計算機底層都是二進制代碼,不一緻需進行轉換,但16進制用的多,不用十進制,因為16是2的倍數,更易表達,ASCII字元集采用的就是8bit,可以用2個16進制表示。目前上位機使用的基本都是16進制。

1word=2byte=16bit

高八位,低八位

記憶體裡,一個單元是一個位元組,也就是8位,16位的指令,就是同時操作連續的2個記憶體位址,将這連續的2個記憶體位址當成一個機關,是以就有高8位和低8位之分。

由于計算機僅識别二進制描述的數字,是以對一個記憶體位址,也就是8位二進制,如:0000 0001,0000就是高四位,0001就是低四位。

Why?

對于8位處理器,不存在此問題,但16、32、64位時就會存在此問題,會存在哪個在前,哪個在後的問題。

下面說說modbus協定。

ModBus協定基礎

Modbus-TCP:由TCP頭+位址+PDU組成,

Modbus-RTU:由位址+PDU+CRC校驗組成

a:Modbus為一問一答協定,發送一個請求後要等待回複才能發送第二個請求。

b:Modbus-RTU的實體接口為序列槽。

c:Modbus-TCP的實體接口為以太網。

Modbus封包如下所示:

ModBus協定基礎

Modbus通訊如下所示:

ModBus協定基礎

【在modbus協定中】

主機發送modbus請求,從機根據請求内容向主機傳回響應。在modbus協定中,主機總是主動方,從機總是被動方。

四、 Modbus封包解析

Modbus協定2種通信模式交換資訊:單點傳播模式和廣播模式。

不管是請求封包還是答複封包,資料結構如下:

ModBus協定基礎

即封包(幀資料)由4部分構成:位址(Slave Number)+功能碼(Function Codes)+資料(Data)+校驗(Check) 。其中的位址代表從裝置的ID位址,作為尋址的資訊。功能碼表示目前的請求執行具體什麼操作,比如讀還是寫。資料代表需要通訊的業務資料,可以根據實際情況來确定。最後一個校驗則是驗證資料是否有誤。其中的功能碼說明如下:

ModBus協定基礎

栗子:

a.請求:01 03 00 00 00 02 C4 0B

01:裝置位址 ,裝置位址為1

03:功能碼 ,目前為03讀取請求

00 00:寄存器起始位址,從00 00寄存器開始讀取

00 02:讀取寄存器長度 ,讀取2個長度,代表讀2個寄存器,即4個位元組。

C4 0B:CRC效驗和

回複:01 03 04 00 0C 00 02 BB F1

01:裝置位址 ,裝置位址為1

03:功能碼,目前為03讀取回複

04:資料長度 ,包含4個位元組的資料

00 0C:寄存器1數值

00 02:寄存器2數值

BB F1:CRC效驗和

03,04長度為寄存器。

以讀封包為例:

01,02:

發包:01 01 00 00 00 08 XX XX

回包:01 01 01 00 XX XX

此處00 08代表讀8位,即一個位元組,是以回包的資料長度為01。

01,02長度為位。

反控:

ModBus協定基礎