0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

邊緣網(wǎng)關(guān)教程-Modbus協(xié)議轉(zhuǎn)MQTT協(xié)議

IOTRouter ? 來源:IOTRouter ? 作者:IOTRouter ? 2024-07-03 10:37 ? 次閱讀

需求概述

主要實現(xiàn)一個流程:

1.采集Modbus電表數(shù)據(jù)上傳到MQTT指定topic

2.如果傳感器未響應(yīng)需要發(fā)送報警信息到指定topic

3.MQTT連接成功時發(fā)送注冊信息

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

5.云端下發(fā)控制EG8200繼電器并回復(fù)

對接資料

1.南向接口 RS485對接協(xié)議(標準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.北向接口協(xié)議說明:

MQTT連接信息
Broker 139.129.229.113
Clientid TestClient
Username 82000000305E144F
Password EG12345678
Topic報文格式
功能 Topic 數(shù)據(jù)流向 報文示例
信息注冊 data/sg/${sn}/info 網(wǎng)關(guān)->平臺 {
"sn":"82000000305E144F",
"time":"2023-01-01 12:00:00"
}
數(shù)據(jù)上報 data/sg/${sn}/report 網(wǎng)關(guān)->平臺 {
"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 網(wǎng)關(guān)->平臺 {
"sn":"82000000305E144F",
"data":{},
"message":"heart",
"time":"2023-01-01 12:00:00"
}
報警 data/sg/${sn}/warn 網(wǎng)關(guān)->平臺 {
"sn":"82000000305E144F",
"data":{},
"message":"offline",
"time":"2023-01-01 12:00:00"
}
平臺控制 /data/sg/${sn}/request 平臺->網(wǎng)關(guān) {
"event_id":"HsUCigC4Jk",
"data": {
"parameter": "DO1",
"value": 0
}
}
控制回復(fù) data/sg/${sn}/response 網(wǎng)關(guān)->平臺 {
"event_id":"HsUCigC4Jk",
"message":"OK",
"data":{},
"time":"2023-01-01 12:00:00"
}

需求分析

注冊與連接工作

a.建立MQTT連接,發(fā)布到注冊主題(MQTT發(fā)布節(jié)點)注:MQTT訂閱發(fā)布節(jié)點連接信息共享,其他MQTT無需在配置連接參數(shù),選擇第一次配置的連接參數(shù)即可

b.監(jiān)聽MQTT連接狀態(tài)(狀態(tài)變化節(jié)點)

c.封裝注冊信息(函數(shù)節(jié)點)

數(shù)據(jù)上報

a.modbus讀取電表數(shù)據(jù)(modbus讀節(jié)點)

b.判斷傳感器是否有回復(fù)并封裝上報報文(函數(shù)節(jié)點)

c.配置對應(yīng)的發(fā)布主題(MQTT發(fā)布節(jié)點)

心跳推送

a.注入節(jié)點周期觸發(fā)(注入節(jié)點)

b.封裝心跳報文(函數(shù)節(jié)點)

c.MQTT發(fā)布數(shù)據(jù)(MQTT發(fā)布節(jié)點)

下發(fā)控制

a.MQTT訂閱云端下發(fā)主題(MQTT訂閱節(jié)點)

b.解析云端數(shù)據(jù),并控制對應(yīng)DO(函數(shù)節(jié)點)

c.響應(yīng)MQTT控制情況(函數(shù)節(jié)點)

d.上報響應(yīng)報文(MQTT發(fā)布)

實現(xiàn)流程框架

wKgZomaEt1uAGN4qAABu4JP5xmw397.png

需求實現(xiàn)

1.監(jiān)聽MQTT狀態(tài)并發(fā)布注冊信息

a.從節(jié)點庫拖出一個MQTT發(fā)布節(jié)點,函數(shù)節(jié)點,調(diào)試節(jié)點,狀態(tài)監(jiān)測節(jié)點和條件判斷節(jié)點,MQTT發(fā)布用于消息發(fā)布,函數(shù)節(jié)點用于注冊信息封裝,狀態(tài)檢測節(jié)點用于檢測MQTT的連接狀態(tài),調(diào)試節(jié)點用于打印發(fā)布的報文

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() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    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.數(shù)據(jù)上報

a.從節(jié)點庫拖出一個注入節(jié)點,函數(shù)節(jié)點和一個MQTT發(fā)布節(jié)點,注入節(jié)點用于周期觸發(fā),函數(shù)節(jié)點用于封裝心跳報文,MQTT發(fā)布節(jié)點用于心跳發(fā)布

wKgaomaEt5yAGYc1AAHXgK03t6I764.png

b.從上面可以看到日志窗口打印了數(shù)據(jù)報文,MQTTx也接收到了上報數(shù)據(jù)

wKgZomaEt6qAblqPAAHzi27BQzo469.png

c.數(shù)據(jù)上報流程使用的代碼塊:

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() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    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.從節(jié)點庫拿出一個注入節(jié)點,函數(shù)節(jié)點,MQTT發(fā)布節(jié)點。注入節(jié)點用于周期發(fā)發(fā)送心跳,函數(shù)節(jié)點用于封裝心跳報文,MQTT發(fā)布節(jié)點用于發(fā)布到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() // 秒
    // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
  };
  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.下發(fā)控制及響應(yīng)

