trphoenix
2025-07-14 8da8ab334734f381bb5f6aad5bfa11df5cd36ff8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
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;