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文章
668瀏覽量
30142 -
數據結構
+關注
關注
3文章
573瀏覽量
40603 -
RTU
+關注
關注
0文章
432瀏覽量
29270 -
LibModbus
+關注
關注
0文章
10瀏覽量
7403
原文標題:libmodbus源碼框架分析 - RZ MPU工業控制教程連載(38)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
第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驅動框架

評論