a.從節(jié)點庫拿出一個MQTT訂閱節(jié)點,MQTT發(fā)布節(jié)點,函數(shù)節(jié)點和DO節(jié)點,MQTT訂閱節(jié)點和MQTT發(fā)布節(jié)點用于接收云端發(fā)來的數(shù)據(jù)和控制響應(yīng),函數(shù)節(jié)點用于解析下發(fā)的報文和控制的響應(yīng)報文封裝

wKgaomaEt9aAYWXtAAJQ_PKGmCk107.png

b.從上面可以看到日志窗口打印了報文,MQTTx也接收到了控制響應(yīng)

wKgZomaEt-aANZv_AAGjccNC5Zk976.png

c.控制流程使用的代碼塊


//云端下發(fā)解析
//############################
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;
}
//############################

//反饋響應(yīng)封裝
//############################
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() // 秒
        // 有其他格式化字符需求可以繼續(xù)添加,必須轉(zhuǎn)化成字符串
    };
    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;
//############################

通過以上步驟,你可以在邊緣網(wǎng)關(guān)上成功實現(xiàn) Modbus 協(xié)議到 MQTT 協(xié)議的轉(zhuǎn)換。這種集成方式不僅簡化了工業(yè)設(shè)備與物聯(lián)網(wǎng)平臺的通信,還增強了數(shù)據(jù)的實時性和可靠性。希望本文能為你提供有用的指導(dǎo),助你更好地利用 Modbus 和 MQTT 技術(shù)

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1748

    瀏覽量

    76701
  • 網(wǎng)關(guān)
    +關(guān)注

    關(guān)注

    9

    文章

    4199

    瀏覽量

    50783
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    642

    瀏覽量

    22370
