本篇作為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長度為位。
反控:
