Node-RED中监测Modbus模拟量增量并设置0/1标志的实现求助
Node-RED实现Modbus值递增监测逻辑
核心方案:用Function节点替代Filter节点
Filter节点仅负责过滤消息的通过/不通过,无法直接设置变量值。改用Function节点可同时完成历史值存储、数值比较和变量赋值三个操作,具体步骤如下:
1. 配置Function节点逻辑
替换原流程中的Filter节点为Function节点,写入以下代码:
// 从上下文读取前一次的A值(初始值设为0,可根据实际场景调整) const prevA = context.get('prevA') || 0; // 获取当前Modbus读取到的A值(假设值存在msg.payload.A,需根据实际路径修改) const currentA = msg.payload.A; // 比较当前值与历史值,设置变量B msg.payload.B = currentA > prevA ? 1 : 0; // 更新上下文,将当前A值保存为下一次的历史值 context.set('prevA', currentA); return msg;
2. 适配你的Modbus流程
- 确保Modbus读取合并寄存器后,目标模拟点的值能被Function节点正确获取(若值的存储路径不是
msg.payload.A,修改currentA的取值路径即可) - 保留原有的5秒定时触发逻辑(比如用Inject节点定时启动Modbus读取)
3. 告警触发(可选)
若需基于B的值触发告警,在Function节点后添加Switch节点:
- 设置条件
msg.payload.B === 1,连接递增状态的告警节点(如Notification、MQTT输出等) - 设置条件
msg.payload.B === 0,连接非递增状态的处理节点
为什么不用Filter节点?
Filter节点的核心是筛选消息:满足条件则放行,不满足则丢弃。但你需要的是无论是否满足条件,都要输出带有B值的完整消息,因此Function节点更适合这种需要全量处理并修改消息payload的场景。
内容的提问来源于stack exchange,提问作者Hazarath Voleti
相关产品推荐
相关产品推荐

