新闻中心

PRESS CENTER 纵横智控
你的位置: 首页 新闻 技术应用
纵横智控

采集modbus TCP设备存入Influxdb数据库-EG网关

2025-09-10 11:00:01 阅读: 发布人:纵横智控

需求概述

本文主要实现的功能是:使用EG系列网关间隔10秒采集Modbus TCP设备的数据,并将数据存入Influxdb数据库(EG系列网关插入TF卡后会自动安装Influxdb数据库)。然后每分钟从Influxdb数据库读取6条数据打包上报到服务器。

本文选择EG8200作为演示载体,但文档所述方法适用于EG系列所有网关。

注:使用时序数据库需插入TF卡

需求分析

第一步:连接数据库

第二步:创建数据库

第三步:选择数据库

第四步:将数据写入数据库

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

第六步:数据格式化

第七步:数据上报

采集modbus TCP设备存入Influxdb数据库-EG网关

需求实现

第一步:连接数据库

首次连接Influxdb数据库时,按照默认的配置即可,无需修改配置参数。如下所示:

采集modbus TCP设备存入Influxdb数据库-EG网关

第二步:创建数据库

创建数据库需要使用到sql语句 CREATE DATABASE myDatabase ,这条语句的意思是创建一个名字叫做myDatabase的数据库。如图所示,日志窗口打印[empty],表示数据库创建成功:

采集modbus TCP设备存入Influxdb数据库-EG网关

第三步:选择数据库

第二步创建了一个名字叫做myDatabase的数据库,现在需要使用这个数据库,将Influxdb的配置项Database设置为myDatabase,表示以后的操作目标都是myDatabase数据库。

采集modbus TCP设备存入Influxdb数据库-EG网关

第四步:将数据写入数据库

Modbus TCP数据采集此处不做过多赘述,可参考其他案例介绍

从节点库选择一个写时序数据库节点,选择已经添加好的的数据库配置信息,将数据要存储的表名填写在Measurement,这里使用myTable作为表名:

采集modbus TCP设备存入Influxdb数据库-EG网关

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

通过函数计算节点构造sql读取指令,读取最近的6条数据:

采集modbus TCP设备存入Influxdb数据库-EG网关

上图中使用到的函数代码:

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格式:

采集modbus TCP设备存入Influxdb数据库-EG网关

上图中使用到的函数代码:

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数据发布此处不做过多赘述,可参考其他案例介绍


流程源码/原文(https://iotrouter.yuque.com/zn3vdn/eg8000/dzy0yqzsc9529hy5)

网关的流程支持以Json格式导入导出,方便与其他人分享做好的流程。本章节的流程Json文件如下,复制后在菜单栏右上角选择导入粘贴即可,导出同理。

 采集modbus TCP设备存入Influxdb数据库-EG网关

注意

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


热门产品