11.2libmodbus源碼框架分析
libmodbus作為一個(gè)優(yōu)秀且免費(fèi)開源的跨平臺(tái)支持RTU 和 TCP模式的Modbus開發(fā)庫,非常值得大家借鑒和學(xué)習(xí)。本章對(duì)libmodbus源代碼進(jìn)行閱讀和分析。
11.2.1核心函數(shù)
以Modbus RTU協(xié)議為例,主設(shè)備、從設(shè)備初始化后:
①主設(shè)備就可以啟動(dòng)請(qǐng)求,即“發(fā)送消息”給從設(shè)備。
②從設(shè)備接收到請(qǐng)求后構(gòu)造數(shù)據(jù),啟動(dòng)響應(yīng)即“發(fā)送回復(fù)”。
③主機(jī)收到響應(yīng)后,會(huì)“檢查響應(yīng)”。
如下圖所示:
分析“l(fā)ibmodbus-3.1.10 estsunit-test-client.c”、“l(fā)ibmodbus-3.1.10 estsunit-test-server.c”,可以得到下面核心函數(shù)的使用過程:
11.2.2框架與數(shù)據(jù)結(jié)構(gòu)
站在APP開發(fā)的角度來說,使用上一節(jié)里介紹的libmodbus函數(shù)即可。但是,數(shù)據(jù)的傳輸必定涉及到底層數(shù)據(jù)傳輸。所以,從數(shù)據(jù)的收發(fā)過程,可以把使用libmodbus的源碼分為3層:
①APP:它知道要做什么,主設(shè)備要讀寫哪些寄存,從設(shè)備提供、接收什么數(shù)據(jù)。
②Modbus核心層:向上提供接口函數(shù),向下調(diào)用底層代碼構(gòu)造數(shù)據(jù)包并發(fā)送、接收數(shù)據(jù)包并解析。
③后端(數(shù)據(jù)傳輸):進(jìn)行硬件相關(guān)的數(shù)據(jù)封包與發(fā)送、接收與解包。
對(duì)于核心層、后端,抽象出了如下結(jié)構(gòu)體:
核心層modbus_t結(jié)構(gòu)體的成員含義如下:
后端modbus_backend_t結(jié)構(gòu)體的成員含義如下:
成員 | 含義 |
unsigned int backend_type; | 后端類型,是RTU還是TCP |
unsigned int header_length; | 頭部長度,比如RTU數(shù)據(jù)包前面需要有1字節(jié)的設(shè)備地址,頭部長度就是1 |
unsigned intchecksum_length; | 校驗(yàn)碼長度,RTU的校驗(yàn)碼是2字節(jié) |
unsigned int max_adu_length; | ADU(數(shù)據(jù)包)最大長度 |
set_slave | 設(shè)置從站地址 |
build_request_basis | 設(shè)置RTU請(qǐng)求包的基本數(shù)據(jù),這些數(shù)據(jù)的格式是一樣的,比如req[0]是從設(shè)備地址,req[1]是功能碼,req[2]和req[3]是寄存器地址,req[4]和req[5]是寄存器數(shù)量 |
build_response_basis | 設(shè)置RTU回應(yīng)包的基本數(shù)據(jù),這些數(shù)據(jù)的格式是一樣的,比如req[0]是從設(shè)備地址,req[1]是功能碼 |
prepare_response_tid | 生產(chǎn)傳輸標(biāo)識(shí)TID,在TCP中使用 |
send_msg_pre | 發(fā)送消息前的準(zhǔn)備工作,對(duì)于RTU是填充CRC檢驗(yàn)碼,對(duì)于TCP是填充頭部的Length |
send | 發(fā)送數(shù)據(jù)包 |
receive | 接收數(shù)據(jù)包 |
recv | 接收原始數(shù)據(jù),receive會(huì)調(diào)用recv得到原始數(shù)據(jù)然后解析出數(shù)據(jù)包 |
check_integrity | 檢查數(shù)據(jù)包的完整性 |
pre_check_confirmation | 檢查響應(yīng)數(shù)據(jù)包是否有效時(shí),先執(zhí)行pre_check_confirmation做一些簡單的檢查 |
connect | 硬件相關(guān)的連接,對(duì)于RTU就是打開串口、設(shè)置串口波特率等;對(duì)于TCP則是連接對(duì)端 |
is_connected | 判斷是否已經(jīng)連接 |
close | 關(guān)閉連接 |
flush | 清空接收到的、未處理的數(shù)據(jù) |
select | 阻塞一段時(shí)間以等待數(shù)據(jù) |
free | 釋放分配的modbus_t等結(jié)構(gòu)體 |
-
源碼
+關(guān)注
關(guān)注
8文章
641瀏覽量
29213 -
數(shù)據(jù)結(jié)構(gòu)
+關(guān)注
關(guān)注
3文章
573瀏覽量
40130 -
RTU
+關(guān)注
關(guān)注
0文章
413瀏覽量
28679 -
LibModbus
+關(guān)注
關(guān)注
0文章
8瀏覽量
7258
原文標(biāo)題:libmodbus源碼框架分析 - RZ MPU工業(yè)控制教程連載(38)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論