node-red-contrib-symi-modbus 2.7.9 → 2.8.0
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 +12 -22
- package/nodes/modbus-master.js +2 -2
- package/nodes/serial-port-config.js +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -267,7 +267,7 @@ node-red-restart
|
|
|
267
267
|
- 长期稳定运行,反复控制不会造成内存增加、卡顿或死机
|
|
268
268
|
|
|
269
269
|
4. **技术细节**:
|
|
270
|
-
- 写入队列间隔:
|
|
270
|
+
- 写入队列间隔:30ms(确保总线稳定)
|
|
271
271
|
- 轮询恢复时间:20ms(快速响应)
|
|
272
272
|
- 锁等待超时:100ms(快速检测异常)
|
|
273
273
|
- 队列自动处理,无需手动干预
|
|
@@ -883,40 +883,30 @@ HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
|
883
883
|
|
|
884
884
|
## 版本信息
|
|
885
885
|
|
|
886
|
-
**当前版本**: v2.
|
|
886
|
+
**当前版本**: v2.8.0
|
|
887
887
|
|
|
888
|
-
### v2.
|
|
888
|
+
### v2.8.0 (2025-11-10)
|
|
889
889
|
|
|
890
890
|
**重要更新**:
|
|
891
|
-
-
|
|
892
|
-
-
|
|
893
|
-
-
|
|
894
|
-
- 修复特定条件下MQTT连接不稳定的问题
|
|
895
|
-
- 增强Home Assistant自动发现功能的兼容性
|
|
896
|
-
|
|
897
|
-
### v2.6.9 (2025-11-10)
|
|
898
|
-
|
|
899
|
-
**重要修复**:
|
|
900
|
-
- 修复LED反馈队列处理逻辑:移除本地队列,直接使用全局队列(serial-port-config统一管理)
|
|
901
|
-
- 确保所有LED反馈按顺序串行发送,间隔20ms(TCP)或10ms(串口)
|
|
902
|
-
- 修复多从站继电器同时变化时的LED反馈遗漏问题
|
|
903
|
-
- 确保双控/多控场景下所有开关面板都能收到完整的状态反馈
|
|
891
|
+
- 优化指示灯反馈稳定性,统一队列间隔为30ms(TCP和串口)
|
|
892
|
+
- 修复高频控制场景下指示灯反馈丢失问题
|
|
893
|
+
- 提升批量控制时的总线稳定性
|
|
904
894
|
|
|
905
895
|
**队列处理机制**(全局统一队列):
|
|
906
896
|
- **全局队列**:所有从站开关节点共享同一个全局队列(由serial-port-config管理)
|
|
907
|
-
- **串行发送**:所有LED反馈按加入队列的顺序依次发送,间隔
|
|
897
|
+
- **串行发送**:所有LED反馈按加入队列的顺序依次发送,间隔30ms(TCP和串口统一)
|
|
908
898
|
- **完整性保证**:所有LED反馈都能正确发送,不会遗漏
|
|
909
899
|
- **去重机制**:每个节点50ms内不重复发送相同状态,避免总线拥堵
|
|
910
|
-
- **性能优化**:400个按键(50个8键开关)反馈耗时约
|
|
900
|
+
- **性能优化**:400个按键(50个8键开关)反馈耗时约12秒(30ms×400)
|
|
911
901
|
|
|
912
902
|
**典型场景说明**:
|
|
913
903
|
1. **场景1:单个继电器控制**
|
|
914
|
-
- 按下开关 → 继电器动作 → LED反馈加入全局队列 →
|
|
904
|
+
- 按下开关 → 继电器动作 → LED反馈加入全局队列 → 30ms后发送
|
|
915
905
|
|
|
916
906
|
2. **场景2:批量控制(如17通道全开,16个继电器)**
|
|
917
907
|
- 触发17通道 → 1-16路继电器全开 → 所有绑定的LED反馈加入全局队列
|
|
918
908
|
- 假设每个继电器绑定2个开关面板 = 32个LED反馈
|
|
919
|
-
- 按加入队列的顺序依次发送,耗时约
|
|
909
|
+
- 按加入队列的顺序依次发送,耗时约960ms(30ms×32)
|
|
920
910
|
|
|
921
911
|
3. **场景3:快速切换(如17通道全开后立即18通道全关)**
|
|
922
912
|
- 17通道触发 → 1-16路全开 → 32个LED反馈加入队列
|
|
@@ -925,11 +915,11 @@ HomeKit网桥节点无需输入消息,自动同步主站配置和状态。
|
|
|
925
915
|
|
|
926
916
|
4. **场景4:双控开关(1个继电器绑定2个不同ID的开关面板)**
|
|
927
917
|
- 继电器状态变化 → 2个LED反馈加入全局队列
|
|
928
|
-
- 按顺序发送,间隔
|
|
918
|
+
- 按顺序发送,间隔30ms,确保所有面板LED状态同步
|
|
929
919
|
|
|
930
920
|
5. **场景5:大规模部署(50个8键开关 = 400个按键)**
|
|
931
921
|
- 批量控制触发 → 所有LED反馈加入全局队列
|
|
932
|
-
- 按部署时的节点顺序依次发送,耗时约
|
|
922
|
+
- 按部署时的节点顺序依次发送,耗时约12秒(30ms×400)
|
|
933
923
|
- 确保总线稳定,不会冲突或丢失
|
|
934
924
|
|
|
935
925
|
## 许可证
|
package/nodes/modbus-master.js
CHANGED
|
@@ -150,7 +150,7 @@ module.exports = function(RED) {
|
|
|
150
150
|
// 写入队列机制(确保所有写入操作串行执行,避免锁竞争)
|
|
151
151
|
node.writeQueue = []; // 写入队列
|
|
152
152
|
node.isProcessingWrite = false; // 是否正在处理写入队列
|
|
153
|
-
node.writeQueueInterval =
|
|
153
|
+
node.writeQueueInterval = 30; // 写入队列处理间隔(30ms,确保总线稳定,避免数据丢失)
|
|
154
154
|
|
|
155
155
|
// 定期清理机制(每小时清理一次,防止内存泄漏)
|
|
156
156
|
node.cleanupTimer = setInterval(() => {
|
|
@@ -1197,7 +1197,7 @@ module.exports = function(RED) {
|
|
|
1197
1197
|
node.warn(`队列任务失败,继续处理下一个任务: ${err.message}`);
|
|
1198
1198
|
}
|
|
1199
1199
|
|
|
1200
|
-
// 等待一段时间再处理下一个任务(
|
|
1200
|
+
// 等待一段时间再处理下一个任务(30ms间隔,确保总线稳定)
|
|
1201
1201
|
if (node.writeQueue.length > 0) {
|
|
1202
1202
|
await new Promise(resolve => setTimeout(resolve, node.writeQueueInterval));
|
|
1203
1203
|
}
|
|
@@ -405,9 +405,9 @@ module.exports = function(RED) {
|
|
|
405
405
|
});
|
|
406
406
|
});
|
|
407
407
|
|
|
408
|
-
// TCP写入间隔(
|
|
408
|
+
// TCP写入间隔(30ms,避免网关处理不过来)
|
|
409
409
|
if (node.writeQueue.length > 0) {
|
|
410
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
410
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
411
411
|
}
|
|
412
412
|
} else {
|
|
413
413
|
if (!node.connection.isOpen) {
|
|
@@ -439,9 +439,9 @@ module.exports = function(RED) {
|
|
|
439
439
|
});
|
|
440
440
|
});
|
|
441
441
|
|
|
442
|
-
// 串口写入间隔(
|
|
442
|
+
// 串口写入间隔(30ms,确保指示灯反馈稳定)
|
|
443
443
|
if (node.writeQueue.length > 0) {
|
|
444
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
444
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
445
445
|
}
|
|
446
446
|
}
|
|
447
447
|
} catch (err) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-red-contrib-symi-modbus",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"description": "Node-RED Modbus节点,支持TCP/串口通信、串口自动搜索、多设备轮询、可选MQTT集成(支持纯本地模式和MQTT模式)、Home Assistant自动发现、HomeKit网桥、可视化控制看板、自定义协议转换和物理开关面板双向同步,工控机长期稳定运行",
|
|
5
5
|
"main": "nodes/modbus-master.js",
|
|
6
6
|
"scripts": {
|