Modbus-RTU
在單片機中拿出一部分內存(RAM)進行兩個設備通訊,例如:
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的一幀報文是如何通訊的,其實每個報文的格式都基本一樣的。
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
- 頂
- 1
- 踩