【边缘计算网关教程】8.ModbusTCP采集存储Influxdb

前景回顾-【边缘计算网关教程】7.Modbus协议转MQTT协议-CSDN博客

需求概述

💡注:使用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数据库按照默认的配置即可无需修改

  第二步:创建一个数据库

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

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

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

  DO能控制的设备

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

这里使用myTable作为表名

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

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

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

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字符串

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

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.payloadif (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

客户端ID:网关SN

用户名:网关SN

密码:EG87654321

发布主题:${sn}/send

总结

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

注意

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

如上来源于官方授权公众号-微信公众平台 (qq.com)icon-default.png?t=N7T8https://mp.weixin.qq.com/s/GkNHQ7oLKkVVs0LUVX5-MQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值