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

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

3天内不再提示

睿擎工业Modbus RTU数据MQTT透传解决方案

RT-Thread官方账号 2026-01-07 18:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:张丁丁

功能综述


该项目基于睿擎平台,开发了一款高性能工业物联网数据网关,实现Modbus RTU协议与MQTT协议的双向高效转换。该方案为传统工业设备在不改变原有功能和硬件结构的前提下,快速接入物联网提供了可靠且经济的技术路径。


核心功能


1、Modbus RTU数据采集与上云:

睿擎派作为Modbus RTU主站,定时读取从站寄存器数据

采集的数据通过消息队列机制传递至MQTT模块,实时发送至云端MQTT Broker

2、云端命令接收与设备控制:

睿擎派作为MQTT客户端,接收云端发布的控制命令

解析命令后转发至Modbus RTU模块,执行远程寄存器读写操作

3、技术优势:

采用生产者-消费者模型,基于RT-Thread消息队列实现进程间通信(IPC)

任务在无数据处理时进入阻塞状态,有效节省CPU资源,提升系统实时性

typedefstruct


{


uint16_taddress;


uint16_tvalue;


}ModbusData;

软件框架设计


项目架构与模块划分

本项目采用分层模块化设计,确保代码的可维护性和功能分离,核心模块包括:

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。

核心代码片段:

#include<rtthread.h>
#include"app_management.h"

intmain(void)
{
app_rt_thread_init();
rt_kprintf("Modbus-MQTT Gateway initialized successfully\n");
return0;
}



应用管理模块

功能说明应用管理模块是系统的中枢神经,负责全局资源管理和任务调度。它实现了:

1.消息队列的创建与维护,用于模块间通信

2.网络连接的初始化

3.关键任务线程的创建与启动(Modbus RTU和MQTT线程)

具体实现参见 app_management.c。

核心代码片段:

// 创建消息队列,实现Modbus与MQTT模块间通信


staticvoidmessage_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(void)
{
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(void)
{
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);
returnmodbus_connect(ctx);
}

