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

    文章

    1759

    浏览量

    76791
  • 网关
    +关注

    关注

    9

    文章

    4275

    浏览量

    50906
  • MQTT
    +关注

    关注

    5

    文章

    648

    浏览量

    22402
收藏 人收藏

    评论

    相关推荐

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

    Modbus协议和Profinet协议作为工业领域常见的两种通讯协议,各自具有一定的特点和应用范围。ModbusProfinet
    的头像 发表于 06-13 17:50 1353次阅读
    <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 1836次阅读
    <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 2552次阅读
    巴图自动化Profinet<b class='flag-5'>协议</b><b class='flag-5'>转</b><b class='flag-5'>Modbus协议</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 1786次阅读

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

    欧姆龙PLCModbus协议 欧姆龙CP1L-ELModbus协议
    的头像 发表于 11-06 15:55 2721次阅读
    欧姆龙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>

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

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

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

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

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

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

    钡铼协议网关轻松实现ModbusMQTT协议

    效的数据交换。本文从Modbus协议转换为MQTT协议的必要性为出发点,分析钡铼ModbusMQTT
    的头像 发表于 07-23 15:51 299次阅读
    钡铼<b class='flag-5'>协议</b><b class='flag-5'>网关</b>轻松实现<b class='flag-5'>Modbus</b><b class='flag-5'>转</b><b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>

    基于MQTT协议云平台的ModbusMQTT网关

    钡铼ModbusMQTT网关BL100是一款高性能、高性价比的物联网网关,它支持将Modbus协议
    的头像 发表于 07-29 17:59 675次阅读
    基于<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b>云平台的<b class='flag-5'>Modbus</b><b class='flag-5'>转</b><b class='flag-5'>MQTT</b><b class='flag-5'>网关</b>

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

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

    BACnetModbus协议网关实现设备无缝对接GE Digital iFIX

    与整合,实现协议间的无缝转换,钡铼技术隆重推出BACnetModbus协议网关BL120BN,为用户提供了一个既高效又可靠的解决方案。 一、BACnet
    的头像 发表于 08-06 17:32 338次阅读
    BACnet<b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>实现设备无缝对接GE Digital iFIX

    Modbus、楼宇自控、电力协议Modbus协议网关BL120ML支持一键对接LabVIEW

    Modbus楼宇自控电力协议Modbus协议网关BL120ML在LabVIEW中的实际应用中,我们首先需要理解LabVIEW和
    的头像 发表于 08-10 10:40 350次阅读
    <b class='flag-5'>Modbus</b>、楼宇自控、电力<b class='flag-5'>协议</b><b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>BL120ML支持一键对接LabVIEW

    使用Modbus、楼宇自控、电力协议Modbus协议网关实现生产设备的远程监控和管理

    Modbus协议、楼宇自控、电力协议Modbus协议网关,将不同类型的生产设备数据集中传输到监控系统,实现远程监控和管理。 我们先来看整
    的头像 发表于 08-08 17:29 334次阅读
    使用<b class='flag-5'>Modbus</b>、楼宇自控、电力<b class='flag-5'>协议</b><b class='flag-5'>转</b><b class='flag-5'>Modbus协议</b><b class='flag-5'>网关</b>实现生产设备的远程监控和管理