广播地址的规则
在串行链路上地址 0 被保留为广播,所有从站都应处理该请求,同时按规范不得发送应答。这意味着广播只能承载写类功能,读请求用广播没有任何意义,因为没人会回答。广播节省的是总线上往返的报文数量:一次下发即可让几十个从站同时执行,但它不提供任何逐站确认,也无法只对某一个从站重试。
基本信息
| 广播地址 | 0(串行链路) |
|---|---|
| 可用功能码 | 写单个线圈、写单个寄存器、写多个线圈、写多个寄存器 |
| 不可用 | 各类读功能码、诊断类请求 |
| 应答 | 从站必须执行且不得应答 |
| 适用范围 | 单主站串行总线上有效 |
| 确认方式 | 事后逐个从站回读比对 |
典型使用场景
- 多台变频器统一下发同一频率或启停命令
- 时间同步:一次广播把统一时间写给总线上所有从站
- 采样保持、同步触发:让所有节点在同一时刻锁存数据
- 批量恢复默认参数:调试完成后一次性把通用参数写回
- 成本优化:从站数量多、单站轮询太慢时,用广播压缩总线占用
广播可用性速查
| 功能码 | 操作 | 能否广播 |
|---|---|---|
| 01 / 02 | 读线圈、读离散输入 | 不能,无从站应答 |
| 03 / 04 | 读保持、读输入寄存器 | 不能,无从站应答 |
| 05 / 06 | 写单个线圈、写单寄存器 | 可以,从站执行后静默 |
| 15 / 16 | 写多个线圈、写多寄存器 | 可以,批量下发最常用 |
| 诊断类 | 读从站状态与计数 | 看设备实现,通常不支持 |
广播写入后回读验证
广播写入后回读验证
# 广播:从站地址 0,写入 16 号寄存器为 500,不等待应答
write_register(address=0, register=16, value=500)
time.sleep(0.2) # 留出从站处理时间,具体时长看设备手册
# 逐站回读确认,把真正生效的从站列出来
for slave in range(1, 33):
v = read_register(address=slave, register=16)
print(slave, v) # 与期望值不一致的从站需要单独排查广播后立刻发下一个请求是常见错误:部分设备需要几十到几百毫秒执行写操作,广播紧接着单播读会拿到旧值,看起来像写入失败。
广播启停、广播复位这类命令对全总线同时生效,一旦误发没有逐个撤销的余地;调试期应先把从站逐个置为手动模式或断开动力回路。