作者:張丁丁
功能綜述
該項(xiàng)目基于睿擎平臺(tái),開(kāi)發(fā)了一款高性能工業(yè)物聯(lián)網(wǎng)數(shù)據(jù)網(wǎng)關(guān),實(shí)現(xiàn)Modbus RTU協(xié)議與MQTT協(xié)議的雙向高效轉(zhuǎn)換。該方案為傳統(tǒng)工業(yè)設(shè)備在不改變?cè)泄δ芎陀布Y(jié)構(gòu)的前提下,快速接入物聯(lián)網(wǎng)提供了可靠且經(jīng)濟(jì)的技術(shù)路徑。
核心功能
1、Modbus RTU數(shù)據(jù)采集與上云:
睿擎派作為Modbus RTU主站,定時(shí)讀取從站寄存器數(shù)據(jù)
采集的數(shù)據(jù)通過(guò)消息隊(duì)列機(jī)制傳遞至MQTT模塊,實(shí)時(shí)發(fā)送至云端MQTT Broker
2、云端命令接收與設(shè)備控制:
睿擎派作為MQTT客戶(hù)端,接收云端發(fā)布的控制命令
解析命令后轉(zhuǎn)發(fā)至Modbus RTU模塊,執(zhí)行遠(yuǎn)程寄存器讀寫(xiě)操作
3、技術(shù)優(yōu)勢(shì):
采用生產(chǎn)者-消費(fèi)者模型,基于RT-Thread消息隊(duì)列實(shí)現(xiàn)進(jìn)程間通信(IPC)
任務(wù)在無(wú)數(shù)據(jù)處理時(shí)進(jìn)入阻塞狀態(tài),有效節(jié)省CPU資源,提升系統(tǒng)實(shí)時(shí)性
typedefstruct
{
uint16_taddress;
uint16_tvalue;
}ModbusData;
軟件框架設(shè)計(jì)
項(xiàng)目架構(gòu)與模塊劃分
本項(xiàng)目采用分層模塊化設(shè)計(jì),確保代碼的可維護(hù)性和功能分離,核心模塊包括:
1、主入口模塊:
a.程序執(zhí)行入口
b.負(fù)責(zé)系統(tǒng)初始化流程,調(diào)用應(yīng)用管理模塊
c.具體實(shí)現(xiàn)參見(jiàn) main.c
2、應(yīng)用管理模塊:
a.集中管理應(yīng)用任務(wù)
b.初始化全局資源,如RT-Thread消息隊(duì)列等IPC機(jī)制
c.具體實(shí)現(xiàn)參見(jiàn) app_management.c
3、網(wǎng)絡(luò)初始化模塊:
a.配置設(shè)備網(wǎng)絡(luò)連接
b.實(shí)現(xiàn)優(yōu)先網(wǎng)絡(luò)連接策略,為MQTT通信提供底層支撐
c.具體實(shí)現(xiàn)參見(jiàn) app_netset.c
4、Modbus RTU協(xié)議處理模塊:
a.實(shí)現(xiàn)Modbus RTU協(xié)議功能
b.負(fù)責(zé)外設(shè)初始化、主站數(shù)據(jù)讀取及遠(yuǎn)程控制
c.具體實(shí)現(xiàn)參見(jiàn) applicationModbusRtu.c
5、MQTT通信模塊:
a.實(shí)現(xiàn)MQTT客戶(hù)端功能
b.負(fù)責(zé)Broker連接、命令接收和數(shù)據(jù)發(fā)布
c.具體實(shí)現(xiàn)參見(jiàn) applicationMqtt.c
測(cè)試環(huán)境與云端配置
本項(xiàng)目使用阿里云服務(wù)器部署EMQX MQTT Broker,作為可靠的云端測(cè)試環(huán)境,確保Modbus RTU網(wǎng)關(guān)與云平臺(tái)之間的穩(wěn)定雙向通信。
軟件模塊詳細(xì)說(shuō)明
主入口模塊
功能說(shuō)明:主入口模塊是程序的核心啟動(dòng)點(diǎn),負(fù)責(zé)初始化系統(tǒng)資源并啟動(dòng)應(yīng)用管理模塊。它作為整個(gè)系統(tǒng)的啟動(dòng)器,確保所有功能模塊按正確順序初始化和運(yùn)行,具體實(shí)現(xiàn)參見(jiàn) main.c。
核心代碼片段:
#include<rtthread.h>
#include"app_management.h"
intmain(void)
{
app_rt_thread_init();
rt_kprintf("Modbus-MQTT Gateway initialized successfully\n");
return0;
}
應(yīng)用管理模塊
功能說(shuō)明:應(yīng)用管理模塊是系統(tǒng)的中樞神經(jīng),負(fù)責(zé)全局資源管理和任務(wù)調(diào)度。它實(shí)現(xiàn)了:
1.消息隊(duì)列的創(chuàng)建與維護(hù),用于模塊間通信
2.網(wǎng)絡(luò)連接的初始化
3.關(guān)鍵任務(wù)線(xiàn)程的創(chuàng)建與啟動(dòng)(Modbus RTU和MQTT線(xiàn)程)
具體實(shí)現(xiàn)參見(jiàn) app_management.c。
核心代碼片段:
// 創(chuàng)建消息隊(duì)列,實(shí)現(xiàn)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);
}
// 系統(tǒng)初始化與任務(wù)啟動(dòng)
voidapp_rt_thread_init(void)
{
message_queue_init();
netset_init();// 網(wǎng)絡(luò)初始化
// 啟動(dòng)Modbus RTU主站任務(wù)
tid=rt_thread_create("modbus_rtu_thread",app_modbusRTU_master_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
// 啟動(dòng)MQTT通信任務(wù)
tid=rt_thread_create("mqtt_thread",app_mqtt_thread,RT_NULL,1024*4,10,10);
rt_thread_startup(tid);
}
Modbus RTU協(xié)議處理模塊
功能說(shuō)明:該模塊實(shí)現(xiàn)Modbus RTU協(xié)議的主站功能,是網(wǎng)關(guān)與工業(yè)設(shè)備通信的核心。主要負(fù)責(zé):
1.配置和初始化Modbus RTU通信參數(shù)
2.定時(shí)讀取從站設(shè)備寄存器數(shù)據(jù)
3.接收并執(zhí)行來(lái)自MQTT模塊的遠(yuǎn)程控制命令
具體實(shí)現(xiàn)參見(jiàn) 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主站線(xiàn)程
voidapp_modbusRTU_master_thread(void*arg)
{
uint16_treceived_regs[10];
modbus_rtu_master_init();
while(1)
{
// 讀取寄存器數(shù)據(jù)并發(fā)送至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));
}
}
// 處理遠(yuǎn)程寫(xiě)入命令
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);
}
}
網(wǎng)絡(luò)初始化模塊
功能說(shuō)明:該模塊負(fù)責(zé)設(shè)備網(wǎng)絡(luò)連接的配置與初始化,為MQTT通信提供底層網(wǎng)絡(luò)支持。主要功能包括MAC地址配置和DHCP客戶(hù)端啟用,確保設(shè)備能自動(dòng)獲取IP地址并建立網(wǎng)絡(luò)連接,具體實(shí)現(xiàn)參見(jiàn) app_netset.c。
核心代碼片段:
// 配置MAC地址
staticintmac_config(void)
{
uint8_tmac[6]={0x00,0x11,0x22,0x33,0x44,0x55};
returnif_set_mac(DEV_NAME,mac);
}
// 啟用DHCP客戶(hù)端
staticintdhcp_enable(void)
{
returnif_dhcp(DEV_NAME,1);
}
// 網(wǎng)絡(luò)初始化入口
voidnetset_init(void)
{
mac_config();
dhcp_enable();
}
MQTT通信模塊
功能說(shuō)明:
該模塊實(shí)現(xiàn)MQTT客戶(hù)端功能,是網(wǎng)關(guān)與云端通信的橋梁。主要功能包括:
1.MQTT Broker連接與認(rèn)證
2.訂閱云端控制命令
3.發(fā)布Modbus采集數(shù)據(jù)
4.JSON與Modbus數(shù)據(jù)格式轉(zhuǎn)換
具體實(shí)現(xiàn)參見(jiàn) applicationMqtt.c。
核心代碼片段:
// MQTT訂閱回調(diào)函數(shù) - 處理云端控制命令
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)
{
// 發(fā)送至Modbus寫(xiě)入隊(duì)列
rt_mq_send(g_xQueueModbusRtuWriteDate,&write_data,sizeof(ModbusData));
}
}
// 數(shù)據(jù)格式轉(zhuǎn)換 - 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線(xiàn)程 - 負(fù)責(zé)數(shù)據(jù)發(fā)布
voidapp_mqtt_thread(void*arg)
{
mq_start();// 啟動(dòng)MQTT客戶(hù)端
while(1)
{
ModbusData data;
// 接收Modbus數(shù)據(jù)并發(fā)布到云端
rt_mq_recv(g_xQueueModbusRtuReadDate,&data,sizeof(ModbusData),RT_WAITING_FOREVER);
ModbusData_publish(&data);
rt_thread_mdelay(10);
}
}
演示效果
云端MQTT服務(wù)器連接狀態(tài)

