ModBus 協議

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 

開發

附件
相關文章
相關標籤/搜索