1. 程式人生 > >Modbus-RTU入門篇

Modbus-RTU入門篇

Modbus-RTU

一、資料分析
      兩個裝置(微控制器)通訊,用的是Modbus協議。
      在微控制器中拿出一部分記憶體(RAM)進行兩個裝置通訊,例如:
附件 說明:        OX[20]   代表是輸出線圈,用功能碼 0x01,0x05,0x0F 訪問, 開頭地址是 0 (這個後續說明)
       IX[20]    代表是輸入線圈,用功能碼 0x02 訪問,開頭地址是 1 (這個後續說明)
另外兩個一樣的道理。
       注意:所謂的“線圈”“暫存器”就是“位變數”“16位變數”。之所以稱“線圈”因為Modbus最初是施耐德公司為其PLC制定的一種通訊協議
很自然Modbus協議中的很多術語是和PLC中的術語相關的。

二、報文分析

       簡單分析一條Modbus-RTU報文,例如:01  06  00 01  00 17  98 04


       01               06                

00 01           00 17          98 04
  從機地址        功能號          資料地址          資料  
       CRC校驗


       這一串資料的意思是:把資料 0x0017(十進位制23) 寫入 1號從機地址 0x0001資料地址。

       一個報文就是一幀資料一個數據幀就一個報文: 指的是一串完整的指令資料,就像上面的一串資料。

       98 04它前面的資料(01 06 00 01 00 17)通過一演算法(見附錄2)計算出來的結果,其實就像是計算累加和那樣(就是010600010017加起來的值,它的演算法就是加法運算)


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: 協議資料單元

四、Modbus資料模型

附件 附件

五、Modbus事務處理

      下列狀態圖描述了在伺服器側Modbus事務處理的一般處理過程。
           
附件
六、Modbus請求與響應

      看Modbus協議手冊,中文第 10 頁開始,英文第 24 頁開始。手冊非常詳細舉例說明了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


附件