收藏 人收藏

    評論

    相關(guān)推薦

    Modbus協(xié)議轉(zhuǎn)Profinet協(xié)議網(wǎng)關(guān)與氣體監(jiān)測系統(tǒng)配置案例

    Modbus協(xié)議和Profinet協(xié)議作為工業(yè)領(lǐng)域常見的兩種通訊協(xié)議,各自具有一定的特點和應(yīng)用范圍。Modbus轉(zhuǎn)Profinet
    的頭像 發(fā)表于 06-13 17:50 ?1305次閱讀
    <b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b>Profinet<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>與氣體監(jiān)測系統(tǒng)配置案例

    Modbus協(xié)議轉(zhuǎn)Profibus協(xié)議網(wǎng)關(guān)接溫控表與PLC通訊

    Modbus協(xié)議轉(zhuǎn)Profibus協(xié)議網(wǎng)關(guān)(XD-MDPB100)則是實現(xiàn)這一通訊的重要工具。Modbus
    的頭像 發(fā)表于 06-21 11:31 ?1808次閱讀
    <b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b>Profibus<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>接溫控表與PLC通訊

    巴圖自動化Profinet協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)模塊連接智能儀表與PLC通訊

    巴圖自動化Profinet協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)模塊(BT-MDPN10)的主要功能是實現(xiàn)Modbus協(xié)議和Profinet
    的頭像 發(fā)表于 07-04 11:35 ?2491次閱讀
    巴圖自動化Profinet<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>模塊連接智能儀表與PLC通訊

    Modbus轉(zhuǎn)profient網(wǎng)關(guān)連接Smart PLC實現(xiàn)Profinet轉(zhuǎn)modbus協(xié)議轉(zhuǎn)換

    Modbus轉(zhuǎn)profinet網(wǎng)關(guān)連接西門子/DCS及機器人Profinet轉(zhuǎn)modbus協(xié)議轉(zhuǎn)換,不需要PLC或者Profinet主站編程
    發(fā)表于 03-22 19:13

    西門子S7協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)

    西門子S7協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)
    發(fā)表于 11-13 15:03 ?1759次閱讀

    歐姆龍CP1L-EL轉(zhuǎn)Modbus協(xié)議歐姆龍PLC轉(zhuǎn)Modbus協(xié)議

    歐姆龍PLC轉(zhuǎn)Modbus協(xié)議 歐姆龍CP1L-EL轉(zhuǎn)Modbus協(xié)議
    的頭像 發(fā)表于 11-06 15:55 ?2629次閱讀
    歐姆龍CP1L-EL<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b>歐姆龍PLC<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b>

    4G無線Modbus轉(zhuǎn)MQTT協(xié)議網(wǎng)關(guān)BL100產(chǎn)品簡介

    4G無線Modbus轉(zhuǎn)MQTT協(xié)議網(wǎng)關(guān)
    發(fā)表于 08-19 15:22 ?22次下載

    Modbus協(xié)議網(wǎng)關(guān)是什么?Modbus協(xié)議網(wǎng)關(guān)的功能

    數(shù)據(jù)的互聯(lián)互通。Modbus協(xié)議作為一種廣泛應(yīng)用于工業(yè)控制領(lǐng)域的通信協(xié)議,主要用于在主設(shè)備(如PLC、SCADA系統(tǒng))與從設(shè)備(如傳感器、執(zhí)行器、智能儀表等)之間交換數(shù)據(jù)。 Modbus協(xié)議網(wǎng)
    的頭像 發(fā)表于 04-11 15:51 ?653次閱讀

    Profibus協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)模塊在船舶中的應(yīng)用

    本文主要介紹了Profibus協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)模塊(XD-MDPB100)在船舶中的應(yīng)用。 Profibus轉(zhuǎn)
    的頭像 發(fā)表于 06-27 17:25 ?409次閱讀
    Profibus<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>模塊在船舶中的應(yīng)用

    鋇錸協(xié)議網(wǎng)關(guān)輕松實現(xiàn)Modbus轉(zhuǎn)MQTT協(xié)議

    效的數(shù)據(jù)交換。本文從Modbus協(xié)議轉(zhuǎn)換為MQTT協(xié)議的必要性為出發(fā)點,分析鋇錸Modbus轉(zhuǎn)MQTT
    的頭像 發(fā)表于 07-23 15:51 ?263次閱讀
    鋇錸<b class='flag-5'>協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>輕松實現(xiàn)<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>

    基于MQTT協(xié)議云平臺的Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)

    鋇錸Modbus轉(zhuǎn)MQTT網(wǎng)關(guān)BL100是一款高性能、高性價比的物聯(lián)網(wǎng)網(wǎng)關(guān),它支持將Modbus協(xié)議
    的頭像 發(fā)表于 07-29 17:59 ?622次閱讀
    基于<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>云平臺的<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>網(wǎng)關(guān)</b>

    鋇錸技術(shù)Modbus轉(zhuǎn)MQTT網(wǎng)關(guān):橋接Modbus協(xié)議MQTT協(xié)議

    提供了一鍵對接亞馬遜云平臺的解決方案。 BL101網(wǎng)關(guān)是鋇錸技術(shù)研發(fā)的一款高性能工業(yè)物聯(lián)網(wǎng)設(shè)備,通過橋接Modbus協(xié)議MQTT通信協(xié)議,實現(xiàn)了工業(yè)設(shè)備與云端平臺之間的高效互聯(lián)。支持
    的頭像 發(fā)表于 07-30 16:28 ?285次閱讀
    鋇錸技術(shù)<b class='flag-5'>Modbus</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>MQTT</b><b class='flag-5'>網(wǎng)關(guān)</b>:橋接<b class='flag-5'>Modbus協(xié)議</b>與<b class='flag-5'>MQTT</b><b class='flag-5'>協(xié)議</b>

    BACnet轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)實現(xiàn)設(shè)備無縫對接GE Digital iFIX

    與整合,實現(xiàn)協(xié)議間的無縫轉(zhuǎn)換,鋇錸技術(shù)隆重推出BACnet轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)BL120BN,為用戶提供了一個既高效又可靠的解決方案。 一、BACnet
    的頭像 發(fā)表于 08-06 17:32 ?313次閱讀
    BACnet<b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>實現(xiàn)設(shè)備無縫對接GE Digital iFIX

    Modbus、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)BL120ML支持一鍵對接LabVIEW

    Modbus樓宇自控電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)BL120ML在LabVIEW中的實際應(yīng)用中,我們首先需要理解LabVIEW和
    的頭像 發(fā)表于 08-10 10:40 ?319次閱讀
    <b class='flag-5'>Modbus</b>、樓宇自控、電力<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>BL120ML支持一鍵對接LabVIEW

    使用Modbus、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān)實現(xiàn)生產(chǎn)設(shè)備的遠程監(jiān)控和管理

    Modbus協(xié)議、樓宇自控、電力協(xié)議轉(zhuǎn)Modbus協(xié)議網(wǎng)關(guān),將不同類型的生產(chǎn)設(shè)備數(shù)據(jù)集中傳輸?shù)奖O(jiān)控系統(tǒng),實現(xiàn)遠程監(jiān)控和管理。 我們先來看整
    的頭像 發(fā)表于 08-08 17:29 ?297次閱讀
    使用<b class='flag-5'>Modbus</b>、樓宇自控、電力<b class='flag-5'>協(xié)議</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>Modbus協(xié)議</b><b class='flag-5'>網(wǎng)關(guān)</b>實現(xiàn)生產(chǎn)設(shè)備的遠程監(jiān)控和管理