node-red-contrib-symi-modbus 2.6.5 → 2.6.7
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 +506 -40
- package/nodes/lightweight-protocol.js +13 -1
- package/nodes/modbus-debug.html +58 -0
- package/nodes/modbus-debug.js +142 -0
- package/nodes/modbus-master.html +1 -17
- package/nodes/modbus-master.js +238 -82
- package/nodes/modbus-slave-switch.html +3 -2
- package/nodes/modbus-slave-switch.js +107 -33
- package/nodes/serial-port-config.js +97 -34
- package/package.json +59 -55
package/README.md
CHANGED
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
# node-red-contrib-symi-modbus
|
|
2
2
|
|
|
3
|
-
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT
|
|
3
|
+
Node-RED的Modbus继电器控制节点,支持TCP/串口通信和MQTT集成,专为智能家居场景设计。
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/node-red-contrib-symi-modbus)
|
|
6
6
|
[](https://nodered.org)
|
|
7
7
|
[](https://opensource.org/licenses/MIT)
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 核心特性
|
|
10
10
|
|
|
11
|
+
- **双模式运行**:
|
|
12
|
+
- **本地模式**:纯串口/TCP通信,断网也能稳定运行,无需MQTT
|
|
13
|
+
- **MQTT模式**:可选接入Home Assistant等第三方平台
|
|
11
14
|
- **多协议支持**:
|
|
15
|
+
- Modbus RTU(串口直连RS485)
|
|
12
16
|
- Modbus TCP(标准Modbus TCP)
|
|
13
17
|
- Modbus RTU over TCP(TCP转RS485网关)
|
|
14
18
|
- Telnet ASCII(推荐用于TCP转RS485网关)
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
- **灵活配置**:可自定义轮询间隔(100-10000ms,默认200ms)、线圈范围、从站地址
|
|
21
|
-
- **🔥 双模式支持**:
|
|
22
|
-
- **本地模式**:纯串口通信,无需MQTT,断网也能稳定运行
|
|
23
|
-
- **MQTT模式**:可选接入Home Assistant等第三方平台
|
|
24
|
-
- **MQTT集成**(可选):自动生成Home Assistant兼容的MQTT发现消息
|
|
25
|
-
- **实时状态**:实时监控和控制继电器状态
|
|
26
|
-
- **主从模式**:提供主站节点和从站控制节点
|
|
27
|
-
- **稳定可靠**:完整的内存管理和错误处理,适合工控机长期稳定运行
|
|
19
|
+
- **Symi开关集成**:自动识别并处理Symi私有协议按键事件,实现开关面板与继电器的双向同步
|
|
20
|
+
- **多设备轮询**:支持最多10台Modbus从站设备,每台32路继电器
|
|
21
|
+
- **智能轮询机制**:从站上报时自动暂停轮询,优先处理数据,避免冲突
|
|
22
|
+
- **稳定可靠**:完整的内存管理、错误处理、断线重连,适合7x24小时长期运行
|
|
23
|
+
- **总线数据过滤**:自动忽略总线上的无关数据,只处理本节点相关的数据
|
|
28
24
|
|
|
29
25
|
## 快速开始
|
|
30
26
|
|
|
@@ -56,13 +52,14 @@ node-red-restart
|
|
|
56
52
|
**配置方法**:
|
|
57
53
|
1. 主站节点:不启用MQTT或不配置MQTT服务器
|
|
58
54
|
2. 从站开关节点:不配置MQTT服务器
|
|
59
|
-
3.
|
|
55
|
+
3. **无需连线**:主站和从站通过内部事件自动通信(v2.6.7+)
|
|
60
56
|
|
|
61
57
|
**优势**:
|
|
62
58
|
- ✅ 断网也能稳定运行
|
|
63
59
|
- ✅ 不依赖外部服务
|
|
64
60
|
- ✅ 响应速度更快
|
|
65
61
|
- ✅ 配置更简单
|
|
62
|
+
- ✅ 无需手动连线(免连线通信)
|
|
66
63
|
|
|
67
64
|
#### 模式2:MQTT模式(推荐用于Home Assistant集成)
|
|
68
65
|
|
|
@@ -142,10 +139,12 @@ node-red-restart
|
|
|
142
139
|
- 面板品牌: `亖米` (默认)
|
|
143
140
|
- 开关ID: 物理面板地址 (0-255)
|
|
144
141
|
- 按钮编号: 按键编号 (1-8)
|
|
142
|
+
- 按钮类型: 开关按钮或场景按钮(也可自动识别)
|
|
145
143
|
4. 配置映射到的继电器:
|
|
146
144
|
- 目标从站地址: `10`
|
|
147
145
|
- 目标线圈编号: `0`
|
|
148
|
-
5.
|
|
146
|
+
5. **无需连线**:主站和从站通过内部事件自动通信,无需手动连线
|
|
147
|
+
6. 部署流程
|
|
149
148
|
|
|
150
149
|
## 核心特性说明
|
|
151
150
|
|
|
@@ -187,6 +186,7 @@ node-red-restart
|
|
|
187
186
|
**2. 场景按钮**
|
|
188
187
|
- **控制方式**:每次按下toggle切换状态(开→关→开)
|
|
189
188
|
- **LED反馈**:根据当前状态显示LED(开=亮,关=灭)
|
|
189
|
+
- **协议特征**:操作信息为0x11、0x12、0x13等(高4位=1表示场景模式)
|
|
190
190
|
- **适用场景**:
|
|
191
191
|
- 场景触发(回家模式、离家模式等)
|
|
192
192
|
- 一键全开/全关
|
|
@@ -196,25 +196,30 @@ node-red-restart
|
|
|
196
196
|
- 使用原始设备地址确保LED精确反馈
|
|
197
197
|
- 支持物理按键和Home Assistant远程控制
|
|
198
198
|
- 200ms防抖,避免重复触发
|
|
199
|
+
- 自动识别场景模式(根据操作信息高4位判断)
|
|
199
200
|
|
|
200
201
|
**两种模式对比**:
|
|
201
202
|
|
|
202
203
|
| 特性 | 开关按钮 | 场景按钮 |
|
|
203
204
|
|------|---------|---------|
|
|
204
205
|
| 控制方式 | 开/关独立 | Toggle切换 |
|
|
206
|
+
| 操作信息 | 0x00/0x01 | 0x11/0x12/0x13等 |
|
|
205
207
|
| LED反馈协议 | SET (0x03) | REPORT (0x04) |
|
|
206
208
|
| 按键事件 | 独立开/关码 | 统一触发码 |
|
|
207
209
|
| LED同步 | ✓ 完美同步 | ✓ 完美同步 |
|
|
208
210
|
| HA远程控制 | ✓ 支持 | ✓ 支持 |
|
|
209
211
|
| 推荐场景 | 灯光/插座 | 场景触发 |
|
|
212
|
+
| 自动识别 | ✓ 支持 | ✓ 支持 |
|
|
210
213
|
|
|
211
214
|
**配置说明**:
|
|
212
215
|
|
|
213
216
|
1. **RS-485连接**:选择串口配置节点(波特率9600,8N1)
|
|
214
|
-
2. **MQTT
|
|
217
|
+
2. **MQTT服务器**(可选):
|
|
218
|
+
- 本地模式:不启用MQTT,主站和从站通过内部事件自动通信(免连线)
|
|
219
|
+
- MQTT模式:启用MQTT并选择MQTT配置节点
|
|
215
220
|
3. **面板配置**:
|
|
216
221
|
- 面板品牌:选择亖米(Symi)
|
|
217
|
-
-
|
|
222
|
+
- 按钮类型:开关按钮或场景按钮(也可自动识别)
|
|
218
223
|
- 开关ID:物理面板的RS-485地址(0-255)
|
|
219
224
|
- 按钮编号:面板上的按键序号(1-8)
|
|
220
225
|
4. **继电器映射**:
|
|
@@ -223,15 +228,23 @@ node-red-restart
|
|
|
223
228
|
|
|
224
229
|
**使用示例**:
|
|
225
230
|
|
|
226
|
-
**示例1
|
|
231
|
+
**示例1:客厅灯光开关(本地模式)**
|
|
227
232
|
- 面板:开关ID=2,按键1(开关按钮)
|
|
228
233
|
- 继电器:从站10,1路
|
|
229
|
-
-
|
|
234
|
+
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
235
|
+
- 效果:按下面板按键,客厅灯开/关,面板LED同步状态,断网也能正常工作
|
|
230
236
|
|
|
231
|
-
**示例2
|
|
237
|
+
**示例2:全开场景(MQTT模式)**
|
|
232
238
|
- 面板:开关ID=2,按键8(场景按钮)
|
|
233
239
|
- 继电器:从站10,32路
|
|
234
|
-
-
|
|
240
|
+
- 配置:启用MQTT,连接到Home Assistant
|
|
241
|
+
- 效果:按下面板按键,触发全开场景,HA中可远程控制,面板LED同步状态
|
|
242
|
+
|
|
243
|
+
**示例3:三键场景开关(本地模式)**
|
|
244
|
+
- 面板:开关ID=1,按键1/2/3(场景按钮,自动识别)
|
|
245
|
+
- 继电器:从站10,1/2/3路
|
|
246
|
+
- 配置:不启用MQTT,主站和从站自动通信(免连线)
|
|
247
|
+
- 效果:按下按键1/2/3,分别控制对应继电器,LED指示灯同步状态
|
|
235
248
|
|
|
236
249
|
### 智能轮询机制
|
|
237
250
|
|
|
@@ -246,6 +259,56 @@ node-red-restart
|
|
|
246
259
|
- 从站上报的数据得到优先处理
|
|
247
260
|
- 系统响应迅速,状态同步及时
|
|
248
261
|
|
|
262
|
+
### 总线数据过滤与稳定性
|
|
263
|
+
|
|
264
|
+
本节点具备完善的总线数据过滤机制,确保长期稳定运行:
|
|
265
|
+
|
|
266
|
+
**数据过滤机制**:
|
|
267
|
+
- **CRC校验**:所有Symi协议帧都经过CRC8校验,无效数据自动丢弃
|
|
268
|
+
- **静默忽略**:总线上的非相关数据(其他设备、其他协议)静默忽略,不影响正常通信
|
|
269
|
+
- **精确匹配**:只处理本节点配置的从站地址和线圈范围内的数据
|
|
270
|
+
- **TCP粘包处理**:TCP模式下自动处理粘包和分包问题,确保数据完整性
|
|
271
|
+
|
|
272
|
+
**稳定性保障**:
|
|
273
|
+
- **写入队列**:多个节点同时写入时自动排队,避免并发冲突
|
|
274
|
+
- **断线重连**:TCP和串口断线后自动重连,指数退避策略(最大60秒)
|
|
275
|
+
- **内存管理**:定时清理缓存,防止内存泄漏
|
|
276
|
+
- **错误日志限流**:避免日志刷屏影响性能
|
|
277
|
+
- **MQTT独立性**:MQTT开启或关闭都不影响主站和从站的本地通信
|
|
278
|
+
|
|
279
|
+
**网络适应性**:
|
|
280
|
+
- **离线通信**:串口模式完全脱离网络依赖,断网也能正常工作
|
|
281
|
+
- **TCP稳定性**:TCP模式支持局域网通信,网络恢复后自动重连
|
|
282
|
+
- **MQTT可选**:MQTT仅用于对接第三方平台,不影响本地控制
|
|
283
|
+
|
|
284
|
+
## 调试节点(modbus-debug)
|
|
285
|
+
|
|
286
|
+
用于抓取并显示原始RS485字节流数据(HEX),帮助定位串口或TCP网关下的Modbus通信问题。
|
|
287
|
+
|
|
288
|
+
- 数据来源:
|
|
289
|
+
- 共享连接:`serial-port-config`(推荐,复用主站/从站的同一连接)
|
|
290
|
+
- 独立连接:`modbus-server-config`(直接连接TCP或串口)
|
|
291
|
+
- 输出内容:
|
|
292
|
+
- `msg.payload`:格式化的HEX字符串(可选大写)
|
|
293
|
+
- `msg.buffer`:原始Buffer数据
|
|
294
|
+
- `msg.meta`:来源信息与连接参数(串口或TCP详情)
|
|
295
|
+
- `msg.timestamp`:时间戳(可选)
|
|
296
|
+
- 显示控制:
|
|
297
|
+
- `maxBytes`:限制显示字节数,超过会截断并在`meta.truncated`标记
|
|
298
|
+
|
|
299
|
+
使用步骤:
|
|
300
|
+
1. 将 `modbus-debug` 节点拖入画布。
|
|
301
|
+
2. 选择“数据来源”:
|
|
302
|
+
- 选“共享串口配置(serial-port-config)”以复用主站/从站连接;或
|
|
303
|
+
- 选“Modbus服务器(modbus-server-config)”进行独立直连。
|
|
304
|
+
3. 可选:勾选“大写HEX”、勾选“时间戳”、设置“最大字节数”。
|
|
305
|
+
4. 部署后,节点自动输出捕获到的原始数据。
|
|
306
|
+
|
|
307
|
+
典型用法:
|
|
308
|
+
- 联调TCP转RS485网关时,观察上行/下行原始数据帧是否完整。
|
|
309
|
+
- 排查波特率/数据位/校验位配置是否正确(串口模式)。
|
|
310
|
+
- 与 `modbus-master` 或 `modbus-slave-switch` 同时使用,定位现场设备通信异常。
|
|
311
|
+
|
|
249
312
|
### MQTT自动发现
|
|
250
313
|
|
|
251
314
|
启用MQTT后,自动生成Home Assistant兼容的Discovery配置:
|
|
@@ -276,7 +339,11 @@ node-red-restart
|
|
|
276
339
|
- TCP网络故障自动恢复
|
|
277
340
|
- 连接前彻底清理旧实例,避免资源泄漏
|
|
278
341
|
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
279
|
-
- **
|
|
342
|
+
- **TCP永久连接**:
|
|
343
|
+
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
344
|
+
- Keep-Alive心跳10秒间隔,确保连接活跃
|
|
345
|
+
- 适应客户长期不在家、总线无数据的场景
|
|
346
|
+
- 网络故障自动重连,恢复后立即恢复通信
|
|
280
347
|
|
|
281
348
|
## 技术规格
|
|
282
349
|
|
|
@@ -369,6 +436,80 @@ devices:
|
|
|
369
436
|
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
370
437
|
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
371
438
|
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
439
|
+
|
|
440
|
+
### 轮询超时或频繁报错
|
|
441
|
+
|
|
442
|
+
1. **轮询永不停止原则**:
|
|
443
|
+
- 即使从站不响应,轮询也会持续运行
|
|
444
|
+
- 不会因超时而跳过任何从站
|
|
445
|
+
- 只记录错误日志,不影响总线轮询机制
|
|
446
|
+
2. **正常超时**:偶尔超时是正常的,系统会自动重试
|
|
447
|
+
- 超时设置:2-3秒(串口/TCP)
|
|
448
|
+
- 只记录日志,不停止轮询
|
|
449
|
+
- 轮询会持续运行,不受超时影响
|
|
450
|
+
3. **频繁超时**:
|
|
451
|
+
- 检查Modbus连接是否稳定
|
|
452
|
+
- 调整轮询间隔(默认200ms,可增加到500ms)
|
|
453
|
+
- 检查从站设备是否在线
|
|
454
|
+
- 查看总线是否有其他设备干扰
|
|
455
|
+
4. **总线干扰**:
|
|
456
|
+
- 总线上的其他数据(如Symi网关通信、其他Modbus设备)可能导致偶尔超时或CRC错误
|
|
457
|
+
- 系统已优化容错机制,会自动忽略异常数据并继续轮询
|
|
458
|
+
- 非超时错误(如CRC错误)不累积计数,只记录日志
|
|
459
|
+
5. **长期稳定性保障**:
|
|
460
|
+
- 轮询循环采用try-catch包裹,确保异常不会中断轮询
|
|
461
|
+
- 每1000轮输出一次调试日志,证明轮询持续运行
|
|
462
|
+
- 定时清理机制(每小时)防止内存泄漏
|
|
463
|
+
- 所有定时器在节点关闭时正确清除
|
|
464
|
+
|
|
465
|
+
### 总线上出现未知数据
|
|
466
|
+
|
|
467
|
+
1. **识别数据来源**:
|
|
468
|
+
- 使用`modbus-debug`节点监听总线数据(必须使用共享的serial-port-config,避免串口冲突)
|
|
469
|
+
- 查看Node-RED日志中的"写入线圈"日志,确认是否是本节点发送的
|
|
470
|
+
- 检查是否有其他Modbus设备或Symi网关在总线上通信
|
|
471
|
+
2. **常见数据格式**:
|
|
472
|
+
- `01 05 00 01 FF 00 ...`:写单个线圈(功能码0x05)
|
|
473
|
+
- `01 0F 00 00 00 20 ...`:写多个线圈(功能码0x0F)
|
|
474
|
+
- `7E 01 03 ...`:Symi轻量级协议数据
|
|
475
|
+
3. **影响**:
|
|
476
|
+
- 总线上的其他数据不会影响轮询稳定性
|
|
477
|
+
- 可能导致偶尔的CRC错误或超时,但系统会自动忽略并继续轮询
|
|
478
|
+
|
|
479
|
+
### 串口冲突错误
|
|
480
|
+
|
|
481
|
+
**错误信息**:
|
|
482
|
+
```
|
|
483
|
+
串口监听错误: Port is not open
|
|
484
|
+
串口监听错误: Error Resource temporarily unavailable Cannot lock port
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
**原因**:
|
|
488
|
+
- 多个节点试图独立打开同一个串口
|
|
489
|
+
- 串口只能被一个进程同时打开
|
|
490
|
+
|
|
491
|
+
**解决方案**:
|
|
492
|
+
1. **modbus-debug节点**:必须使用"serial"源类型,选择共享的`serial-port-config`配置节点
|
|
493
|
+
2. **不要使用独立连接**:不要让多个节点独立打开同一个串口
|
|
494
|
+
3. **共享连接配置**:所有节点(主站、从站开关、modbus-debug)都应该使用同一个`serial-port-config`配置节点
|
|
495
|
+
|
|
496
|
+
### 批量更换连接配置
|
|
497
|
+
|
|
498
|
+
**问题**:如何批量更换所有节点的RS-485连接配置?
|
|
499
|
+
|
|
500
|
+
**Node-RED原生方法**(推荐):
|
|
501
|
+
1. 创建新的`serial-port-config`配置节点
|
|
502
|
+
2. 点击右上角菜单 → 配置节点
|
|
503
|
+
3. 找到旧的`serial-port-config`配置节点
|
|
504
|
+
4. 点击删除按钮
|
|
505
|
+
5. Node-RED会提示"此配置节点被X个节点使用,是否替换为其他配置?"
|
|
506
|
+
6. 选择新创建的配置节点
|
|
507
|
+
7. 点击确认,所有使用旧配置的节点会自动更换为新配置
|
|
508
|
+
|
|
509
|
+
**注意**:
|
|
510
|
+
- 这是Node-RED的原生功能,安全可靠
|
|
511
|
+
- 删除配置节点前必须先创建新配置
|
|
512
|
+
- 替换后需要部署才能生效
|
|
372
513
|
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
373
514
|
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
374
515
|
8. **测试连接**:
|
|
@@ -377,10 +518,28 @@ devices:
|
|
|
377
518
|
|
|
378
519
|
### 从站开关无响应
|
|
379
520
|
|
|
380
|
-
1.
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
521
|
+
1. **检查免连线通信**(v2.6.7+推荐):
|
|
522
|
+
- **无需连线**:主站和从站通过内部事件自动通信,无需手动连线
|
|
523
|
+
- 查看Node-RED日志,确认是否有"内部事件模式:发送命令到从站X 线圈Y"的日志
|
|
524
|
+
- 查看主站节点日志,确认是否有"收到内部事件:从站X 线圈Y"的日志
|
|
525
|
+
- 查看主站节点日志,确认是否有"内部事件写入成功,已广播状态变化"的日志
|
|
526
|
+
- 查看从站开关节点日志,确认是否有"收到状态变化事件"和"LED反馈已发送"的日志
|
|
527
|
+
2. **检查RS-485连接**:
|
|
528
|
+
- 确认RS-485连接配置正确(串口路径、波特率等)
|
|
529
|
+
- 查看节点状态显示是否为"MQTT未启用 - 使用内部事件模式"
|
|
530
|
+
- 物理面板连接:确认物理面板连接到正确的RS-485总线(TCP或串口)
|
|
531
|
+
3. **检查开关面板配置**:
|
|
532
|
+
- 确认开关面板地址和按钮编号正确
|
|
533
|
+
- 场景模式开关:操作信息为0x11、0x12、0x13等(高4位=1)
|
|
534
|
+
- 开关模式开关:操作信息为0x00(关)或0x01(开)
|
|
535
|
+
4. **检查继电器映射**:
|
|
536
|
+
- 确认目标从站地址和线圈编号正确
|
|
537
|
+
- 线圈编号范围:0-31(对应用户输入的1-32路)
|
|
538
|
+
5. **查看调试日志**:
|
|
539
|
+
- 使用modbus-debug节点抓取原始总线数据
|
|
540
|
+
- 查看Node-RED日志中的协议解析信息
|
|
541
|
+
- 确认按键事件是否被正确识别
|
|
542
|
+
- 确认LED反馈协议帧是否正确发送(查看日志中的HEX字符串)
|
|
384
543
|
|
|
385
544
|
## 输入消息格式
|
|
386
545
|
|
|
@@ -479,7 +638,7 @@ msg.payload = 1; // 或 0
|
|
|
479
638
|
|
|
480
639
|
## 项目信息
|
|
481
640
|
|
|
482
|
-
**版本**: v2.6.
|
|
641
|
+
**版本**: v2.6.7
|
|
483
642
|
|
|
484
643
|
**核心功能**:
|
|
485
644
|
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
@@ -487,10 +646,11 @@ msg.payload = 1; // 或 0
|
|
|
487
646
|
- Symi私有协议自动识别(支持两种485开关控制方式)
|
|
488
647
|
- 智能轮询暂停机制(从站上报时自动暂停,处理完成后恢复)
|
|
489
648
|
- 🔥 **双模式支持**(本地模式和MQTT模式可选切换,断网也能稳定运行)
|
|
649
|
+
- 🔥 **免连线通信**(主站和从站通过内部事件通信,无需连线,支持本地模式和MQTT模式)
|
|
490
650
|
- MQTT集成(可选启用,Home Assistant自动发现,实体唯一性保证,QoS=0高性能发布)
|
|
491
|
-
- 物理开关面板双向同步(亖米协议支持,LED
|
|
651
|
+
- 物理开关面板双向同步(亖米协议支持,LED反馈同步,支持开关模式和场景模式)
|
|
492
652
|
- 共享连接架构(多个从站开关节点共享同一个串口/TCP连接,支持500+节点)
|
|
493
|
-
- 长期稳定运行(内存管理、智能重连、错误日志限流、异步MQTT
|
|
653
|
+
- 长期稳定运行(内存管理、智能重连、错误日志限流、异步MQTT发布、TCP永久连接)
|
|
494
654
|
|
|
495
655
|
**技术栈**:
|
|
496
656
|
- modbus-serial: ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
@@ -499,16 +659,36 @@ msg.payload = 1; // 或 0
|
|
|
499
659
|
- Node.js: >=14.0.0
|
|
500
660
|
- Node-RED: >=2.0.0
|
|
501
661
|
|
|
502
|
-
**最新更新(v2.6.
|
|
503
|
-
- **🔥 修复
|
|
504
|
-
-
|
|
662
|
+
**最新更新(v2.6.7)**:
|
|
663
|
+
- **🔥 修复LED反馈功能**:
|
|
664
|
+
- 主站轮询检测到状态变化时自动广播事件
|
|
665
|
+
- 从站开关节点监听状态变化并发送LED反馈到物理面板
|
|
666
|
+
- 支持开关模式(SET协议)和场景模式(REPORT协议)
|
|
667
|
+
- LED反馈队列间隔20ms,避免总线拥堵
|
|
668
|
+
- **🔥 TCP连接稳定性优化**:
|
|
669
|
+
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
670
|
+
- Keep-Alive间隔从30秒优化到10秒
|
|
671
|
+
- 适应客户长期不在家、总线无数据的场景
|
|
672
|
+
- **日志优化**:
|
|
673
|
+
- 移除频繁的轮询日志("轮询持续运行中"、"正在轮询从站X")
|
|
674
|
+
- 轮询永久稳定运行,无需频繁确认
|
|
675
|
+
- 减少日志输出,降低硬盘占用
|
|
676
|
+
|
|
677
|
+
**v2.6.6更新**:
|
|
678
|
+
- **🔥 彻底解决MQTT日志刷屏问题**:
|
|
679
|
+
- 局域网IP检测优化:配置192.168.x.x等IP后不再尝试fallback地址
|
|
680
|
+
- 高频MQTT日志改为debug级别:broker候选、认证、重连等
|
|
681
|
+
- 默认不输出到日志文件和调试窗口
|
|
682
|
+
- 配置局域网IP后立即连接,不产生多余日志
|
|
683
|
+
- **日志输出优化**:
|
|
684
|
+
- 连接成功/失败:仍使用log(重要信息)
|
|
685
|
+
- 重连尝试、fallback地址、认证信息:改为debug(调试信息)
|
|
686
|
+
- 仅启用debug模式时才在调试窗口显示
|
|
687
|
+
- 彻底解决日志刷屏和硬盘占用问题
|
|
688
|
+
|
|
689
|
+
**v2.6.5更新**:
|
|
690
|
+
- **🔥 修复MQTT报错问题**:从站开关节点新增"启用MQTT"勾选框
|
|
505
691
|
- 默认不启用MQTT,不会尝试连接
|
|
506
|
-
- 勾选后才显示MQTT服务器配置
|
|
507
|
-
- 不会在调试窗口产生任何MQTT错误日志
|
|
508
|
-
- **更好的用户体验**:
|
|
509
|
-
- 节点拖出即可使用(无需配置MQTT)
|
|
510
|
-
- 不再有烦人的错误提示
|
|
511
|
-
- 主站和从站开关均支持MQTT可选
|
|
512
692
|
- 本地模式和MQTT模式自由切换
|
|
513
693
|
|
|
514
694
|
**v2.6.4更新**:
|
|
@@ -540,3 +720,289 @@ msg.payload = 1; // 或 0
|
|
|
540
720
|
**支持**:
|
|
541
721
|
- Issues: https://github.com/symi-daguo/node-red-contrib-symi-modbus/issues
|
|
542
722
|
- NPM: https://www.npmjs.com/package/node-red-contrib-symi-modbus
|
|
723
|
+
|
|
724
|
+
### 节点与分类(Palette)
|
|
725
|
+
|
|
726
|
+
- 侧边栏分类名:`SYMI-MODBUS`
|
|
727
|
+
- 包含节点:`modbus-master`(主站)、`modbus-slave-switch`(从站开关)、`modbus-debug`(调试)
|
|
728
|
+
- 如果未显示该分类或节点:
|
|
729
|
+
- 刷新浏览器缓存(Shift+刷新)
|
|
730
|
+
- 重启 Node-RED(如:`node-red-restart` 或系统服务方式)
|
|
731
|
+
- 在“节点管理(Manage Palette)”确认安装版本为 `v2.6.6`
|
|
732
|
+
|
|
733
|
+
### 调试节点(modbus-debug)使用要点
|
|
734
|
+
|
|
735
|
+
- 数据来源选择:`sourceType = serial`(共享串口)或 `modbus`(独立服务器)
|
|
736
|
+
- 共享串口:需要选择并关联一个 `serial-port-config` 配置节点
|
|
737
|
+
- 独立服务器:需要选择并关联一个 `modbus-server-config` 配置节点
|
|
738
|
+
- HEX显示:可选大写、可选时间戳、`maxBytes` 控制显示长度
|
|
739
|
+
- 输出:`msg.payload`(格式化HEX)、`msg.buffer`(原始Buffer)、`msg.meta`(来源信息)
|
|
740
|
+
|
|
741
|
+
### v2.6.6 重要更新
|
|
742
|
+
|
|
743
|
+
- 调试节点配置验证修复:根据所选数据来源类型(`serial`/`modbus`)动态校验,避免误报为“配置不正确”
|
|
744
|
+
- 统一侧边栏分类:所有节点统一归类到 `SYMI-MODBUS`
|
|
745
|
+
- 文档更新:补充节点分类、调试节点要点与常见问题处理
|
|
746
|
+
|
|
747
|
+
典型用法:
|
|
748
|
+
- 联调TCP转RS485网关时,观察上行/下行原始数据帧是否完整。
|
|
749
|
+
- 排查波特率/数据位/校验位配置是否正确(串口模式)。
|
|
750
|
+
- 与 `modbus-master` 或 `modbus-slave-switch` 同时使用,定位现场设备通信异常。
|
|
751
|
+
|
|
752
|
+
### MQTT自动发现
|
|
753
|
+
|
|
754
|
+
启用MQTT后,自动生成Home Assistant兼容的Discovery配置:
|
|
755
|
+
- **唯一性保证**:每个实体使用稳定的`unique_id`,避免重复生成
|
|
756
|
+
- **设备分组**:同一从站的所有继电器自动分组到一个设备下
|
|
757
|
+
- **状态持久化**:使用`retain=true`确保状态持久化
|
|
758
|
+
- **在线状态**:自动发布设备可用性状态
|
|
759
|
+
|
|
760
|
+
### 配置持久化
|
|
761
|
+
|
|
762
|
+
所有节点配置自动保存到Node-RED的flows文件中:
|
|
763
|
+
- 从站地址、线圈范围、轮询间隔
|
|
764
|
+
- MQTT服务器配置
|
|
765
|
+
- 开关面板映射关系
|
|
766
|
+
|
|
767
|
+
部署后配置永久生效,重启Node-RED后自动恢复。
|
|
768
|
+
|
|
769
|
+
### 长期稳定运行
|
|
770
|
+
|
|
771
|
+
针对工控机24/7长期运行优化:
|
|
772
|
+
- **内存管理**:自动清理缓存,释放无用对象
|
|
773
|
+
- **事件监听器清理**:关闭时移除所有监听器,防止内存泄漏
|
|
774
|
+
- **智能日志限流**:错误日志10分钟输出一次,避免日志刷屏
|
|
775
|
+
- **智能重连机制**:
|
|
776
|
+
- Modbus连接断开自动重连(指数退避:5秒→10秒→20秒...最大60秒)
|
|
777
|
+
- MQTT连接断开自动重连(支持多地址fallback)
|
|
778
|
+
- 串口拔插自动检测并重连
|
|
779
|
+
- TCP网络故障自动恢复
|
|
780
|
+
- 连接前彻底清理旧实例,避免资源泄漏
|
|
781
|
+
- **互斥锁机制**:防止读写冲突导致的数据异常
|
|
782
|
+
- **TCP永久连接**:
|
|
783
|
+
- 禁用TCP超时(永久连接),避免无数据时超时断开
|
|
784
|
+
- Keep-Alive心跳10秒间隔,确保连接活跃
|
|
785
|
+
- 适应客户长期不在家、总线无数据的场景
|
|
786
|
+
- 网络故障自动重连,恢复后立即恢复通信
|
|
787
|
+
|
|
788
|
+
## 技术规格
|
|
789
|
+
|
|
790
|
+
### Modbus协议
|
|
791
|
+
|
|
792
|
+
- **协议类型**:Modbus TCP / Modbus RTU
|
|
793
|
+
- **底层库**:modbus-serial ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
794
|
+
- **功能码支持**:0x01(读线圈)、0x05(写单个线圈)、0x0F(写多个线圈)
|
|
795
|
+
- **从站地址范围**:1-247(建议从10开始)
|
|
796
|
+
- **线圈数量**:每台设备32个(0-31)
|
|
797
|
+
- **最大设备数**:10台同时轮询
|
|
798
|
+
- **轮询间隔**:默认200ms(建议300-500ms,支持100-10000ms)
|
|
799
|
+
- **串口配置**:9600 8-N-1(波特率9600,8数据位,无校验,1停止位)
|
|
800
|
+
- **超时设置**:5000ms(TCP和串口通用)
|
|
801
|
+
|
|
802
|
+
### 兼容性
|
|
803
|
+
|
|
804
|
+
- **Node.js**: >= 14.0.0
|
|
805
|
+
- **Node-RED**: >= 2.0.0
|
|
806
|
+
- **MQTT Broker**: Mosquitto / EMQX / Any MQTT 3.1.1/5.0
|
|
807
|
+
- **Home Assistant**: 2024.x+(MQTT Discovery标准)
|
|
808
|
+
- **操作系统**: Windows / Linux / macOS / HassOS
|
|
809
|
+
|
|
810
|
+
## Home Assistant集成
|
|
811
|
+
|
|
812
|
+
### 自动发现
|
|
813
|
+
|
|
814
|
+
启用MQTT后,设备自动出现在Home Assistant中:
|
|
815
|
+
- 实体ID: `switch.relay_{从站地址}_{线圈编号}`
|
|
816
|
+
- 设备名称: `Modbus继电器-{从站地址}`
|
|
817
|
+
- 自动分组: 同一从站的所有继电器分组到一个设备
|
|
818
|
+
|
|
819
|
+
### MQTT主题结构
|
|
820
|
+
|
|
821
|
+
```
|
|
822
|
+
状态主题: modbus/relay/{从站}/{线圈}/state
|
|
823
|
+
命令主题: modbus/relay/{从站}/{线圈}/set
|
|
824
|
+
可用性主题: modbus/relay/{从站}/availability
|
|
825
|
+
发现主题: homeassistant/switch/modbus_relay_{从站}_{线圈}/config
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
## 故障排除
|
|
829
|
+
|
|
830
|
+
### 串口连接失败
|
|
831
|
+
|
|
832
|
+
**Linux**:
|
|
833
|
+
```bash
|
|
834
|
+
# 查看串口设备
|
|
835
|
+
ls -l /dev/ttyUSB* /dev/ttyS*
|
|
836
|
+
|
|
837
|
+
# 添加用户到dialout组(需要重新登录)
|
|
838
|
+
sudo usermod -a -G dialout $USER
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
**macOS**:
|
|
842
|
+
```bash
|
|
843
|
+
# 查看串口设备(注意macOS使用cu.*而不是tty.*)
|
|
844
|
+
ls -l /dev/cu.*
|
|
845
|
+
```
|
|
846
|
+
|
|
847
|
+
**Docker/HassOS**:
|
|
848
|
+
```yaml
|
|
849
|
+
# 在docker-compose.yml或HassOS插件配置中添加设备映射
|
|
850
|
+
devices:
|
|
851
|
+
- /dev/ttyUSB0:/dev/ttyUSB0
|
|
852
|
+
```
|
|
853
|
+
|
|
854
|
+
### MQTT连接失败
|
|
855
|
+
|
|
856
|
+
1. 确认MQTT broker正在运行:
|
|
857
|
+
```bash
|
|
858
|
+
# Linux
|
|
859
|
+
sudo systemctl status mosquitto
|
|
860
|
+
|
|
861
|
+
# macOS
|
|
862
|
+
brew services list | grep mosquitto
|
|
863
|
+
```
|
|
864
|
+
|
|
865
|
+
2. 测试MQTT连接:
|
|
866
|
+
```bash
|
|
867
|
+
mosquitto_sub -h localhost -t test
|
|
868
|
+
```
|
|
869
|
+
|
|
870
|
+
3. 检查Node-RED日志中的MQTT连接信息
|
|
871
|
+
|
|
872
|
+
### 主站轮询不工作
|
|
873
|
+
|
|
874
|
+
1. **检查从站配置**:确认已添加所有从站设备(如10、11、12、13)
|
|
875
|
+
2. **检查轮询间隔**:默认200ms,建议300-500ms(多台从站时避免总线拥堵)
|
|
876
|
+
3. **查看Node-RED调试日志**:部署后查看日志中的轮询信息
|
|
877
|
+
4. **检查串口波特率**:确认波特率为9600(与从站设备一致)
|
|
878
|
+
5. **检查从站地址**:确认从站地址正确(1-247)
|
|
879
|
+
6. **确认从站设备在线**:使用Modbus调试工具测试从站是否响应
|
|
880
|
+
7. **检查MQTT连接**:确保MQTT broker地址正确,轮询不依赖MQTT但状态发布需要MQTT
|
|
881
|
+
8. **测试连接**:
|
|
882
|
+
- TCP连接问题:先用 `modbus-serial` 单独测试TCP连接
|
|
883
|
+
- 串口问题:先用 `serialport` 单独测试串口通信
|
|
884
|
+
|
|
885
|
+
### 从站开关无响应
|
|
886
|
+
|
|
887
|
+
1. 检查RS-485连接是否正常
|
|
888
|
+
2. 确认开关面板地址和按钮编号正确
|
|
889
|
+
3. 检查MQTT连接状态
|
|
890
|
+
4. 查看Node-RED日志中的协议解析信息
|
|
891
|
+
|
|
892
|
+
## 输入消息格式
|
|
893
|
+
|
|
894
|
+
### 主站节点
|
|
895
|
+
|
|
896
|
+
```javascript
|
|
897
|
+
// 启动轮询
|
|
898
|
+
msg.payload = {cmd: "start"};
|
|
899
|
+
|
|
900
|
+
// 停止轮询
|
|
901
|
+
msg.payload = {cmd: "stop"};
|
|
902
|
+
|
|
903
|
+
// 写单个线圈
|
|
904
|
+
msg.payload = {
|
|
905
|
+
cmd: "writeCoil",
|
|
906
|
+
slave: 10, // 从站地址
|
|
907
|
+
coil: 0, // 线圈编号
|
|
908
|
+
value: true // true=开, false=关
|
|
909
|
+
};
|
|
910
|
+
|
|
911
|
+
// 批量写多个线圈
|
|
912
|
+
msg.payload = {
|
|
913
|
+
cmd: "writeCoils",
|
|
914
|
+
slave: 10, // 从站地址
|
|
915
|
+
startCoil: 0, // 起始线圈
|
|
916
|
+
values: [true, false, true, false] // 线圈值数组
|
|
917
|
+
};
|
|
918
|
+
```
|
|
919
|
+
|
|
920
|
+
### 从站开关节点
|
|
921
|
+
|
|
922
|
+
```javascript
|
|
923
|
+
// 发送开关命令
|
|
924
|
+
msg.payload = true; // 或 false
|
|
925
|
+
msg.payload = "ON"; // 或 "OFF"
|
|
926
|
+
msg.payload = 1; // 或 0
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
## 输出消息格式
|
|
930
|
+
|
|
931
|
+
### 主站节点
|
|
932
|
+
|
|
933
|
+
```javascript
|
|
934
|
+
{
|
|
935
|
+
payload: {
|
|
936
|
+
slave: 10, // 从站地址
|
|
937
|
+
coils: [true, false, ...], // 线圈状态数组
|
|
938
|
+
timestamp: 1234567890 // 时间戳
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
### 从站开关节点
|
|
944
|
+
|
|
945
|
+
```javascript
|
|
946
|
+
{
|
|
947
|
+
payload: true, // 开关状态
|
|
948
|
+
topic: "switch_0_btn1", // 主题
|
|
949
|
+
switchId: 0, // 开关面板ID
|
|
950
|
+
button: 1, // 按钮编号
|
|
951
|
+
targetSlave: 10, // 目标从站地址
|
|
952
|
+
targetCoil: 0 // 目标线圈编号
|
|
953
|
+
}
|
|
954
|
+
```
|
|
955
|
+
|
|
956
|
+
## 性能指标
|
|
957
|
+
|
|
958
|
+
- **内存占用**:< 50MB(单个主站节点,轮询10个设备)
|
|
959
|
+
- **CPU占用**:< 5%(正常轮询状态)
|
|
960
|
+
- **连接延迟**:Modbus响应 < 100ms,MQTT发布 < 50ms
|
|
961
|
+
- **稳定运行**:经过工控机7x24小时长期运行验证
|
|
962
|
+
- **容错能力**:Modbus从站离线不影响其他从站,MQTT断线自动重连
|
|
963
|
+
|
|
964
|
+
## 示例Flow
|
|
965
|
+
|
|
966
|
+
```json
|
|
967
|
+
[
|
|
968
|
+
{
|
|
969
|
+
"id": "modbus-master-1",
|
|
970
|
+
"type": "modbus-master",
|
|
971
|
+
"name": "主站",
|
|
972
|
+
"connectionType": "serial",
|
|
973
|
+
"serialPort": "/dev/ttyUSB0",
|
|
974
|
+
"serialBaudRate": 9600,
|
|
975
|
+
"slaves": [
|
|
976
|
+
{"address": 10, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
977
|
+
{"address": 11, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
978
|
+
{"address": 12, "coilStart": 0, "coilEnd": 31, "pollInterval": 200},
|
|
979
|
+
{"address": 13, "coilStart": 0, "coilEnd": 31, "pollInterval": 200}
|
|
980
|
+
],
|
|
981
|
+
"enableMqtt": true,
|
|
982
|
+
"mqttServer": "mqtt-config-1"
|
|
983
|
+
}
|
|
984
|
+
]
|
|
985
|
+
```
|
|
986
|
+
|
|
987
|
+
## 项目信息
|
|
988
|
+
|
|
989
|
+
**版本**: v2.6.7
|
|
990
|
+
|
|
991
|
+
**核心功能**:
|
|
992
|
+
- 支持多种Modbus协议(Telnet ASCII、RTU over TCP、Modbus TCP、Modbus RTU串口)
|
|
993
|
+
- 多设备轮询(最多10台从站,每台32路继电器,轮询间隔100-10000ms可调)
|
|
994
|
+
- Symi私有协议自动识别(支持两种485开关控制方式)
|
|
995
|
+
- 智能轮询暂停机制(从站上报时自动暂停,处理完成后恢复)
|
|
996
|
+
- 🔥 **双模式支持**(本地模式和MQTT模式可选切换,断网也能稳定运行)
|
|
997
|
+
- 🔥 **免连线通信**(主站和从站通过内部事件通信,无需连线,支持本地模式和MQTT模式)
|
|
998
|
+
- MQTT集成(可选启用,Home Assistant自动发现,实体唯一性保证,QoS=0高性能发布)
|
|
999
|
+
- 物理开关面板双向同步(亖米协议支持,LED反馈同步,支持开关模式和场景模式)
|
|
1000
|
+
- 共享连接架构(多个从站开关节点共享同一个串口/TCP连接,支持500+节点)
|
|
1001
|
+
- 长期稳定运行(内存管理、智能重连、错误日志限流、异步MQTT发布、TCP永久连接)
|
|
1002
|
+
|
|
1003
|
+
**技术栈**:
|
|
1004
|
+
- modbus-serial: ^8.0.23(内部封装serialport,支持TCP和串口)
|
|
1005
|
+
- serialport: ^12.0.0(原生串口通信)
|
|
1006
|
+
- mqtt: ^5.14.1(最新稳定版,可选依赖)
|
|
1007
|
+
- Node.js: >=14.0.0
|
|
1008
|
+
- Node-RED: >=2.0.0
|