当有效负载缓冲区没有 15 个值时如何阻止有效负载

How to block payload when Payload when Payload Buffer does not have 15 values

我正在从 Modbus 从属设备收集数据,但有时有效负载缓冲区没有 15 个值。

如果负载不具备全部 15 个值,我该如何阻止负载?

if (msg.topic === "sensor1" || msg.topic === "reset") {
var msg1 = { payload : msg.payload[1]};
var msg2 = { payload : msg.payload[3]};
var msg3 = { payload : msg.payload[5]};
var msg4 = { payload : msg.payload[7]};
var msg5 = { payload : msg.payload[9]};
global.set('sensor1Id',msg1.payload);
global.set('sensor1Concentration',msg2.payload);
global.set('sensor1Temperature',msg3.payload);
global.set('sensor1Voltage',msg4.payload);
global.set('sensor1SensorFailure',msg5.payload);
return msg;
}

有时我会收到以下有效负载:

[1,3,10]

但应该是这样的:

[0,2,0,0,0,31,0,213,0,4,184,47,1,3,10]

首先让我们修复您发布的代码

if (msg.topic === "sensor1" || msg.topic === "reset") {
  global.set('sensor1Id',msg.payload[1]);
  global.set('sensor1Concentration',msg.payload[3]);
  global.set('sensor1Temperature',msg3.payload[5]);
  global.set('sensor1Voltage',msg4.payload[7]);
  global.set('sensor1SensorFailure',msg5.payload[9]);
  return msg;
}

不需要创建所有额外的对象然后设置全局变量。

如果您想在缓冲区的长度上门控该代码,那么您可以按如下方式更改 if 语句:

if ((msg.topic === "sensor1" || msg.topic === "reset") &&
   msg.payload.length == 12) {

这将检查缓冲区是否包含 12 个字节。

您还可以在function之前添加一个switch节点,并使用$length(payload)之类的测试表达式,与数字15进行比较->输出到端口#1。如果你只是想忽略不同长度的有效载荷,你甚至不需要添加端口#2。