13.2 框架設(shè)計(jì)
13.2.1 程序?qū)哟?/strong>
如下圖所示:
①程序總體劃分為:LVGL前臺(tái)程序,后臺(tái)程序。這使得GUI和后臺(tái)程序分開,可以很容易升級(jí)、替換GUI程序。
②LVGL程序:顯示界面,是用戶和后臺(tái)程序的橋梁,把用戶的指令下發(fā)給后臺(tái)程序,把后臺(tái)上報(bào)的數(shù)據(jù)在界面顯示出來(lái)。
③后臺(tái)程序(控制中心):根據(jù)前臺(tái)程序的指示去操作設(shè)備,比如把用戶設(shè)置的參數(shù)傳遞給MQTT程序、通知 modbus_tcp_server、通過(guò)RS485接口操作傳感器。
④MQTT程序:根據(jù)后臺(tái)程序的指示連接MQTT服務(wù)器、發(fā)布消息,訂閱消息。
⑤modbus_tcp_server:根據(jù)后臺(tái)程序的指示操作本地傳感器
13.2.2 后臺(tái)程序(控制中心)功能
后臺(tái)程序(控制中心),是程序的核心。它實(shí)現(xiàn)了各類RPC接口(遠(yuǎn)程調(diào)用接口),供前臺(tái)程序、MQTT程序使用,比如:
①前臺(tái)程序啟動(dòng)后,咨詢后臺(tái)程序,顯示出上次用戶配置的“點(diǎn)”
②前臺(tái)程序通過(guò)RPC接口對(duì)“點(diǎn)”進(jìn)行讀、寫操作
③前臺(tái)程序增加、刪除點(diǎn)時(shí),也是調(diào)用RPC接口
④前臺(tái)程序進(jìn)行MQTT設(shè)置、升級(jí)操作時(shí),也是使用RPC接口通知后臺(tái)程序
⑤MQTT程序通過(guò)RPC接口獲得MQTT設(shè)置信息、要操作的“點(diǎn)”的信息
⑥MQTT程序通過(guò)RPC接口讀、寫“點(diǎn)”
1. 兩個(gè)核心操作對(duì)象
一個(gè)是PointInfo結(jié)構(gòu)體,用來(lái)表示“點(diǎn)”。另一個(gè)是MQTTInfo結(jié)構(gòu)體,用來(lái)表示MQTT信息。
在工業(yè)控制領(lǐng)域,通過(guò)modbus操作傳感器時(shí),核心單位是“點(diǎn)”。它包含這些信息:
①使用什么協(xié)議?Modbus RTU還是Modbus TCP?
對(duì)于Modbus RTU,使用哪個(gè)串口?數(shù)據(jù)格式(數(shù)據(jù)位/檢驗(yàn)位/停止位)是什么?
對(duì)于Modbus TCP,IP和端口是什么?
②設(shè)備地址是?
③寄存器地址是?
④寄存器類型是?
針對(duì)“點(diǎn)”,本項(xiàng)目定義了一個(gè)結(jié)構(gòu)體來(lái)表示“點(diǎn)的信息”,如下:
左右滑動(dòng)查看完整內(nèi)容
typedef struct PointInfo { int point; char port_info[100]; int dev_addr; int reg_addr; char reg_type[4]; int period; /* ms */ }PointInfo, *PPointInfo;
point:點(diǎn)的索引,一個(gè)唯一的整數(shù),通過(guò)它可以找到某個(gè)“點(diǎn)”。
port_info:端口信息,表示串口時(shí)格式為“/dev/ttyUSB0,115200,8N1”;表示網(wǎng)絡(luò)時(shí)格式為“192.168.5.89:1052”。
dev_addr:設(shè)備地址
reg_addr:寄存器地址
reg_type:寄存器類型,有“0x”、“1x”、“4x”、“3x”四種取值。
period:讀取周期(單位ms)。
結(jié)構(gòu)體的信息,跟前臺(tái)程序?qū)?yīng),用一個(gè)PointInfo結(jié)構(gòu)體描述界面里這一個(gè)元素:
在前臺(tái)程序增加、修改、刪除、讀取、寫“點(diǎn)”時(shí),操作的就是對(duì)應(yīng)的PointInfo結(jié)構(gòu)體。所有的“點(diǎn)”信息,會(huì)保存在PointInfo結(jié)構(gòu)體數(shù)組里。
前臺(tái)程序設(shè)置MQTT信息時(shí),mqtt_client_app獲得MQTT 信息時(shí),這些信息都使用一個(gè)結(jié)構(gòu)體表示:
typedef struct MQTTInfo { char broker[100]; int port; char client_id[100]; char user[100]; char password[100]; char publish[100]; char subcribe[100]; }MQTTInfo, *PMQTTInfo;
2. 交互示例
RPC是遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call)的意思,而json是比較流行的傳遞信息的格式。
前臺(tái)程序和后臺(tái)程序之間使用“json-rpc”進(jìn)行遠(yuǎn)程調(diào)用:前臺(tái)程序發(fā)出請(qǐng)求,后臺(tái)程序處理請(qǐng)求返回結(jié)果。
比如前臺(tái)程序增加一個(gè)點(diǎn)時(shí),調(diào)用如下函數(shù)通知后臺(tái)程序:
這會(huì)導(dǎo)致后臺(tái)程序調(diào)用如下函數(shù):
它把cJSON格式的參數(shù)解析出來(lái)后,調(diào)用本地函數(shù):
3. RPC接口
定義好RPC接口后,前臺(tái)程序、后臺(tái)程序就可以獨(dú)立開發(fā)。在“controle_center”程序的rpc.h里定義了如下RPC接口。
①詢問(wèn)后臺(tái)程序有多少個(gè)點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 詢問(wèn)后臺(tái)程序有多少個(gè)點(diǎn) * 返回值:(-1)錯(cuò)誤, (>=0) 點(diǎn)的個(gè)數(shù) */ int rpc_get_point_count(int iSocketClient);
②詢問(wèn)后臺(tái)程序取出下一個(gè)點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 詢問(wèn)后臺(tái)程序取出下一個(gè)點(diǎn)(point > pre_point 的第 1 個(gè)點(diǎn)) * 返回值:(-1)錯(cuò)誤, (>=0) 點(diǎn)的個(gè)數(shù) */ int rpc_get_next_point(int iSocketClient, int pre_point, PPointInfo pInfo);
使用①②,就可以得到所有的點(diǎn)的信息,示例代碼為:
左右滑動(dòng)查看完整內(nèi)容
int cnt = rpc_get_point_count(fd); if (cnt > 0) { printf("point count = %d ", cnt); } int pre_point = -1; PointInfo tInfo; for (int i = 0; i < cnt; i++) { err = rpc_get_next_point(fd, pre_point, &tInfo); if (!err) { printf("Point %d: ", tInfo.point); printf("port_info: %s ", tInfo.port_info); printf("dev_addr: %d ", tInfo.dev_addr); printf("reg_addr: %d ", tInfo.reg_addr); printf("reg_type: %s ", tInfo.reg_type); printf("period: %d ", tInfo.period); } pre_point = tInfo.point; }
③增加點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* port_info: "/dev/ttyUSB0,115200,8n1" or "192.168.0.123:234" * dev_addr: modbus device address * reg_addr: register address * reg_type: "0x" - Coils, "1x" - Discrete Inputs, "4x" - Holding Registers, "3x" - I nput Registers * period: 訪問(wèn)周期(ms) * 返回值: -1 失敗, 其他值:唯一的句柄 */ int rpc_add_point(int iSocketClient, char *port_info, int dev_addr, int reg_addr, cha r *reg_type, int period);
④刪除點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 移除一個(gè)點(diǎn) * point: 要移除的點(diǎn) */ int rpc_remove_point(int iSocketClient, int point);
⑤修改點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 修改點(diǎn) * point: 要修改的點(diǎn) * * port_info: "/dev/ttyUSB0,115200,8n1" or "192.168.0.123:234" * dev_addr: modbus device address * reg_addr: register address * reg_type: "0x" - Coils, "1x" - Discrete Inputs, "4x" - Holding Registers, "3x" - I nput Registers * period: 訪問(wèn)周期(ms) * 返回值: -1 失敗, 其他值:唯一的句柄 */ int rpc_modify_point(int iSocketClient, int point, char *port_info, int dev_addr, int reg_addr, char *reg_type, int period);
⑥讀點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 讀數(shù)據(jù) * point: 哪個(gè)點(diǎn) */ int rpc_read_point(int iSocketClient, int point, int *val);
⑦寫點(diǎn):
左右滑動(dòng)查看完整內(nèi)容
/* 寫數(shù)據(jù) * point: 哪個(gè)點(diǎn) * val: 要寫入的數(shù)值 */ int rpc_write_point(int iSocketClient, int point, int val);
⑧升級(jí)功能:
左右滑動(dòng)查看完整內(nèi)容
/* 開始升級(jí)傳感器 */ int rpc_start_update(int iSocketClient, PUpdateInfo ptUpdateInfo); /* 詢問(wèn)后臺(tái)程序升級(jí)進(jìn)度 * 返回值:(-1)錯(cuò)誤, (>=0) 進(jìn)度(0~100) */ int rpc_get_update_percent(int iSocketClient);
⑨MQTT配置:
左右滑動(dòng)查看完整內(nèi)容
/* 詢問(wèn)后臺(tái)程序獲得 MQTT 信息 */ int rpc_get_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo); /* 設(shè)置后臺(tái)程序的 MQTT 信息 */ int rpc_set_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo);
-
MPU
+關(guān)注
關(guān)注
0文章
400瀏覽量
49519 -
程序
+關(guān)注
關(guān)注
117文章
3817瀏覽量
82168 -
MQTT
+關(guān)注
關(guān)注
5文章
662瀏覽量
23358
原文標(biāo)題:框架設(shè)計(jì) - RZ MPU工業(yè)控制教程連載(48)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
嵌入式里通用微秒計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)
Python技術(shù)學(xué)習(xí)之Django框架設(shè)計(jì)思想
框架設(shè)計(jì)中的常用模式有哪些
STM32F407的HAL庫(kù)框架設(shè)計(jì)
怎么實(shí)現(xiàn)ThreadX內(nèi)核模板框架設(shè)計(jì)?
聊聊我對(duì)單片機(jī)程序的整體框架設(shè)計(jì)的一些思路體會(huì)
HDF驅(qū)動(dòng)框架設(shè)計(jì)匯總分享
構(gòu)架設(shè)計(jì)
基于GIS的城鄉(xiāng)公交系統(tǒng)框架設(shè)計(jì)與實(shí)現(xiàn)
基于ARM Cortex-M4的MQX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)

基于ARMCortex_M4的MOX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)

Inside<SPAN class=“analog-coupler”>i</span>Coupler<sup>?</sup>技術(shù):封裝和引線框架設(shè)計(jì)

C 單片機(jī)項(xiàng)目框架設(shè)計(jì)要點(diǎn)

評(píng)論