(以下來源成都縱橫智控公眾號授權更多可見-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數據庫按照默認的配置即可無需修改
第二步:創建一個數據庫
創建一個數據庫需要使用到sql語句 CREATE DATABASE myDatabase ,這條語句的意思是創建一個名字叫做myDatabase的數據庫。按照下面視頻的方式創建,日志窗口打印[empty],說明數據庫創建成功
第三步:指定使用新創建的數據庫
在第一步創建了一個名字叫做myDatabase的數據庫,現在需要使用這個數據庫,將Influxdb的一個配置名Database改成myDatabase
第四步;DO能控制的設備
Modbus TCP數據采集此處不做過多贅述,這里已經配置好Modbus TCP詳細使用請參考
從節點庫里面拿出一個寫時序數據庫節點,選擇前面步驟已經添加的配置信息,并將表名填寫在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.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
-總結
本章節介紹了一個相對復雜的流程,旨在表述網關所具備的能力,因此并未對程序的安全性、穩定性、靈活性等方面做優化。通過理解本流程,相信你已經對網關的可視化編程有了一定的熟悉。接下來,深入學習每個節點的功能用法吧,掌握它們將會為你制作更復雜的流程提供更多的選擇和可能!
-注意
MQTT配置節點導出時,不會攜帶用戶名和密碼。因此導入時需要重新錄入用戶名和密碼
審核編輯 黃宇
-
存儲
+關注
關注
13文章
4353瀏覽量
86169 -
node
+關注
關注
0文章
23瀏覽量
5954 -
ModbusTCP
+關注
關注
0文章
133瀏覽量
4428
發布評論請先 登錄
相關推薦
評論