實(shí)際應(yīng)用演示
視頻演示:
https://www.bilibili.com/video/BV1uWSnBwEqp/?vd_source=9ed2178ae937fd4121a4f70f89f06b65
源碼倉(cāng)庫(kù)
GitHub倉(cāng)庫(kù):https://github.com/yxy314/ruiqingpai_RTU_MQTT
總結(jié)
本項(xiàng)目實(shí)現(xiàn)了一個(gè)功能完整、性能穩(wěn)定的Modbus RTU與MQTT協(xié)議轉(zhuǎn)換網(wǎng)關(guān),具有以下特點(diǎn):
1、高可靠性:采用成熟的開(kāi)源庫(kù)和RT-Thread實(shí)時(shí)操作系統(tǒng),確保系統(tǒng)穩(wěn)定性
2、低資源占用:優(yōu)化的任務(wù)調(diào)度和內(nèi)存管理,適合資源受限的嵌入式平臺(tái)
3、易于擴(kuò)展:模塊化設(shè)計(jì)便于功能擴(kuò)展和定制
4、安全通信:支持MQTT認(rèn)證機(jī)制,確保數(shù)據(jù)傳輸安全
該網(wǎng)關(guān)為工業(yè)設(shè)備的物聯(lián)網(wǎng)化改造提供了高效、經(jīng)濟(jì)的解決方案,可廣泛應(yīng)用于工業(yè)自動(dòng)化、智能工廠(chǎng)、遠(yuǎn)程監(jiān)控等領(lǐng)域。
這篇文章展示了睿擎平臺(tái)將傳統(tǒng)工業(yè)設(shè)備無(wú)縫接入物聯(lián)網(wǎng)的完整能力。如果您正在尋找一個(gè)穩(wěn)定、高效且開(kāi)箱即用的硬件平臺(tái)來(lái)部署此類(lèi)解決方案,或用于您的其他工業(yè)控制項(xiàng)目,那么實(shí)現(xiàn)本文所有功能的睿擎派RC3506開(kāi)發(fā)板將是您的理想選擇。
為什么選擇睿擎派進(jìn)行開(kāi)發(fā)?
軟硬一體,省心省力:文章中的所有軟件皆可在此開(kāi)發(fā)板上流暢運(yùn)行,無(wú)需擔(dān)憂(yōu)硬件適配問(wèn)題。
全棧自主,開(kāi)放靈活:基于RT-Thread的睿擎平臺(tái)提供從底層驅(qū)動(dòng)到應(yīng)用框架的全棧支持,并允許您進(jìn)行深度定制。
工業(yè)級(jí)可靠性:專(zhuān)為工業(yè)環(huán)境設(shè)計(jì),確保您的關(guān)鍵應(yīng)用穩(wěn)定運(yùn)行。
即刻入手,開(kāi)始您的項(xiàng)目
如果您對(duì)文中解決方案感興趣,或希望基于睿擎派實(shí)現(xiàn)自己的工業(yè)物聯(lián)網(wǎng)創(chuàng)意,歡迎訪(fǎng)問(wèn)我們的官方淘寶店鋪“睿賽德科技”,選購(gòu)睿擎派RC3506開(kāi)發(fā)板及配套配件。
睿擎派工業(yè)開(kāi)發(fā)板購(gòu)買(mǎi)鏈接:
https://item.taobao.com/item.htm?ft=t&id=946489007785
立即掃碼購(gòu)買(mǎi)

