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浏览量
22564
原文标题:框架设计 - RZ MPU工业控制教程连载(48)
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论