Modbus RTU協議說明
阿新 • • 發佈:2019-01-27
Modbus協議包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比較簡單,在微控制器上很容易實現。雖然RTU比較簡單,但是看協議資料、手冊說得太專業了,起初很多內容都很難理解。
所謂的協議是什麼?就是互相之間的約定嘛,如果不讓別人知道那就是暗號。現在就來定義一個新的最簡單協議。例如,
協議: “A” --“LED滅”
“B” --“報警”
“C” --“LED亮”
微控制器接收到“A”控制一個LED滅,微控制器接收到“B”控制報警,微控制器接收到“A”控制一個LED亮。那麼當收到對應的資訊就執行相應的動作,這就是協議,很簡單吧。
先來簡單分析一條MODBUS-RTU報文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04
從機地址 功能號 資料地址 資料 CRC校驗
這一串資料的意思是:把資料 0x0017(十進位制23) 寫入 1號從機地址 0x0001資料地址。
先弄明白下面的東西。
1、報文
一個報文就是一幀資料,一個數據幀就一個報文: 指的是一串完整的指令資料,就像上面的一串資料。
2、CRC校驗
意義:例如上面的 98 04 是它前面的資料(01 06 00 01 00 17)通過一演算法(見附錄2,很簡單的)計算出來的結果,其實就像是計算累加和那樣。(累加和:就是010600010017加起來的值,然後它的演算法就是加法)。
作用:在資料傳輸過程中可能資料會發生錯誤,CRC檢驗檢測接收的資料是否正確。比如主機發出01 06 00 01 00 17 98 04,那麼從機接收到後要根據01 06 00 01 00 17 再計算CRC校驗值,從機判斷自己計算出來的CRC校驗是否與接收的CRC校驗(98 04主機計算的)相等,如果不相等那麼說明資料傳輸有錯誤這些資料不能要。
3、功能號
意義:modbus 定義。見附錄1。
作用:指示具體的操作。
MODBUS-RTU
一、一個報文分析
先宣告下我們的目的,我們是要兩個裝置通訊,用的是MODBUS協議。上面簡單介紹了:“報文”“CRC校驗”“功能號”。
在微控制器中拿出一部分記憶體(RAM)進行兩個裝置通訊,例如:
陣列後面的註釋,說明
OX[20] 代表是輸出線圈,用功能碼 0x01,0x05,0x0F 訪問, 開頭地址是 0 (這個後續說明)
IX[20] 代表是輸入線圈,用功能碼 0x02 訪問, 開頭地址是 1 (這個後續說明)
另外兩個一樣的道理。
注意:所謂的“線圈”“暫存器”就是“位變數”“16位變數”,不要被迷惑。之所以稱“線圈”我覺得應該是對於應用的裝置,MODBUS協議是專門針對485匯流排裝置(例PLC)開發的。
1、主機對從機寫資料操作
如果微控制器接收到一個報文那麼就對報文進行解析執行相應的處理,如上面報文:
01 06 00 01 00 17 98 04
從機地址 功能號 資料地址 資料 CRC校驗
假如本機地址是 1 ,那麼微控制器接收到這串資料根據資料計算CRC校驗判斷資料是否正確,如果判斷資料無誤,則結果是:
HoldDataReg[1] = 0x0017;
MODBUS主機就完成了一次對從機資料的寫操作,實現了通訊。
2、主機對從機讀資料操作
主機進行讀HoldDataReg[1] 操作,則報文是:
01 03 00 01 00 01 D5 CA
從機地址 功能號 資料地址 讀取資料個數 CRC校驗
那麼微控制器接收到這串資料根據資料計算CRC校驗判斷資料是否正確,如果判斷資料無誤,則結果是:返回資訊給主機,返回的資訊也是有格式的:
返回內容:
01 03 02 0017 F8 4A
從機地址 功能號 資料位元組個數 兩個位元組資料 CRC校驗
MODBUS主機就完成了一次對從機資料的讀操作,實現了通訊。
二、MODBUS報文模型
以上了解到了MODBUS的一幀報文是如何通訊的,其實每個報文的格式都基本一樣的。
這裡兩個縮略詞以前不知道,但是現在要明白指的是什麼,“ADU”“PDU”
ADU: 應用資料單元
PDU: 協議資料單元
三、MODBUS資料模型
四、MODBUS事務處理
下列狀態圖描述了在伺服器側MODBUS事務處理的一般處理過程。
五、MODBUS請求與響應
看MODBUS協議手冊,中文第 10 頁開始,英文第 24 頁開始。手冊非常詳細舉例說明了MODBUS協議各個功能號的請求與響應。
modbus協議在微控制器上實現過程
MODBUS 任務處理函式
函式中,RcvBuf 為串列埠接收緩衝區,如果接收了一個報文則,RcvBuf[0] 為從機地址,RcvBuf[0] 為MODBUS功能號。根據功能號做出響應,而具體的操作根據功能號在各自的函式中執行,相當於解析接收到的資料。
附錄1:MODBUS-RTU功能碼
最常用功能碼:
下面“線圈”“暫存器”其實分別直的就是“位變數”“16位變數”
01 (0x01) 讀線圈
02 (0x02) 讀離散量輸入
03 (0x03) 讀保持暫存器
04(0x04) 讀輸入暫存器
05 (0x05) 寫單個線圈
06 (0x06) 寫單個暫存器
15 (0x0F) 寫多個線圈
16 (0x10) 寫多個暫存器
附錄2:CRC Generation
資料下載:
所謂的協議是什麼?就是互相之間的約定嘛,如果不讓別人知道那就是暗號。現在就來定義一個新的最簡單協議。例如,
協議: “A” --“LED滅”
“B” --“報警”
“C” --“LED亮”
微控制器接收到“A”控制一個LED滅,微控制器接收到“B”控制報警,微控制器接收到“A”控制一個LED亮。那麼當收到對應的資訊就執行相應的動作,這就是協議,很簡單吧。
先來簡單分析一條MODBUS-RTU報文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04
從機地址 功能號 資料地址 資料 CRC校驗
這一串資料的意思是:把資料 0x0017(十進位制23) 寫入 1號從機地址 0x0001資料地址。
先弄明白下面的東西。
1、報文
一個報文就是一幀資料,一個數據幀就一個報文: 指的是一串完整的指令資料,就像上面的一串資料。
2、CRC校驗
意義:例如上面的 98 04 是它前面的資料(01 06 00 01 00 17)通過一演算法(見附錄2,很簡單的)計算出來的結果,其實就像是計算累加和那樣。(累加和:就是010600010017加起來的值,然後它的演算法就是加法)。
作用:在資料傳輸過程中可能資料會發生錯誤,CRC檢驗檢測接收的資料是否正確。比如主機發出01 06 00 01 00 17 98 04,那麼從機接收到後要根據01 06 00 01 00 17 再計算CRC校驗值,從機判斷自己計算出來的CRC校驗是否與接收的CRC校驗(98 04主機計算的)相等,如果不相等那麼說明資料傳輸有錯誤這些資料不能要。
3、功能號
意義:modbus 定義。見附錄1。
作用:指示具體的操作。
MODBUS-RTU
一、一個報文分析
先宣告下我們的目的,我們是要兩個裝置通訊,用的是MODBUS協議。上面簡單介紹了:“報文”“CRC校驗”“功能號”。
在微控制器中拿出一部分記憶體(RAM)進行兩個裝置通訊,例如:
陣列後面的註釋,說明
OX[20] 代表是輸出線圈,用功能碼 0x01,0x05,0x0F 訪問, 開頭地址是 0 (這個後續說明)
IX[20] 代表是輸入線圈,用功能碼 0x02 訪問, 開頭地址是 1 (這個後續說明)
另外兩個一樣的道理。
注意:所謂的“線圈”“暫存器”就是“位變數”“16位變數”,不要被迷惑。之所以稱“線圈”我覺得應該是對於應用的裝置,MODBUS協議是專門針對485匯流排裝置(例PLC)開發的。
1、主機對從機寫資料操作
如果微控制器接收到一個報文那麼就對報文進行解析執行相應的處理,如上面報文:
01 06 00 01 00 17 98 04
從機地址 功能號 資料地址 資料 CRC校驗
假如本機地址是 1 ,那麼微控制器接收到這串資料根據資料計算CRC校驗判斷資料是否正確,如果判斷資料無誤,則結果是:
HoldDataReg[1] = 0x0017;
MODBUS主機就完成了一次對從機資料的寫操作,實現了通訊。
2、主機對從機讀資料操作
主機進行讀HoldDataReg[1] 操作,則報文是:
01 03 00 01 00 01 D5 CA
從機地址 功能號 資料地址 讀取資料個數 CRC校驗
那麼微控制器接收到這串資料根據資料計算CRC校驗判斷資料是否正確,如果判斷資料無誤,則結果是:返回資訊給主機,返回的資訊也是有格式的:
返回內容:
01 03 02 0017 F8 4A
從機地址 功能號 資料位元組個數 兩個位元組資料 CRC校驗
MODBUS主機就完成了一次對從機資料的讀操作,實現了通訊。
二、MODBUS報文模型
以上了解到了MODBUS的一幀報文是如何通訊的,其實每個報文的格式都基本一樣的。
這裡兩個縮略詞以前不知道,但是現在要明白指的是什麼,“ADU”“PDU”
ADU: 應用資料單元
PDU: 協議資料單元
三、MODBUS資料模型
四、MODBUS事務處理
下列狀態圖描述了在伺服器側MODBUS事務處理的一般處理過程。
五、MODBUS請求與響應
看MODBUS協議手冊,中文第 10 頁開始,英文第 24 頁開始。手冊非常詳細舉例說明了MODBUS協議各個功能號的請求與響應。
modbus協議在微控制器上實現過程
MODBUS 任務處理函式
函式中,RcvBuf 為串列埠接收緩衝區,如果接收了一個報文則,RcvBuf[0] 為從機地址,RcvBuf[0] 為MODBUS功能號。根據功能號做出響應,而具體的操作根據功能號在各自的函式中執行,相當於解析接收到的資料。
附錄1:MODBUS-RTU功能碼
最常用功能碼:
下面“線圈”“暫存器”其實分別直的就是“位變數”“16位變數”
01 (0x01) 讀線圈
02 (0x02) 讀離散量輸入
03 (0x03) 讀保持暫存器
04(0x04) 讀輸入暫存器
05 (0x05) 寫單個線圈
06 (0x06) 寫單個暫存器
15 (0x0F) 寫多個線圈
16 (0x10) 寫多個暫存器
附錄2:CRC Generation
資料下載: