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

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

3天内不再提示

边缘网关教程-Modbus协议转MQTT协议

IOTRouter 来源:IOTRouter 作者:IOTRouter 2024-07-03 10:37 次阅读

需求概述

主要实现一个流程:

1.采集Modbus电表数据上传到MQTT指定topic

2.如果传感器未响应需要发送报警信息到指定topic

3.MQTT连接成功时发送注册信息

4.周期推送心跳到指定topic

5.云端下发控制EG8200继电器并回复

对接资料

1.南向接口 RS485对接协议(标准modbus)

点位 字段 寄存器地址 解析方式
A相电压 voltageA 40001~40002 float32 ABCD
B相电压 voltageB 40003~40004 float32 ABCD
C相电压 voltageC 40005~40006 float32 ABCD
A相电压 currentA 40007~40008 float32 ABCD
B相电压 currentB 40009~40010 float32 ABCD
C相电压 currentC 40011~40012 float32 ABCD

2.北向接口协议说明:

MQTT连接信息
Broker 139.129.229.113
Clientid TestClient
Username 82000000305E144F
Password EG12345678
Topic报文格式
功能 Topic 数据流向 报文示例
信息注册 data/sg/${sn}/info 网关->平台 {
"sn":"82000000305E144F",
"time":"2023-01-01 12:00:00"
}
数据上报 data/sg/${sn}/report 网关->平台 {
"sn":"82000000305E144F",
"data":{
"voltageA":0,
"voltageB":0,
"voltageC":0,
"currentA":0,
"currentB":0,
"currentC":0
},
time:"2023-01-01 12:00:00"
}
心跳 data/sg/${sn}/heart 网关->平台 {
"sn":"82000000305E144F",
"data":{},
"message":"heart",
"time":"2023-01-01 12:00:00"
}
报警 data/sg/${sn}/warn 网关->平台 {
"sn":"82000000305E144F",
"data":{},
"message":"offline",
"time":"2023-01-01 12:00:00"
}
平台控制 /data/sg/${sn}/request 平台->网关 {
"event_id":"HsUCigC4Jk",
"data": {
"parameter": "DO1",
"value": 0
}
}
控制回复 data/sg/${sn}/response 网关->平台 {
"event_id":"HsUCigC4Jk",
"message":"OK",
"data":{},
"time":"2023-01-01 12:00:00"
}

需求分析

注册与连接工作

a.建立MQTT连接,发布到注册主题(MQTT发布节点)注:MQTT订阅发布节点连接信息共享,其他MQTT无需在配置连接参数,选择第一次配置的连接参数即可

b.监听MQTT连接状态(状态变化节点)

c.封装注册信息(函数节点)

数据上报

a.modbus读取电表数据(modbus读节点)

b.判断传感器是否有回复并封装上报报文(函数节点)

c.配置对应的发布主题(MQTT发布节点)

心跳推送

a.注入节点周期触发(注入节点)

b.封装心跳报文(函数节点)

c.MQTT发布数据(MQTT发布节点)

下发控制

a.MQTT订阅云端下发主题(MQTT订阅节点)

b.解析云端数据,并控制对应DO(函数节点)

c.响应MQTT控制情况(函数节点)

d.上报响应报文(MQTT发布)

实现流程框架

wKgZomaEt1uAGN4qAABu4JP5xmw397.png

需求实现

1.监听MQTT状态并发布注册信息

a.从节点库拖出一个MQTT发布节点,函数节点,调试节点,状态监测节点和条件判断节点,MQTT发布用于消息发布,函数节点用于注册信息封装,状态检测节点用于检测MQTT的连接状态,调试节点用于打印发布的报文

wKgZomaEt2uAWCAWAAF4ebgsg2A254.png

b.从上可以看见日志打印了注册报文,以及MQTTx端以及接收到了注册信息

wKgaomaEt32AM3yLAAGesr-MT8g037.png

c.注册流程使用的代码块:

const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

let obj = {
    "sn": "82000000305E144F",
    "time": fmt
}

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 时
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

msg.payload = JSON.stringify(obj)
return msg

2.数据上报

a.从节点库拖出一个注入节点,函数节点和一个MQTT发布节点,注入节点用于周期触发,函数节点用于封装心跳报文,MQTT发布节点用于心跳发布

wKgaomaEt5yAGYc1AAHXgK03t6I764.png

b.从上面可以看到日志窗口打印了数据报文,MQTTx也接收到了上报数据

wKgZomaEt6qAblqPAAHzi27BQzo469.png

c.数据上报流程使用的代码块:

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 时
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

var flag = msg.status
var data = msg.payload
var payload
const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

if (flag == "TIMEOUT") {
    payload = {
        "sn": "82000000305E144F",
        "data": {},
        "message": "offline",
        "time": fmt
    }
    msg.payload = JSON.stringify(payload)
    return [msg, null]
}
else if (flag == "OK") {
    payload = {
        sn: "02C00081275A574E",
        data,
        time: fmt
    }
    msg.payload = JSON.stringify(payload)
    return [null, msg]
}

3.心跳推送

a.从节点库拿出一个注入节点,函数节点,MQTT发布节点。注入节点用于周期发发送心跳,函数节点用于封装心跳报文,MQTT发布节点用于发布到MQTT

wKgZomaEt7-AWVocAAJlZz-ZS_Y845.png

b.从上面可以看到日志窗口打印了心跳报文,MQTTx也接收到了心跳报

wKgaomaEt8eAQMTlAAHOWaHue9g429.png

心跳上报流程使用的代码块:

const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())

function dateFormat(fmt, timestamp) {
  let ret;
  const opt = {
    "Y+": timestamp.getFullYear().toString(), // 年
    "m+": (timestamp.getMonth() + 1).toString(),  // 月
    "d+": timestamp.getDate().toString(), // 日
    "H+": timestamp.getHours().toString(), // 时
    "M+": timestamp.getMinutes().toString(), // 分
    "S+": timestamp.getSeconds().toString() // 秒
    // 有其他格式化字符需求可以继续添加,必须转化成字符串
  };
  for (let k in opt) {
    ret = new RegExp("(" + k + ")").exec(fmt);
    if (ret) {
      fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
    };
  };
  return fmt;
}

let obj = {
  "sn": "82000000305E144F",
  "data": {},
  "message": "heart",
  "time": fmt
}
msg.payload = JSON.stringify(obj)
return msg;

4.下发控制及响应

a.从节点库拿出一个MQTT订阅节点,MQTT发布节点,函数节点和DO节点,MQTT订阅节点和MQTT发布节点用于接收云端发来的数据和控制响应,函数节点用于解析下发的报文和控制的响应报文封装

wKgaomaEt9aAYWXtAAJQ_PKGmCk107.png

b.从上面可以看到日志窗口打印了报文,MQTTx也接收到了控制响应

wKgZomaEt-aANZv_AAGjccNC5Zk976.png

c.控制流程使用的代码块


//云端下发解析
//############################
if (msg.payload.length < 10) { return }

if (typeof (msg.payload) == "object") {
    var obj = msg.payload
    //信息获取
    let event_id = obj.event_id;
    global.set("event_id", event_id)
    let parameter = obj.data.parameter
    let value = obj.data.value
    let arr = []
    switch (parameter) {
        case "DO1":
            arr = value
            break
        case "DO2":
            arr = value
            break
    }

    msg.payload = arr


    return msg;
}
//############################

//反馈响应封装
//############################
let event_id = global.get("event_id")
const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())
function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 时
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
        // 有其他格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}

let obj = {
    "event_id": event_id,
    "message": "OK",
    "data": {},
    "time": fmt

}

msg.payload = JSON.stringify(obj);
return msg;
//############################

通过以上步骤,你可以在边缘网关上成功实现 Modbus 协议到 MQTT 协议的转换。这种集成方式不仅简化了工业设备与物联网平台的通信,还增强了数据的实时性和可靠性。希望本文能为你提供有用的指导,助你更好地利用 Modbus 和 MQTT 技术

审核编辑 黄宇

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

    关注

    28

    文章

    1518

    浏览量

    75965
  • 网关
    +关注

    关注

    9

    文章

    3488

    浏览量

    50280
  • MQTT
    +关注

    关注

    5

    文章

    561

    浏览量

    22168
