在Node-RED中如何用ModbusTCP采集存储Influxdb

描述

(以下来源成都纵横智控公众号授权更多可见-https://www.iotrouter.com-智控

-需求概述

注:使用Influxdb数据库节点,需要插上micro sd卡才可以

本章节主要实现一个流程:EG8200每10秒采集一次Modbus TCP数据存入Influxdb数据库,并且每分钟从Influxdb数据库中取6条数据打包上报。

Modbus TCP数据采集此处不做过多赘述,可参考其他案例介绍。下文默认已经采集到Modbus TCP数据。

-数据上报格式


[{
  "time": "2023-12-20 14:50:13",
  "value1": 12573,
  "value2": 12568,
  "value3": 12561,
  "value4": 12557,
  "value5": 12552,
  "value6": 12545,
  "value7": 12540,
  "value8": 12535
}, {
  "time": "2023-12-20 14:50:13",
  "value1": 12573,
  "value2": 12568,
  "value3": 12561,
  "value4": 12557,
  "value5": 12552,
  "value6": 12545,
  "value7": 12540,
  "value8": 12535
}, {
  "time": "2023-12-20 14:50:13",
  "value1": 12574,
  "value2": 12569,
  "value3": 12562,
  "value4": 12558,
  "value5": 12553,
  "value6": 12546,
  "value7": 12541,
  "value8": 12536
}, {
  "time": "2023-12-20 14:50:14",
  "value1": 12574,
  "value2": 12569,
  "value3": 12562,
  "value4": 12558,
  "value5": 12553,
  "value6": 12546,
  "value7": 12541,
  "value8": 12536
}, {
  "time": "2023-12-20 14:50:14",
  "value1": 12575,
  "value2": 12570,
  "value3": 12563,
  "value4": 12559,
  "value5": 12554,
  "value6": 12547,
  "value7": 12542,
  "value8": 12537
}, {
  "time": "2023-12-20 14:50:14",
  "value1": 12575,
  "value2": 12570,
  "value3": 12563,
  "value4": 12559,
  "value5": 12554,
  "value6": 12547,
  "value7": 12542,
  "value8": 12537
}]

-需求分析

第一步:配置并连接数据库

第二步:创建一个数据库

第三步:指定使用新创建的数据库

第四步:读取Modbus TCP数据并存入指定表中

第五步:从数据库中读取6个数据

第六步:将读取出来的数据打包

第七步:将打包的数据发送到MQTT

-需求实现

第一步:配置并连接数据库

首次连接EG8200的Influxdb数据库按照默认的配置即可无需修改

node

 第二步:创建一个数据库

创建一个数据库需要使用到sql语句 CREATE DATABASE myDatabase ,这条语句的意思是创建一个名字叫做myDatabase的数据库。按照下面视频的方式创建,日志窗口打印[empty],说明数据库创建成功

node

第三步:指定使用新创建的数据库

在第一步创建了一个名字叫做myDatabase的数据库,现在需要使用这个数据库,将Influxdb的一个配置名Database改成myDatabase

node

第四步;DO能控制的设备

Modbus TCP数据采集此处不做过多赘述,这里已经配置好Modbus TCP详细使用请参考

从节点库里面拿出一个写时序数据库节点,选择前面步骤已经添加的配置信息,并将表名填写在Measurement,

这里使用myTable作为表名

node

 

第五步:从数据库中读取6个数据

通过函数节点构造sql读取指令,通过时间查询最近6条数据

node

 

上面视频中使用到的函数代码


if (global.get("startTime") == undefined || global.get("startTime") == null) global.set("startTime", new Date().getTime())
var startTime = global.get("startTime")
var temp = new Date(startTime).toISOString()
var table = "myTable"
msg.query = "SELECT * FROM" + " "" + table + "" " + " WHERE time > '" + temp + "' LIMIT 6"
return msg;

 

第六步:将读取出来的数据打包

使用函数节点将数据封装成对应的json字符串

node

 

上面视频中使用到的函数代码


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;
}
// const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())
var dataList = msg.payload
if (dataList.length == 0) {
    node.error("数据库无数据请检查")
    return
}
dataList.forEach(item = > item.time = dateFormat("YYYY-mm-dd HH:MM:SS", new Date(item.time)))
global.set("startTime", new Date(dataList[dataList.length - 1].time).getTime() + 1000)
msg.payload = JSON.stringify(dataList)
return msg

第七步:将打包的数据发送到MQTT

新增MQTT发布节点

客户端ID:网关SN

用户名:网关SN

密码:EG87654321

发布主题:${sn}/send

node

-总结

本章节介绍了一个相对复杂的流程,旨在表述网关所具备的能力,因此并未对程序的安全性、稳定性、灵活性等方面做优化。通过理解本流程,相信你已经对网关的可视化编程有了一定的熟悉。接下来,深入学习每个节点的功能用法吧,掌握它们将会为你制作更复杂的流程提供更多的选择和可能!

-注意

MQTT配置节点导出时,不会携带用户名和密码。因此导入时需要重新录入用户名和密码

审核编辑 黄宇

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分