|
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;
|