我在制作更高级的实时图表时遇到问题。我在 PC 上使用 node-red 从 PLC 收集数据并使用标准 node-red 仪表板图表节点将其显示在折线图中。PLC 从 30 个传感器读取值:20 个压力、3 个温度、3 个流量、1 个速度。读取频率为 4Hz。并非所有值在时间上都是可见的,因为我希望图表清晰。为此,我还需要根据传感器拆分 y 轴。因此,一种用于压力,一种用于温度,一种用于流量,一种用于速度。目前数据以数组 msg.payload[] 的形式出现,但这并不重要,因为我会将数据格式化为正确的格式。我知道实时图表工作的格式数据是
{topic:"temperature", payload:22}
{topic:"humidity", payload:66}
对于静态图表
msg.payload =[{
"series": ["A", "B", "C"],
"data": [
[{ "x": 1504029632890, "y": 5 },
{ "x": 1504029636001, "y": 4 },
{ "x": 1504029638656, "y": 2 }
],
[{ "x": 1504029633514, "y": 6 },
{ "x": 1504029636622, "y": 7 },
{ "x": 1504029639539, "y": 6 }
],
[{ "x": 1504029634400, "y": 7 },
{ "x": 1504029637959, "y": 7 },
{ "x": 1504029640317, "y": 7 }
]
],
"labels": [""]
}]
. 带有来自上述代码的数据的标准图表 我知道节点红色仪表板图表类似于 chart.js。我可以发送 ui_control 消息来调整实际的 y 轴并添加另外两个 y 轴:
let msg2=
{
ui_control :{
options: {
scales: {
xAxes: [{
type: 'time',
time: {
unit: 'minute',
unitStepSize: 1,
displayFormats: {
minute: 'HH:mm'
}
}
}],
yAxes: [{
id: "1",
scaleLabel: {
display: true,
labelString: 'pressure [bar]'
},
ticks: {
min: -10,
max: 10,
stepSize: 2
}
}, {
id: "2",
scaleLabel: {
display: true,
labelString: 'Temperature [°C]'
},
ticks: {
min: 0,
max: 20,
stepSize: 4
}
}, {
id: "3",
scaleLabel: {
display: true,
labelString: 'Flow [L/min]'
},
ticks: {
min: 0,
max: 20,
stepSize: 4
}
}]
} ,
legend: {
display: true,
position: 'top',
},
title: {
display: true,
text: 'Chart'
}
,
animation: {
duration: 0
}
}},
};
return msg2;
现在我想显示例如:
msg.payload = 5;
msg.topic="C";
msg.yAxis="3";
return msg;
而是在 ax 3(温度)上得到“C”,我在 ax 1(压力)上得到它,并且 Node-red 在发送上述消息后有时会冻结。 在 1 y 轴上有一个数据点的图表
所以现在正确的问题是:如何使用多个 y 轴?我可以使用标准的节点红色仪表板图表来做到这一点吗?数据结构应该如何寻找静态图表,以及如何寻找实时图表?也许我应该使用node-red模板节点并基于chart.js在HTML中编写代码?最后一个问题,我怎样才能最大限度地减少 PC 的使用,因为当我以 4Hz 运行 30 个传感器时,我在 10 秒内得到 1200 点?
我将不胜感激您的帮助:D