睿擎工业Modbus RTU数据MQTT透传解决方案
作者:张丁丁
功能综述
该项目基于睿擎平台,开发了一款高性能工业物联网数据网关,实现Modbus RTU协议与MQTT协议的双向高效转换。该方案为传统工业设备在不改变原有功能和硬件结构的前提下,快速接入物联网提供了可靠且经济的技术路径。
核心功能
1、Modbus RTU数据采集与上云:
睿擎派作为Modbus RTU主站,定时读取从站寄存器数据
采集的数据通过消息队列机制传递至MQTT模块,实时发送至云端MQTT Broker
2、云端命令接收与设备控制:瑞清派作为MQTT客户端,接收云端下发的控制命令。
命令解析后转发给Modbus RTU模块进行远程寄存器读写操作。
3、技术优势:采用生产者-消费者模型,基于RT-Thread消息队列实现进程间通信(IPC)
任务在没有数据处理时进入阻塞状态,有效节省CPU资源,提高系统的实时性能。
类型定义结构
{
uint16_t地址;
uint16_t值;
}Modbus数据;
软件框架设计
项目架构与模块划分
本项目采用分层模块化设计,保证代码可维护性和功能分离。核心模块包括:
1、主入口模块:
a.程序执行入口
b.负责系统初始化过程并调用应用管理模块
c.具体实现参见main.c
2、应用管理模块:
a.集中管理应用程序任务
b.初始化全局资源,如RT-Thread消息队列等IPC机制
c.具体实现参见app_management.c
3、网络初始化模块:
a.配置设备网络连接
b.实施优先网络连接策略,为MQTT通信提供底层支持
c.具体实现参见app_netset.c
4、Modbus RTU协议处理模块:
a.实现Modbus RTU协议功能
b.负责外设初始化、主站数据读取和远程控制
c.具体实现参见applicationModbusRtu.c
5、MQTT通信模块:
a.实现MQTT客户端功能
b.负责Broker连接、命令接收和数据发布
c.具体实现参见applicationMqtt.c
测试环境与云端配置
本项目使用阿里云服务器部署EMQX MQTT Broker,作为可靠的云端测试环境,确保Modbus RTU网关与云平台之间的稳定双向通信。
软件模块详细说明
主入口模块
功能说明:主入口模块是程序的核心启动点,负责初始化系统资源和启动应用管理模块。它作为整个系统的启动器,保证所有功能模块的初始化并按正确的顺序运行。具体实现参见main.c。
核心代码片段:#includertthread.h
#include'app_management.h'
内部主函数(无效)
{
app_rt_thread_init();
rt_kprintf('Modbus-MQTT网关初始化成功\n');
返回0;
}
应用管理模块功能说明:应用管理模块是系统的中枢神经,负责全局资源管理和任务调度。它实现了:
1.模块间通信消息队列的创建和维护
2.网络连接初始化
3. 关键任务线程(Modbus RTU 和MQTT 线程)的创建和启动
具体实现参见app_management.c。
核心代码片段://创建消息队列,实现Modbus与MQTT模块之间的通信
静态voidmessage_queue_init(void)
{
g_xQueueModbusRtuReadDate=rt_mq_create('modbus_rtu_mq',sizeof(ModbusData),10,RT_IPC_FLAG_FIFO);
g_xQueueModbusRtuWriteDate=rt_mq_create('modbus_rtu_mq_w',sizeof(ModbusData),10,RT_IPC_FLAG_FIFO);
}
//系统初始化和任务启动
voidapp_rt_thread_init(无效)
{
message_queue_init();
netset_init();//网络初始化
//启动Modbus RTU主站任务
tid=rt_thread_create('modbus_rtu_thread',app_modbusRTU_master_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
//启动MQTT通信任务
tid=rt_thread_create('mqtt_thread',app_mqtt_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
}
Modbus RTU协议处理模块
功能说明:该模块实现Modbus RTU协议的主站功能,是网关与工业设备通信的核心。主要负责:
1、配置并初始化Modbus RTU通讯参数
2、定时读取从设备寄存器数据
3.接收并执行MQTT模块的远程控制命令
具体实现参见applicationModbusRtu.c。
核心代码片段://初始化Modbus RTU主站
staticintmodbus_rtu_master_init(无效)
{
ctx=modbus_new_rtu('/dev/uart5',9600,'N',8,1);
modbus_set_slave(ctx,1);
modbus_set_response_timeout(ctx,1,0);
modbus_rtu_set_serial_mode(ctx,MODBUS_RTU_RS485);
modbus_rtu_set_rts(ctx,RS485_RTS_PIN,MODBUS_RTU_RTS_UP);
返回modbus_connect(ctx);
}
//Modbus RTU 主线程
voidapp_modbusRTU_master_thread(void*arg)
{
uint16_treceived_regs[10];
modbus_rtu_master_init();
同时(1)
{
//读取寄存器数据并发送给MQTT模块
rc=modbus_read_registers(ctx,0,10,received_regs);
如果(rc0)
{
for(inti=0;irc;i++)
{
ModbusData data={.address=i,value=received_regs[i]};
rt_mq_send(g_xQueueModbusRtuReadDate,数据,sizeof(ModbusData));
}
}
//处理远程写命令
ModbusData write_data;
rt_mq_recv(g_xQueueModbusRtuWriteDate,write_data,sizeof(ModbusData),RT_WAITING_FOREVER);
modbus_write_register(ctx,write_data.address,write_data.value);
rt_thread_delay(1000);
}
}
网络初始化模块
功能说明:该模块负责设备网络连接的配置与初始化,为MQTT通信提供底层网络支持。主要功能包括MAC地址配置和DHCP客户端启用,确保设备能自动获取IP地址并建立网络连接,具体实现参见 app_netset.c。
核心代码片段://配置MAC地址
静态intmac_config(无效)
{
uint8_tmac[6]={0x00,0x11,0x22,0x33,0x44,0x55};
returnif_set_mac(DEV_NAME,mac);
}
//启用DHCP 客户端
staticintdhcp_enable(无效)
{
returnif_dhcp(DEV_NAME,1);
}
//网络初始化入口
无效netset_init(无效)
{
mac_config();
dhcp_enable();
}
MQTT通信模块
功能说明:
该模块实现MQTT客户端功能,是网关与云端通信的桥梁。主要功能包括:
1.MQTT Broker 连接和身份验证
2.订阅云控制命令
3. 发布Modbus采集数据
4.JSON与Modbus数据格式转换
具体实现参见applicationMqtt.c。
核心代码片段://MQTT订阅回调函数-处理云控命令
staticvoidmqtt_sub_callback(MQTTClient*c,MessageData*msg_data)
{
ModbusData write_data;
//解析JSON命令
constchar*json_string=(constchar*)msg_data-消息有效负载;
if(json_to_ModbusData(json_string,write_data)==0)
{
//发送到Modbus写队列
rt_mq_send(g_xQueueModbusRtuWriteDate,write_data,sizeof(ModbusData));
}
}
//数据格式转换-JSON到ModbusData
intjson_to_ModbusData(constchar*json_string,ModbusData*out_data)
{
cJSON*root=cJSON_Parse(json_string);
if(root==NULL)return-1;
out_data-address=(uint16_t)cJSON_GetObjectItemCaseSensitive(root,'address')-valuedouble;
out_data-value=(uint16_t)cJSON_GetObjectItemCaseSensitive(root,'value')-valuedouble;
cJSON_Delete(根);
返回0;
}
//MQTT线程-负责数据发布
voidapp_mqtt_thread(void*arg)
{
mq_start();//启动MQTT客户端
同时(1)
{
ModbusData数据;
//接收Modbus数据并发布到云端
rt_mq_recv(g_xQueueModbusRtuReadDate,数据,sizeof(ModbusData),RT_WAITING_FOREVER);
ModbusData_publish(数据);
rt_thread_mdelay(10);
}
}
演示效果
云端MQTT服务器连接状态
实际应用演示
视频演示:
https://www.bilibili.com/video/BV1uWSnBwEqp/?vd_source=9ed2178ae937fd4121a4f70f89f06b65
源码仓库
GitHub存储库:https://github.com/yxy314/ruiqingpai_RTU_MQTT
总结
本项目实现了一款功能齐全、性能稳定的Modbus RTU与MQTT协议转换网关,具有以下特点:
1、高可靠性:使用成熟的开源库和RT-Thread实时操作系统,保证系统稳定性
2、低资源占用:优化的任务调度和内存管理,适合资源受限的嵌入式平台
3、易于扩展:模块化设计便于功能扩展和定制
4、安全通信:支持MQTT认证机制,保证数据传输安全
该网关为工业设备的物联网改造提供了高效、经济的解决方案,可广泛应用于工业自动化、智能工厂、远程监控等领域。
本文展示了瑞清平台将传统工业设备无缝连接到物联网的完整能力。如果您正在寻找一个稳定、高效、开箱即用的硬件平台来部署此类解决方案,或者用于您的其他工业控制项目,那么实现本文所有功能的瑞清派RC3506开发板将是您的理想选择。
为什么选择睿擎派进行开发?软硬一体,省心省力:本文所有软件都可以在此开发板上流畅运行,无需担心硬件适配问题。
全栈自主,开放灵活:基于RT-Thread的锐清平台提供从底层驱动到应用框架的全栈支持,并允许您进行深度定制。
工业级可靠性:专为工业环境而设计,确保您的关键应用稳定运行。
即刻入手,开始您的项目如果您对本文的解决方案感兴趣,或者想基于瑞清牌实现自己的工业物联网想法,欢迎您访问我们的官方淘宝店“瑞赛德科技”购买瑞清牌RC3506开发板及配套配件。
睿擎派工业开发板购买链接:
https://item.taobao.com/item.htm?ft=tid=946489007785
立即扫码购买
平台持续提供完整的技术文档、示例代码和社区支持,帮助您的项目快速上线!