0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解框架设计

瑞萨MCU小百科 来源:瑞萨MCU小百科 2025-01-09 16:48 次阅读

13.2 框架设计

13.2.1 程序层次

如下图所示:

①程序总体划分为:LVGL前台程序,后台程序。这使得GUI和后台程序分开,可以很容易升级、替换GUI程序。

②LVGL程序:显示界面,是用户和后台程序的桥梁,把用户的指令下发给后台程序,把后台上报的数据在界面显示出来。

③后台程序(控制中心):根据前台程序的指示去操作设备,比如把用户设置的参数传递给MQTT程序、通知 modbus_tcp_server、通过RS485接口操作传感器

④MQTT程序:根据后台程序的指示连接MQTT服务器、发布消息,订阅消息。

⑤modbus_tcp_server:根据后台程序的指示操作本地传感器

a8e68320-ce3f-11ef-9310-92fbcf53809c.png

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结构体描述界面里这一个元素:

a8fcad08-ce3f-11ef-9310-92fbcf53809c.png

在前台程序增加、修改、删除、读取、写“点”时,操作的就是对应的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”进行远程调用:前台程序发出请求,后台程序处理请求返回结果。

比如前台程序增加一个点时,调用如下函数通知后台程序:

a9122426-ce3f-11ef-9310-92fbcf53809c.png

这会导致后台程序调用如下函数:

a9301a9e-ce3f-11ef-9310-92fbcf53809c.png

它把cJSON格式的参数解析出来后,调用本地函数:

a9437648-ce3f-11ef-9310-92fbcf53809c.png

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
    MPU
    +关注

    关注

    0

    文章

    372

    浏览量

    48856
  • 程序
    +关注

    关注

    117

    文章

    3792

    浏览量

    81163
  • MQTT
    +关注

    关注

    5

    文章

    652

    浏览量

    22564

原文标题:框架设计 - RZ MPU工业控制教程连载(48)

文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式里通用微秒计时函数框架设计与实现

    今天给大家分享的是嵌入式里通用微秒(microseconds)计时函数框架设计与实现。
    的头像 发表于 10-14 12:41 1909次阅读

    Python技术学习之Django框架设计思想

    返回的html。以上是老男孩教育对Django框架设计思想的简要介绍,想要了解更多信息,快来参加老男孩教育Python培训班吧,让您轻松掌握高深Python技能!
    发表于 06-15 15:01

    框架设计中的常用模式有哪些

    。消息订阅模式最常见的问题是同步模式下如何处理重入和超时。作为框架设计者,一定要考虑好这个问题。所谓重入,是二次开发者在消息的回调函数中执行订阅/取消订阅的操作,这会破坏消息订阅的机制。所谓超时是指二次开发
    发表于 12-17 16:44

    STM32F407的HAL库框架设

    第12章 STM32F407的HAL库框架设计学习通过本章节,主要是想让大家对HAL库程序设计的基本套路有个了解,防止踩坑。目录第12章 STM32F407的HAL库框架设计学习12.1 初学者重要
    发表于 08-10 06:23

    怎么实现ThreadX内核模板框架设计?

    怎么实现ThreadX内核模板框架设计?
    发表于 11-29 07:45

    聊聊我对单片机程序的整体框架设计的一些思路体会

    RTOS。或者使用RTOS,在整体思路上比较迷茫,不知从何入手,所以本文来聊聊我对单片机程序的整体框架设计的一些思路体会。为啥要讨论架构单片机系统开发人员的目标之一是在编程环境中创建固件,以实现低成本系...
    发表于 02-23 07:30

    HDF驱动框架设计汇总分享

    1、HDF驱动框架之linux驱动开发介绍什么是驱动开发?这个看似不是问题的问题却很重要,我们必须需要从这一步开始理清楚,见下图:HDF 驱动框架探路(一):2、HDF驱动框架之应用态打通内核的
    发表于 03-15 15:31

    架设

    架设计,这种构架设计是新的知识希望能够得到一本,可以继续发展构架思维和构架设计灵感。
    发表于 12-18 11:09

    基于GIS的城乡公交系统框架设计与实现

    本文在分析建立城乡公交信息系统意义的基础上,通过详细调研城乡公交工作需求,规划和设计了基于GIS 的城乡公交信息系统的框架设计,功能结构,并根据系统功能需要,在简
    发表于 12-19 14:12 8次下载

    基于CAN总线的通讯系统软件框架设

    基于CAN总线的通讯系统软件框架设
    发表于 01-24 16:54 21次下载

    基于ARM Cortex-M4的MQX中断机制分析与中断程序框架设

    基于ARM Cortex-M4的MQX中断机制分析与中断程序框架设
    发表于 09-25 08:29 6次下载
    基于ARM Cortex-M4的MQX中断机制分析与中断程序<b class='flag-5'>框架设</b>计

    基于ARMCortex_M4的MOX中断机制分析与中断程序框架设

    基于ARMCortex_M4的MOX中断机制分析与中断程序框架设
    发表于 09-28 09:13 4次下载
    基于ARMCortex_M4的MOX中断机制分析与中断程序<b class='flag-5'>框架设</b>计

    Inside<SPAN class=“analog-coupler”>i</span>Coupler<sup>®</sup>技术:封装和引线框架设

    InsideiCoupler®技术:封装和引线框架设
    发表于 05-18 19:12 3次下载
    Inside<SPAN class=“analog-coupler”>i</span>Coupler<sup>®</sup>技术:封装和引线<b class='flag-5'>框架设</b>计

    C 单片机项目框架设计要点

    1、项目架构     好的项目架构不仅开发便捷,二次开发更加方便,后期维护也容易上手。所以在项目之前就要将框架搭建好,考虑整体架构以及后期的功能拓展。2、架构分级     根据功能需求,一般分为三级
    发表于 11-04 16:36 15次下载
    C 单片机项目<b class='flag-5'>框架设</b>计要点

    智慧城市方案框架设

    涉及智慧楼宇方案框架
    发表于 06-08 14:29 0次下载