收藏 人收藏

    评论

    相关推荐

    Modbus协议Profinet协议网关与气体监测系统配置案例

    Modbus协议和Profinet协议作为工业领域常见的两种通讯协议,各自具有一定的特点和应用范围。ModbusProfinet
    的头像 发表于 06-13 17:50 1116次阅读
    <b class='flag-5'>Modbus协议</b><b class='flag-5'>转</b>Profinet<b class='flag-5'>协议</b><b class='flag-5'>网关</b>与气体监测系统配置案例

    Modbus协议Profibus协议网关接温控表与PLC通讯

    Modbus协议Profibus协议网关(XD-MDPB100)则是实现这一通讯的重要工具。Modbus
    的头像 发表于 06-21 11:31 1493次阅读
    <b class='flag-5'>Modbus协议</b><b class='flag-5'>转</b>Profibus<b class='flag-5'>协议</b><b class='flag-5'>网关</b>接温控表与PLC通讯

    巴图自动化Profinet协议Modbus协议网关模块连接智能仪表与PLC通讯

    巴图自动化Profinet协议Modbus协议网关模块(BT-MDPN10)的主要功能是实现Modbus协议和Profinet
    的头像 发表于 07-04 11:35 1076次阅读
    巴图自动化Profinet<b class='flag-5'>协议</b><b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>模块连接智能仪表与PLC通讯

    巴图自动化Modbus协议Profinet协议网关模块连智能仪表与PLC通讯

    模块的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus Profinet协议
    的头像 发表于 07-04 18:29 996次阅读
    巴图自动化<b class='flag-5'>Modbus协议</b><b class='flag-5'>转</b>Profinet<b class='flag-5'>协议</b><b class='flag-5'>网关</b>模块连智能仪表与PLC通讯

    Modbusprofient网关连接Smart PLC实现Profinetmodbus协议转换

    Modbusprofinet网关连接西门子/DCS及机器人Profinetmodbus协议转换,不需要PLC或者Profinet主站编程
    发表于 03-22 19:13

    西门子S7协议Modbus协议网关

    西门子S7协议Modbus协议网关
    发表于 11-13 15:03 1603次阅读

    欧姆龙Omron Host LinkModbus协议网关

    欧姆龙Omron Host LinkModbus协议网关
    发表于 11-13 15:05 1250次阅读
    欧姆龙Omron Host Link<b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>

    一招让你实现PLCModbus协议接入现有上位机体系

    通过金鸽科技PLCModbus协议转换网关BL102让你实现PLCModbus协议接入现有上位机体系
    发表于 11-21 09:55 2077次阅读

    欧姆龙CP1L-ELModbus协议欧姆龙PLCModbus协议

    欧姆龙PLCModbus协议 欧姆龙CP1L-ELModbus协议
    的头像 发表于 11-06 15:55 2048次阅读
    欧姆龙CP1L-EL<b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b>欧姆龙PLC<b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b>

    IEC61850Modbus协议网关:储能行业的强大通信助手

    在储能行业中,IEC61850Modbus协议网关正在成为一种越来越重要的通信工具,它可以将来自储能系统的信息转换为Modbus协议,以便于与其它系统进行通信。以下是关于钡铼IEC6
    的头像 发表于 09-27 09:57 3122次阅读
    IEC61850<b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>:储能行业的强大通信助手

    4G无线ModbusMQTT协议网关BL100产品简介

    4G无线ModbusMQTT协议网关
    发表于 08-19 15:22 22次下载

    Modbus协议网关是什么?Modbus协议网关的功能

    数据的互联互通。Modbus协议作为一种广泛应用于工业控制领域的通信协议,主要用于在主设备(如PLC、SCADA系统)与从设备(如传感器、执行器、智能仪表等)之间交换数据。 Modbus协议
    的头像 发表于 04-11 15:51 348次阅读

    通讯协议转换ModbusProfinet网关

    ModbusProfinet网关是工业通信转换设备,能够实现Modbus协议与Profinet协议之间的有效转换和稳定传输。通过该
    的头像 发表于 06-13 14:07 177次阅读
    通讯<b class='flag-5'>协议</b>转换<b class='flag-5'>Modbus</b><b class='flag-5'>转</b>Profinet<b class='flag-5'>网关</b>

    Modbus协议Profibus协议网关模块连PLC与激光发射器通讯

    将重点探讨PLC连接Modbus协议Profibus协议网关模块(XD-MDPB100)与激光发射器通讯的相关内容,为您详细解析这一过程的原理与操作步骤。
    的头像 发表于 06-22 10:24 154次阅读
    <b class='flag-5'>Modbus协议</b><b class='flag-5'>转</b>Profibus<b class='flag-5'>协议</b><b class='flag-5'>网关</b>模块连PLC与激光发射器通讯

    Profibus协议Modbus协议网关模块在船舶中的应用

    本文主要介绍了Profibus协议Modbus协议网关模块(XD-MDPB100)在船舶中的应用。 Profibus
    的头像 发表于 06-27 17:25 171次阅读
    Profibus<b class='flag-5'>协议</b><b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>模块在船舶中的应用