13.2 框架設計
13.2.1 程序層次
如下圖所示:
①程序總體劃分為:LVGL前臺程序,后臺程序。這使得GUI和后臺程序分開,可以很容易升級、替換GUI程序。
②LVGL程序:顯示界面,是用戶和后臺程序的橋梁,把用戶的指令下發給后臺程序,把后臺上報的數據在界面顯示出來。
③后臺程序(控制中心):根據前臺程序的指示去操作設備,比如把用戶設置的參數傳遞給MQTT程序、通知 modbus_tcp_server、通過RS485接口操作傳感器。
④MQTT程序:根據后臺程序的指示連接MQTT服務器、發布消息,訂閱消息。
⑤modbus_tcp_server:根據后臺程序的指示操作本地傳感器
13.2.2 后臺程序(控制中心)功能
后臺程序(控制中心),是程序的核心。它實現了各類RPC接口(遠程調用接口),供前臺程序、MQTT程序使用,比如:
①前臺程序啟動后,咨詢后臺程序,顯示出上次用戶配置的“點”
②前臺程序通過RPC接口對“點”進行讀、寫操作
③前臺程序增加、刪除點時,也是調用RPC接口
④前臺程序進行MQTT設置、升級操作時,也是使用RPC接口通知后臺程序
⑤MQTT程序通過RPC接口獲得MQTT設置信息、要操作的“點”的信息
⑥MQTT程序通過RPC接口讀、寫“點”
1. 兩個核心操作對象
一個是PointInfo結構體,用來表示“點”。另一個是MQTTInfo結構體,用來表示MQTT信息。
在工業控制領域,通過modbus操作傳感器時,核心單位是“點”。它包含這些信息:
①使用什么協議?Modbus RTU還是Modbus TCP?
對于Modbus RTU,使用哪個串口?數據格式(數據位/檢驗位/停止位)是什么?
對于Modbus TCP,IP和端口是什么?
②設備地址是?
③寄存器地址是?
④寄存器類型是?
針對“點”,本項目定義了一個結構體來表示“點的信息”,如下:
左右滑動查看完整內容
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:點的索引,一個唯一的整數,通過它可以找到某個“點”。
port_info:端口信息,表示串口時格式為“/dev/ttyUSB0,115200,8N1”;表示網絡時格式為“192.168.5.89:1052”。
dev_addr:設備地址
reg_addr:寄存器地址
reg_type:寄存器類型,有“0x”、“1x”、“4x”、“3x”四種取值。
period:讀取周期(單位ms)。
結構體的信息,跟前臺程序對應,用一個PointInfo結構體描述界面里這一個元素:
在前臺程序增加、修改、刪除、讀取、寫“點”時,操作的就是對應的PointInfo結構體。所有的“點”信息,會保存在PointInfo結構體數組里。
前臺程序設置MQTT信息時,mqtt_client_app獲得MQTT 信息時,這些信息都使用一個結構體表示:
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是遠程過程調用(Remote Procedure Call)的意思,而json是比較流行的傳遞信息的格式。
前臺程序和后臺程序之間使用“json-rpc”進行遠程調用:前臺程序發出請求,后臺程序處理請求返回結果。
比如前臺程序增加一個點時,調用如下函數通知后臺程序:
這會導致后臺程序調用如下函數:
它把cJSON格式的參數解析出來后,調用本地函數:
3. RPC接口
定義好RPC接口后,前臺程序、后臺程序就可以獨立開發。在“controle_center”程序的rpc.h里定義了如下RPC接口。
①詢問后臺程序有多少個點:
左右滑動查看完整內容
/* 詢問后臺程序有多少個點 * 返回值:(-1)錯誤, (>=0) 點的個數 */ int rpc_get_point_count(int iSocketClient);
②詢問后臺程序取出下一個點:
左右滑動查看完整內容
/* 詢問后臺程序取出下一個點(point > pre_point 的第 1 個點) * 返回值:(-1)錯誤, (>=0) 點的個數 */ int rpc_get_next_point(int iSocketClient, int pre_point, PPointInfo pInfo);
使用①②,就可以得到所有的點的信息,示例代碼為:
左右滑動查看完整內容
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; }
③增加點:
左右滑動查看完整內容
/* 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: 訪問周期(ms) * 返回值: -1 失敗, 其他值:唯一的句柄 */ int rpc_add_point(int iSocketClient, char *port_info, int dev_addr, int reg_addr, cha r *reg_type, int period);
④刪除點:
左右滑動查看完整內容
/* 移除一個點 * point: 要移除的點 */ int rpc_remove_point(int iSocketClient, int point);
⑤修改點:
左右滑動查看完整內容
/* 修改點 * point: 要修改的點 * * 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: 訪問周期(ms) * 返回值: -1 失敗, 其他值:唯一的句柄 */ int rpc_modify_point(int iSocketClient, int point, char *port_info, int dev_addr, int reg_addr, char *reg_type, int period);
⑥讀點:
左右滑動查看完整內容
/* 讀數據 * point: 哪個點 */ int rpc_read_point(int iSocketClient, int point, int *val);
⑦寫點:
左右滑動查看完整內容
/* 寫數據 * point: 哪個點 * val: 要寫入的數值 */ int rpc_write_point(int iSocketClient, int point, int val);
⑧升級功能:
左右滑動查看完整內容
/* 開始升級傳感器 */ int rpc_start_update(int iSocketClient, PUpdateInfo ptUpdateInfo); /* 詢問后臺程序升級進度 * 返回值:(-1)錯誤, (>=0) 進度(0~100) */ int rpc_get_update_percent(int iSocketClient);
⑨MQTT配置:
左右滑動查看完整內容
/* 詢問后臺程序獲得 MQTT 信息 */ int rpc_get_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo); /* 設置后臺程序的 MQTT 信息 */ int rpc_set_mqttinfo(int iSocketClient, PMQTTInfo ptMQTTInfo);
-
MPU
+關注
關注
0文章
372瀏覽量
48856 -
程序
+關注
關注
117文章
3792瀏覽量
81163 -
MQTT
+關注
關注
5文章
652瀏覽量
22563
原文標題:框架設計 - RZ MPU工業控制教程連載(48)
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論