平臺(tái)持續(xù)提供完善的技術(shù)文檔、示例代碼與社區(qū)支持,助力您的項(xiàng)目快速落地!
-
MODBUS
+關(guān)注
關(guān)注
28文章
2517瀏覽量
83764 -
工業(yè)
+關(guān)注
關(guān)注
3文章
2432瀏覽量
49333 -
RTU
+關(guān)注
關(guān)注
0文章
452瀏覽量
30685 -
MQTT
+關(guān)注
關(guān)注
5文章
739瀏覽量
25252
發(fā)布評(píng)論請(qǐng)先 登錄
基于睿擎派輕松玩轉(zhuǎn)Modbus工業(yè)通信
一觸即達(dá):CCLink IE遇見(jiàn)Modbus RTU,解鎖智能電表“數(shù)據(jù)超車(chē)道”
無(wú)線(xiàn)透傳串口終端
Modbus TCP轉(zhuǎn)Modbus RTU的實(shí)現(xiàn)
干貨篇︱物聯(lián)網(wǎng)平臺(tái)——工業(yè)制造監(jiān)測(cè)解決方案
組態(tài)軟件的數(shù)據(jù)透傳DTU通信技術(shù)工業(yè)網(wǎng)關(guān)
物聯(lián)網(wǎng)中的數(shù)據(jù)透傳
如何快速實(shí)現(xiàn)Modbus RTU和Modbus TCP協(xié)議轉(zhuǎn)換?
Modbus RTU和Modbus TCP的區(qū)別
WD140系列工業(yè)數(shù)傳終端概述、特性及應(yīng)用
MQTT 單片機(jī)移植 收發(fā)功能 STM32 串口 透傳
嗅準(zhǔn)市場(chǎng)機(jī)遇,中易騰達(dá)推出工業(yè)透傳解決方案
Modbus RTU數(shù)據(jù)采集物聯(lián)網(wǎng)解決方案
Modbus RTU、Modbus TCP轉(zhuǎn)MQTT網(wǎng)關(guān)實(shí)現(xiàn)Modbus設(shè)備與云平臺(tái)的無(wú)縫通信
鋇錸技術(shù)Modbus轉(zhuǎn)MQTT網(wǎng)關(guān):橋接Modbus協(xié)議與MQTT協(xié)議
睿擎工業(yè)Modbus RTU數(shù)據(jù)MQTT透?jìng)鹘鉀Q方案
評(píng)論