本篇作為modbusrtu問題的基礎篇,先講講modbus相關的協定,後篇再講問題是如何解決的,是怎麼的一個思路。
先列個引子,問題:現場plc接裝置,比如泵、液位計、鼓風機等裝置,然後plc接dtu進行4G資料傳輸,雲伺服器接受資料并進行裝置資料的顯示及反控。
一張腦圖了解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種不同的組合,而為了友善使用,定義了代碼。
由于存儲區有4個,對4個存儲區進行讀寫就有了更多的組合,由于輸入線圈及輸入寄存器隻能讀,是以一共有6種情況。但寫入又分成單個寫入和多個寫入,于是又多了兩種情況,于是便有了8種情況(modbus核心功能碼)。
三、 Modbus協定分類
Modbus協定目前存在Modbus RTU、Modbus ASCII、Modbus TCP三個版本。通信媒體: 包括序列槽和網口。
說協定之前先說下位(bit)、位元組(byte)、字(word)之間的關系。
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-TCP:由TCP頭+位址+PDU組成,
Modbus-RTU:由位址+PDU+CRC校驗組成
a:Modbus為一問一答協定,發送一個請求後要等待回複才能發送第二個請求。
b:Modbus-RTU的實體接口為序列槽。
c:Modbus-TCP的實體接口為以太網。
Modbus封包如下所示:
Modbus通訊如下所示:
【在modbus協定中】
主機發送modbus請求,從機根據請求内容向主機傳回響應。在modbus協定中,主機總是主動方,從機總是被動方。
四、 Modbus封包解析
Modbus協定2種通信模式交換資訊:單點傳播模式和廣播模式。
不管是請求封包還是答複封包,資料結構如下:
即封包(幀資料)由4部分構成:位址(Slave Number)+功能碼(Function Codes)+資料(Data)+校驗(Check) 。其中的位址代表從裝置的ID位址,作為尋址的資訊。功能碼表示目前的請求執行具體什麼操作,比如讀還是寫。資料代表需要通訊的業務資料,可以根據實際情況來确定。最後一個校驗則是驗證資料是否有誤。其中的功能碼說明如下:
栗子:
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長度為位。
反控: