node-red-contrib-symi-modbus 2.6.3 → 2.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -10
- package/nodes/modbus-master.js +9 -9
- package/nodes/modbus-slave-switch.js +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -479,7 +479,7 @@ msg.payload = 1; // 或 0
|
|
|
479
479
|
|
|
480
480
|
## 项目信息
|
|
481
481
|
|
|
482
|
-
**版本**: v2.6.
|
|
482
|
+
**版本**: v2.6.4
|
|
483
483
|
|
|
484
484
|
**核心功能**:
|
|
485
485
|
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
@@ -499,20 +499,24 @@ msg.payload = 1; // 或 0
|
|
|
499
499
|
- Node.js: >=14.0.0
|
|
500
500
|
- Node-RED: >=2.0.0
|
|
501
501
|
|
|
502
|
-
**最新更新(v2.6.
|
|
502
|
+
**最新更新(v2.6.4)**:
|
|
503
|
+
- **🔥 日志优化**:大幅减少日志输出,保证长期稳定运行
|
|
504
|
+
- 高频操作日志改为debug级别(按键、轮询、写入等)
|
|
505
|
+
- 默认不输出到日志文件,不占用硬盘空间
|
|
506
|
+
- 保留错误日志的10分钟限流机制
|
|
507
|
+
- 完善的内存清理机制,防止内存泄漏
|
|
508
|
+
- **适合工控机长期运行**:
|
|
509
|
+
- 无debug节点时不产生日志
|
|
510
|
+
- 不会因日志增加硬盘占用
|
|
511
|
+
- 不会因日志增加内存占用
|
|
512
|
+
- 断网/MQTT断开也不会持续报错
|
|
513
|
+
|
|
514
|
+
**v2.6.3更新**:
|
|
503
515
|
- **🔥 MQTT可选配置**:完全兼容无MQTT环境
|
|
504
516
|
- 本地模式:纯串口通信,断网也能稳定运行
|
|
505
517
|
- MQTT模式:可选接入Home Assistant等第三方平台
|
|
506
518
|
- 智能切换:MQTT断开时自动切换到本地模式
|
|
507
519
|
- 状态显示:清晰区分当前运行模式
|
|
508
|
-
- **改进的错误提示**:
|
|
509
|
-
- MQTT未配置时不再报错,提示使用本地模式
|
|
510
|
-
- 友好的配置引导信息
|
|
511
|
-
- 更清晰的节点状态指示
|
|
512
|
-
- **增强的稳定性**:
|
|
513
|
-
- 支持纯本地化部署,不受网络影响
|
|
514
|
-
- 工控机断网环境下持续稳定运行
|
|
515
|
-
- 保持所有原有功能的兼容性
|
|
516
520
|
|
|
517
521
|
**性能优化**:
|
|
518
522
|
- 轮询间隔优化:修复间隔计算逻辑,确保每个从站使用正确的轮询间隔
|
package/nodes/modbus-master.js
CHANGED
|
@@ -495,7 +495,7 @@ module.exports = function(RED) {
|
|
|
495
495
|
tryConnect(brokerCandidates[0]);
|
|
496
496
|
}, 5000);
|
|
497
497
|
} else {
|
|
498
|
-
node.
|
|
498
|
+
node.debug(`尝试备用MQTT broker: ${nextBroker}`);
|
|
499
499
|
setTimeout(() => {
|
|
500
500
|
tryConnect(nextBroker);
|
|
501
501
|
}, 500); // 快速尝试下一个地址
|
|
@@ -866,9 +866,9 @@ module.exports = function(RED) {
|
|
|
866
866
|
}
|
|
867
867
|
|
|
868
868
|
if (isFirstPoll) {
|
|
869
|
-
node.
|
|
869
|
+
node.debug(`从站${slaveId}首次轮询成功,读取${coilCount}个线圈`);
|
|
870
870
|
} else if (publishCount > 0) {
|
|
871
|
-
node.
|
|
871
|
+
node.debug(`从站${slaveId}状态变化: ${publishCount}个线圈`);
|
|
872
872
|
}
|
|
873
873
|
|
|
874
874
|
node.deviceStates[slaveId].lastUpdate = Date.now();
|
|
@@ -1021,7 +1021,7 @@ module.exports = function(RED) {
|
|
|
1021
1021
|
const channel = frame.channel; // 通道号(1-8)
|
|
1022
1022
|
const state = frame.opInfo[0] === 0x01; // 状态(1=开,0=关)
|
|
1023
1023
|
|
|
1024
|
-
node.
|
|
1024
|
+
node.debug(`Symi按键事件: 设备${deviceAddr} 通道${channel} 状态=${state ? 'ON' : 'OFF'}`);
|
|
1025
1025
|
|
|
1026
1026
|
// 查找对应的从站和线圈
|
|
1027
1027
|
// 假设:设备地址1对应从站10,设备地址2对应从站11,以此类推
|
|
@@ -1042,7 +1042,7 @@ module.exports = function(RED) {
|
|
|
1042
1042
|
return;
|
|
1043
1043
|
}
|
|
1044
1044
|
|
|
1045
|
-
node.
|
|
1045
|
+
node.debug(`Symi按键映射: 设备${deviceAddr}通道${channel} → 从站${slaveId}线圈${coilNumber}`);
|
|
1046
1046
|
|
|
1047
1047
|
// 写入线圈(异步,不阻塞)
|
|
1048
1048
|
node.writeSingleCoil(slaveId, coilNumber, state).catch(err => {
|
|
@@ -1102,7 +1102,7 @@ module.exports = function(RED) {
|
|
|
1102
1102
|
// 更新本地状态
|
|
1103
1103
|
node.deviceStates[slaveId].coils[coil] = value;
|
|
1104
1104
|
|
|
1105
|
-
node.
|
|
1105
|
+
node.debug(`写入成功: 从站${slaveId} 线圈${coil} = ${value}`);
|
|
1106
1106
|
|
|
1107
1107
|
// 发布到MQTT和触发事件
|
|
1108
1108
|
node.publishMqttState(slaveId, coil, value);
|
|
@@ -1120,7 +1120,7 @@ module.exports = function(RED) {
|
|
|
1120
1120
|
node.pausePolling = false;
|
|
1121
1121
|
const pauseDuration = Date.now() - pauseStartTime;
|
|
1122
1122
|
if (node.pollingPausedCount > 0) {
|
|
1123
|
-
node.
|
|
1123
|
+
node.debug(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
|
|
1124
1124
|
node.pollingPausedCount = 0;
|
|
1125
1125
|
}
|
|
1126
1126
|
}, 100);
|
|
@@ -1185,7 +1185,7 @@ module.exports = function(RED) {
|
|
|
1185
1185
|
});
|
|
1186
1186
|
}
|
|
1187
1187
|
|
|
1188
|
-
node.
|
|
1188
|
+
node.debug(`批量写入成功: 从站${slaveId} 起始线圈${startCoil} 共${values.length}个线圈`);
|
|
1189
1189
|
|
|
1190
1190
|
// 释放锁
|
|
1191
1191
|
node.modbusLock = false;
|
|
@@ -1195,7 +1195,7 @@ module.exports = function(RED) {
|
|
|
1195
1195
|
node.pausePolling = false;
|
|
1196
1196
|
const pauseDuration = Date.now() - pauseStartTime;
|
|
1197
1197
|
if (node.pollingPausedCount > 0) {
|
|
1198
|
-
node.
|
|
1198
|
+
node.debug(`轮询暂停 ${pauseDuration}ms,跳过 ${node.pollingPausedCount} 次轮询`);
|
|
1199
1199
|
node.pollingPausedCount = 0;
|
|
1200
1200
|
}
|
|
1201
1201
|
}, 100);
|
|
@@ -292,14 +292,14 @@ module.exports = function(RED) {
|
|
|
292
292
|
globalDebounceCache.set(debounceKey, now);
|
|
293
293
|
|
|
294
294
|
if (isSceneMode) {
|
|
295
|
-
node.
|
|
295
|
+
node.debug(`场景触发: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
|
|
296
296
|
// 场景模式:切换状态(每次触发时翻转)
|
|
297
297
|
node.currentState = !node.currentState;
|
|
298
298
|
node.sendMqttCommand(node.currentState);
|
|
299
299
|
} else {
|
|
300
300
|
|
|
301
301
|
// 开关模式:根据状态发送ON/OFF
|
|
302
|
-
node.
|
|
302
|
+
node.debug(`开关${buttonEvent.state ? 'ON' : 'OFF'}: 面板${node.config.switchId} 按键${node.config.buttonNumber}`);
|
|
303
303
|
node.sendMqttCommand(buttonEvent.state);
|
|
304
304
|
}
|
|
305
305
|
}
|
|
@@ -340,7 +340,7 @@ module.exports = function(RED) {
|
|
|
340
340
|
};
|
|
341
341
|
|
|
342
342
|
node.send(msg);
|
|
343
|
-
node.
|
|
343
|
+
node.debug(`本地模式:发送控制命令到从站${node.config.targetSlaveAddress} 线圈${node.config.targetCoilNumber} = ${state ? 'ON' : 'OFF'}`);
|
|
344
344
|
};
|
|
345
345
|
|
|
346
346
|
// 处理命令队列(防止多个按键同时按下造成冲突)
|
|
@@ -666,7 +666,7 @@ module.exports = function(RED) {
|
|
|
666
666
|
tryConnect(brokerCandidates[0]);
|
|
667
667
|
}, 5000);
|
|
668
668
|
} else {
|
|
669
|
-
node.
|
|
669
|
+
node.debug(`尝试备用MQTT broker: ${nextBroker}`);
|
|
670
670
|
setTimeout(() => {
|
|
671
671
|
tryConnect(nextBroker);
|
|
672
672
|
}, 500); // 快速尝试下一个地址
|
|
@@ -715,7 +715,7 @@ module.exports = function(RED) {
|
|
|
715
715
|
|
|
716
716
|
if (!stateChanged && timeSinceLastChange < 100) {
|
|
717
717
|
// 状态未变化且时间间隔太短,跳过LED反馈(避免死循环)
|
|
718
|
-
node.
|
|
718
|
+
node.debug(`跳过LED反馈(状态未变化,间隔${timeSinceLastChange}ms)`);
|
|
719
719
|
return;
|
|
720
720
|
}
|
|
721
721
|
|
package/package.json
CHANGED