A. 干貨 | 動手寫寫Modbus-RTU協議
ModbusRTU協議的實現可以從以下三個方面進行闡述:物理層、鏈路層和應用層。
物理層: 基礎交互:物理層與控制晶元通過UART和一個GPIO進行交互,是實現ModbusRTU的基礎。
鏈路層: 報文接收:鏈路層主要負責報文接收服務,與物理層之間通過UART通信。 幀完整性判斷:根據Modbus標准,幀間隔至少需3.5個位元組時間,位元組間隔不超過1.5位元組時間。在3.5位元組時間內沒有接收新數據,即可判斷接收到一個完整的幀。 CRC校驗:為確保數據幀的接收,需加上CRC以完成數據幀的接收驗證。 實現細節:對於51單片機,實現過程相對簡單,其他單片機需根據具體情況調整。在接收過程中,檢查每次接收位元組後的間隔時間,超過1.5位元組時間時,丟棄所有位元組並重新開始接收。
應用層: 數據關聯:將用戶應用數據規劃為表格,如使用0x03、0x10命令時,設計數據表來關聯應用數據。例如,設計TemperatureSensorData和DAOutputData結構體用於溫度感測器和DA模擬量輸出的數據處理。 數據表設計:引入枚舉E_IDXS快速存取應用數據表中的條目,應用數據表appDataTable類似於字典,實現快速數據查找與存取。 寄存器表設計:設計Modbus寄存器表結構體,包含地址、索引和數據類型等成員,將Modbus寄存器表與應用數據關聯。 讀寫介面:提供GetDataFromReg和StoreDataToReg兩個讀寫介面,用於Modbus應用層訪問。GetDataFromReg用於從寄存器表中找到對應的應用數據內存地址,並將數據拷貝到緩沖區;StoreDataToReg用於從緩沖區接收報文並查詢寄存器表中的數據索引及數據類型,實現數據搬運。 幀校驗:在應用層處理鏈路層的幀校驗,包括判斷報文接收、檢查報文正確性、CRC16校驗以及驗證請求是否為設備支持的命令和針對該設備的請求。
通過以上三個層次的詳細設計和實現,可以構建一個完整的ModbusRTU協議從設備端系統。