modbus 乙個工業上常用的通訊協議、一種通訊約定。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校驗
先弄明白下面的東西。
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校驗
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
pragma詳細解釋
pragma是預處理指令,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指 令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。其格式一般為 pragmap...
mmap詳細解釋
mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案的操作。而posix或系統v的共享記憶體ipc則純粹用於共享目的,當然mmap 實現共享記憶體也是其主要應用之一。mmap系統呼叫使得程序之間通過對映同乙個普通檔案實現...
TableView詳細解釋
建立 uitableview datatable uitableview alloc initwithframe cgrectmake 0,0,320,420 datatable setdelegate self datatable setdatasource self self.view adds...