const registers = msg.payload; // node.warn(`解析${registers}`); // 检查是否为状态数据(布尔类型或布尔数组) if (typeof registers === 'boolean' || (Array.isArray(registers) && registers.length === 1 && typeof registers[0] === 'boolean') || (Array.isArray(registers) && registers.length === 1 && typeof registers[0] === 'number' && (registers[0] === 0 || registers[0] === 1)) || (Array.isArray(registers) && registers.length > 1 && typeof registers[0] === 'boolean')) { // 处理布尔状态数据 let boolValue; if (typeof registers === 'boolean') { boolValue = registers; } else if (Array.isArray(registers) && registers.length === 1) { boolValue = typeof registers[0] === 'boolean' ? registers[0] : (registers[0] === 1); } else if (Array.isArray(registers) && registers.length > 1 && typeof registers[0] === 'boolean') { // 对于多个布尔值的数组,取第一个值作为主要状态 boolValue = registers[0]; // node.warn(`布尔数组长度: ${registers.length}, 取第一个值: ${boolValue}`); } // 根据 topic 确定状态类型 let dataType = "未知状态"; let statusValue = boolValue; if (msg.topic) { if (msg.topic.includes("工作状态") || msg.topic.includes("work") || msg.topic.includes("Q1.6")) { dataType = "工作状态"; statusValue = boolValue ? "运行" : "停止"; msg.workStatus = statusValue; } else if (msg.topic.includes("报警状态") || msg.topic.includes("alarm") || msg.topic.includes("Q1.5")) { dataType = "报警状态"; statusValue = boolValue ? "报警" : "正常"; msg.alarmStatus = statusValue; } else if (msg.topic.includes("状态") || msg.topic.includes("status")) { dataType = "设备状态"; statusValue = boolValue ? "激活" : "关闭"; msg.status = statusValue; } } else { // 如果没有 topic,使用通用状态字段 msg.status = boolValue; dataType = "状态"; } // 打印解析结果到调试控制台 // node.warn(`解析${dataType} ---> ${statusValue}`); // 保留原始的 payload,添加解析后的值 msg.originalPayload = msg.payload; msg.payload = statusValue; return msg; } // 检查寄存器长度(浮点数解析) if (!Array.isArray(registers) || registers.length !== 2) { node.warn("寄存器数量不足,无法解析浮点数!"); return null; } // 处理 Modbus 寄存器数据 // 寄存器数据按 Big Endian 字序存储,但浮点数需要按 Little Endian 读取 const highRegister = registers[0]; // 高16位寄存器 const lowRegister = registers[1]; // 低16位寄存器 // 创建一个 4 字节缓冲区 const buffer = Buffer.alloc(4); // 按照 Big Endian 方式写入寄存器数据 buffer.writeUInt16BE(highRegister, 0); // 写入高16位到前两个字节 buffer.writeUInt16BE(lowRegister, 2); // 写入低16位到后两个字节 // 按照 Little Endian 方式读取 IEEE 754 浮点数 const rawValue = buffer.readFloatLE(0); // 保留两位小数 const value = Math.round(rawValue * 100) / 100; // 根据输入消息的 topic 或其他标识来确定数据类型 let dataType = "未知数据"; if (msg.topic) { if (msg.topic.includes("温度") || msg.topic.includes("temperature")) { dataType = "温度"; msg.temperature = value; } else if (msg.topic.includes("PH") || msg.topic.includes("ph")) { dataType = "PH值"; msg.ph = value; } else if (msg.topic.includes("液位") || msg.topic.includes("level")) { dataType = "液位"; msg.level = value; } else if (msg.topic.includes("电导率") || msg.topic.includes("conductivity")) { dataType = "电导率"; msg.conductivity = value; } else if (msg.topic.includes("压力") || msg.topic.includes("pressure")) { dataType = "压力"; msg.pressure = value; } } else { // 如果没有 topic,使用通用字段名 msg.value = value; dataType = "数值"; } // 打印解析结果到调试控制台 // node.warn(`解析${dataType} ---> ${value}`); // 保留原始的 payload,添加解析后的值 msg.originalPayload = msg.payload; msg.payload = value; // 返回 msg 对象,供后续节点使用 return msg;