Modbus 写入超时后要不要重发:怎样避免动作重复
Modbus写入超时意味着客户端没有及时确认结果,不能推出设备没有执行。目标值设置可在回读后决定重试;脉冲、计数或动作触发类寄存器应先按设备定义确认副作用。
适用条件与证据边界
应用规范1.1b3规定写单寄存器等响应格式,但不提供所有设备业务动作的去重保证。演示用离线状态机模拟响应被丢弃,没有实际写任何现场设备。
本文交付可执行的测试方法、合成演示和空白记录表;未连接现场硬件,未取得设备实测、现场照片或稳定性结论。规范定义与示例判据分别说明,示例数值不能用作设备参数。
按这个顺序核对
-
将寄存器分为目标值、脉冲动作和无法回读三类,记录写入完成后的确认接口。不要把功能码相同理解为副作用相同。
-
用模拟器接收一次写请求并执行,但在返回客户端前丢弃回包。记录服务端动作次数和客户端超时。
-
目标值类先回读,已达目标则不重发;触发类核对动作计数或设备任务编号,无法确认时转人工处理。
-
再模拟请求根本没到达和异常响应,比较处理路径。若要重试,沿用上层业务编号并在日志中关联原请求。
输入与期望结果(合成演示)
| 用例 | 服务器执行 | 客户端所见 | 下一步 |
|---|---|---|---|
| 回包丢失 | 已执行一次 | 超时 | 查询结果 |
| 请求未达 | 未执行 | 超时 | 仍需判别 |
| 写触发计数 | 可能已加1 | 超时 | 核对计数,禁止盲发 |
夹具包含“已执行但没应答”的明确分支,离线演示在回读值等于目标时返回不重发。这个判断不能移植到无回读或自清零寄存器。
下载夹具并复用
下载本题JSON夹具与空白工作表。文件中的“演示输入”用于先核对判断逻辑,“现场空白记录”供复制后填写;原演示数据请保留,实测数据另存一份并标注型号、版本和采集时间。可先用 python -m json.tool fixture.json 检查结构,再按上表逐行核对输入与预期。
通过代理丢包时要明确丢的是应用响应、连接还是全部流量;否则无法证明“请求已经执行”。现场无法安全制造丢包时,用模拟器完成接收逻辑测试,再将真实设备的确认能力列为未验证。最终验收看设备动作次数,而不是客户端重试按钮有没有被点亮。
容易误判的边界
Modbus TCP的Transaction ID用于请求响应关联,不是跨重连的设备动作去重键。查询值一致也可能是另一个客户端改的,应结合时间、业务意图及设备记录。
继续核对
基础说明见Modbus 读取数据总是卡顿不连续:轮询节奏与超时怎么配;还可核对Modbus TCP 网关后的从站号填多少:怎样核对 Unit ID。相关资料可从串口与 Modbus 对接专题继续查找;需要核对项目实现时,按SoftControl 设备联动需求列出具体接口与验收条件。
一级依据
核对日期:2026-10-23。引用版本用于界定本文方法,实际设备支持范围仍须与对应型号手册核对。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。