Modbus一個工業上經常使用的通信協議、一種通信約定。Modbus協議包括RTU、ASCII、TCP。其中MODBUS-RTU最經常使用,比較簡單,在單片機上很容易實現。算法
先來簡單分析一條MODBUS-RTU報文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04
從機地址 功能號 數據地址 數據 CRC校驗數組
這一串數據的意思是:把數據 0x0017(十進制23) 寫入 1號從機地址 0x0001數據地址。服務器
一、報文
一個報文就是一幀數據,一個數據幀就一個報文: 指的是一串完整的指令數據,就像上面的一串數據。
二、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主機計算的)相等,若是不相等那麼說明數據傳輸有錯誤這些數據不能要。
三、功能號
意義:modbus 定義。見附錄1。
做用:指示具體的操做。
MODBUS-RTU
1、一個報文分析
先聲明下咱們的目的,咱們是要兩個設備通信,用的是MODBUS協議。上面簡單介紹了:「報文」「CRC校驗」「功能號」。
在單片機中拿出一部份內存(RAM)進行兩個設備通信,例如:ide
數組後面的註釋,說明
OX[20] 表明是輸出線圈,用功能碼 0x01,0x05,0x0F 訪問, 開頭地址是 0 (這個後續說明)
IX[20] 表明是輸入線圈,用功能碼 0x02 訪問, 開頭地址是 1 (這個後續說明)
另外兩個同樣的道理。
注意:所謂的「線圈」「寄存器」就是「位變量」「16位變量」,不要被迷惑。之因此稱「線圈」我以爲應該是對於應用的設備,MODBUS協議是專門針對485總線設備(例PLC)開發的。
一、主機對從機寫數據操做
若是單片機接收到一個報文那麼就對報文進行解析執行相應的處理,如上面報文:
01 06 00 01 00 17 98 04
從機地址 功能號 數據地址 數據 CRC校驗
假如本機地址是 1 ,那麼單片機接收到這串數據根據數據計算CRC校驗判斷數據是否正確,若是判斷數據無誤,則結果是:
HoldDataReg[1] = 0x0017;
MODBUS主機就完成了一次對從機數據的寫操做,實現了通信。
二、主機對從機讀數據操做
主機進行讀HoldDataReg[1] 操做,則報文是:
01 03 00 01 00 01 D5 CA
從機地址 功能號 數據地址 讀取數據個數 CRC校驗
那麼單片機接收到這串數據根據數據計算CRC校驗判斷數據是否正確,若是判斷數據無誤,則結果是:返回信息給主機,返回的信息也是有格式的:
返回內容:
01 03 02 0017 F8 4A
從機地址 功能號 數據字節個數 兩個字節數據 CRC校驗
MODBUS主機就完成了一次對從機數據的讀操做,實現了通信。
2、MODBUS報文模型
以上了解到了MODBUS的一幀報文是如何通信的,其實每一個報文的格式都基本同樣的。
函數
這裏兩個縮略詞之前不知道,可是如今要明白指的是什麼,「ADU」「PDU」
ADU: 應用數據單元
PDU: 協議數據單元
3、MODBUS數據模型
3d
4、MODBUS事務處理
下列狀態圖描述了在服務器側MODBUS事務處理的通常處理過程。
blog
5、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
開發