// Modbus RTU主站线程
voidapp_modbusRTU_master_thread(void*arg)
{
uint16_treceived_regs[10];
modbus_rtu_master_init();

while(1)
{
// 读取寄存器数据并发送至MQTT模块
rc=modbus_read_registers(ctx,0,10,received_regs);
if(rc>0)
{
for(inti=0;i<rc;i++)
{
ModbusData data={.address=i,.value=received_regs[i]};
rt_mq_send(g_xQueueModbusRtuReadDate,&data,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地址


staticintmac_config(void)
{
uint8_tmac[6]={0x00,0x11,0x22,0x33,0x44,0x55};
returnif_set_mac(DEV_NAME,mac);
}

// 启用DHCP客户端




staticintdhcp_enable(void)
{
returnif_dhcp(DEV_NAME,1);
}

// 网络初始化入口
voidnetset_init(void)
{
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->message->payload;
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(root);
return0;
}

// MQTT线程 - 负责数据发布
voidapp_mqtt_thread(void*arg)
{
mq_start();// 启动MQTT客户端

while(1)
{
ModbusData data;
// 接收Modbus数据并发布到云端
rt_mq_recv(g_xQueueModbusRtuReadDate,&data,sizeof(ModbusData),RT_WAITING_FOREVER);
ModbusData_publish(&data);

rt_thread_mdelay(10);
}
}

演示效果

云端MQTT服务器连接状态

af209cdc-ebb5-11f0-8ce9-92fbcf53809c.png

实际应用演示

视频演示:

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=t&id=946489007785


立即扫码购买

af38080e-ebb5-11f0-8ce9-92fbcf53809c.png

平台持续提供完善的技术文档、示例代码与社区支持,助力您的项目快速落地!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MODBUS
    +关注

    关注

    28

    文章

    2571

    浏览量

    84066
  • 工业
    +关注

    关注

    3

    文章

    2470

    浏览量

    49424
  • RTU
    RTU
    +关注

    关注

    0

    文章

    455

    浏览量

    30742
  • MQTT
    +关注

    关注

    5

    文章

    747

    浏览量

    25328
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于派轻松玩转Modbus工业通信

    。今天,我们就带来一篇实战教程,教大家如何基于派/工业平台,分别作为ModbusRTU主机和ModbusTCP主机,读取
    的头像 发表于 07-23 17:05 4067次阅读
    基于<b class='flag-5'>睿</b><b class='flag-5'>擎</b>派轻松玩转<b class='flag-5'>Modbus</b><b class='flag-5'>工业</b>通信

    一触即达:CCLink IE遇见Modbus RTU,解锁智能电表“数据超车道”

    障碍。电表数据无法实时回至SCADA系统,导致能耗分析模块无法正常运行。经排查,问题根源在于CCLINKIE的高速总线协议与Modbus RTU的异步串行通信机制存在
    发表于 06-23 13:59

    无线串口终端

    无线串口终端——关键词:无线终端,无线串口,透明数据传输模块,无线485产品简介:WPLC-C系列无线串口终端,可广泛应用于无线传输
    发表于 04-27 15:33

    Modbus TCP转Modbus RTU的实现

    有:地址帧、功能码、数据、CRC校验。而Modbus TCP数据包包含有:MBAP报文头、功能码、数据。必须实现这两种格式的转化。3.Modbus
    发表于 08-10 10:04

    干货篇︱物联网平台——工业制造监测解决方案

    和控制设备的行为;有效解决工业数据调度的一致性与完整性问题通信层工业物联网需要从云端到终端的整体解决方案通信层目的是实现本地和云端的数据同步
    发表于 02-01 15:33

    组态软件的数据DTU通信技术工业网关

    串口数据,另外在该软件上还可以直接添加虚拟串口,与组态软件直接连接。能够看到组态王往下发的数据,及其DTU返回的数据方案优点★ 欣仰邦DTU支持标准的
    发表于 03-06 09:12

    物联网中的数据

    摘要:在农业工业等场景应用中,存在很多场景是有线网络无法达到的,借助物联网技术使用无线数据采集与传输能很好的解决这一个问题,在这个数据传输过程中为了保证数据的可靠性和准确性,通常会涉及
    发表于 09-03 14:17

    如何快速实现Modbus RTUModbus TCP协议转换?

    Modbus协议是工业现场串口设备之间常用的连接方式,其中最常见的就是Modbus RTUModbus TCP两种。许多工厂需要将现场各种
    发表于 08-18 18:36

    Modbus RTUModbus TCP的区别

    Modbus RTUModbus TCP的区别: 1.概念不同:MODBUS是一种标准的工业控制数据
    发表于 08-03 17:00 5.8w次阅读

    WD140系列工业终端概述、特性及应用

    WD140系列工业终端是一款工业Modbus I/O数据采集及LORA传输智能终端,支持LORA无线传输、支持IO
    发表于 09-11 10:07 1386次阅读

    MQTT 单片机移植 收发功能 STM32 串口

    MQTT 单片机移植 收发功能 STM32 串口 根据STM32+WIFI串口模块进行讲解如何使用
    发表于 11-22 09:06 39次下载
    <b class='flag-5'>MQTT</b> 单片机移植 收发功能 STM32 串口 <b class='flag-5'>透</b><b class='flag-5'>传</b>

    嗅准市场机遇,中易腾达推出工业解决方案

    中易腾达全新推出的工业解决方案, 是针对工业级设备厂商所打造的传输解决方案。Mesh作为全新
    的头像 发表于 11-07 09:51 1522次阅读

    Modbus RTU数据采集物联网解决方案

    了可靠且经济有效的解决方案。 一、 Modbus RTU概述 Modbus RTU是由施耐德公司于1979年开发的一种基于RS-232或RS
    的头像 发表于 04-01 09:37 1644次阅读
    <b class='flag-5'>Modbus</b> <b class='flag-5'>RTU</b><b class='flag-5'>数据</b>采集物联网<b class='flag-5'>解决方案</b>

    Modbus RTUModbus TCP转MQTT网关实现Modbus设备与云平台的无缝通信

    钡铼ModbusMQTT网关,简而言之,就是通过将Modbus协议(包括Modbus RTUModb
    的头像 发表于 07-23 16:58 5846次阅读
    <b class='flag-5'>Modbus</b> <b class='flag-5'>RTU</b>、<b class='flag-5'>Modbus</b> TCP转<b class='flag-5'>MQTT</b>网关实现<b class='flag-5'>Modbus</b>设备与云平台的无缝通信

    钡铼技术ModbusMQTT网关:桥接Modbus协议与MQTT协议

    提供了一键对接亚马逊云平台的解决方案。 BL101网关是钡铼技术研发的一款高性能工业物联网设备,通过桥接Modbus协议与MQTT通信协议,实现了
    的头像 发表于 07-30 16:28 1295次阅读
    钡铼技术<b class='flag-5'>Modbus</b>转<b class='flag-5'>MQTT</b>网关:桥接<b class='flag-5'>Modbus</b>协议与<b class='flag-5'>MQTT</b>协议