11.2libmodbus源碼框架分析
libmodbus作為一個優秀且免費開源的跨平臺支持RTU 和 TCP模式的Modbus開發庫,非常值得大家借鑒和學習。本章對libmodbus源代碼進行閱讀和分析。
11.2.1核心函數
以Modbus RTU協議為例,主設備、從設備初始化后:
①主設備就可以啟動請求,即“發送消息”給從設備。
②從設備接收到請求后構造數據,啟動響應即“發送回復”。
③主機收到響應后,會“檢查響應”。
如下圖所示:

分析“libmodbus-3.1.10 estsunit-test-client.c”、“libmodbus-3.1.10 estsunit-test-server.c”,可以得到下面核心函數的使用過程:

11.2.2框架與數據結構
站在APP開發的角度來說,使用上一節里介紹的libmodbus函數即可。但是,數據的傳輸必定涉及到底層數據傳輸。所以,從數據的收發過程,可以把使用libmodbus的源碼分為3層:
①APP:它知道要做什么,主設備要讀寫哪些寄存,從設備提供、接收什么數據。
②Modbus核心層:向上提供接口函數,向下調用底層代碼構造數據包并發送、接收數據包并解析。
③后端(數據傳輸):進行硬件相關的數據封包與發送、接收與解包。

對于核心層、后端,抽象出了如下結構體:

核心層modbus_t結構體的成員含義如下:

后端modbus_backend_t結構體的成員含義如下:
| 成員 | 含義 |
| unsigned int backend_type; | 后端類型,是RTU還是TCP |
| unsigned int header_length; | 頭部長度,比如RTU數據包前面需要有1字節的設備地址,頭部長度就是1 |
| unsigned intchecksum_length; | 校驗碼長度,RTU的校驗碼是2字節 |
| unsigned int max_adu_length; | ADU(數據包)最大長度 |
| set_slave | 設置從站地址 |
| build_request_basis | 設置RTU請求包的基本數據,這些數據的格式是一樣的,比如req[0]是從設備地址,req[1]是功能碼,req[2]和req[3]是寄存器地址,req[4]和req[5]是寄存器數量 |
| build_response_basis | 設置RTU回應包的基本數據,這些數據的格式是一樣的,比如req[0]是從設備地址,req[1]是功能碼 |
| prepare_response_tid | 生產傳輸標識TID,在TCP中使用 |
| send_msg_pre | 發送消息前的準備工作,對于RTU是填充CRC檢驗碼,對于TCP是填充頭部的Length |
| send | 發送數據包 |
| receive | 接收數據包 |
| recv | 接收原始數據,receive會調用recv得到原始數據然后解析出數據包 |
| check_integrity | 檢查數據包的完整性 |
| pre_check_confirmation | 檢查響應數據包是否有效時,先執行pre_check_confirmation做一些簡單的檢查 |
| connect | 硬件相關的連接,對于RTU就是打開串口、設置串口波特率等;對于TCP則是連接對端 |
| is_connected | 判斷是否已經連接 |
| close | 關閉連接 |
| flush | 清空接收到的、未處理的數據 |
| select | 阻塞一段時間以等待數據 |
| free | 釋放分配的modbus_t等結構體 |
-
源碼
+關注
關注
8文章
685瀏覽量
31317 -
數據結構
+關注
關注
3文章
573瀏覽量
41584 -
RTU
+關注
關注
0文章
450瀏覽量
30590 -
LibModbus
+關注
關注
0文章
10瀏覽量
7628
發布評論請先 登錄
第6章_libmodbus使用
【米爾-瑞薩RZ/G2UL開發板】3.libmodbus移植使用
【米爾-瑞米派兼容樹莓派擴展模塊-試用體驗】安裝libmodbus
《HarmonyOS 2.0源碼框架分析》直播答疑
libmodbus使用ubuntu系統
基于select操作的libmodbus庫
OpenHarmony Camera源碼分析
淺析基于serialX串口驅動移植libmodbus
【悟空派H3開發板免費體驗】4、安裝libmodbus庫
嵌入式linux libmodbus的移植
libmodbus之嵌入式Linux使用及測試
存放OpenHarmony驅動子系統源碼信息的HDF驅動框架
libmodbus源碼框架分析
評論