Modbus(0x10)写入多个寄存器(如果有)的正确故障模式是什么?

时间:2013-08-19 17:38:22

标签: modbus

如果在验证了写入多个寄存器(0x10)请求之后但在所有写入完成之前遇到错误,Modbus设备应该如何失败? specification (6.12)在这一点似乎含糊不清,网络搜索并未证明富有成效。我看到三种可能性:

  1. 尝试依次写入每个寄存器。如果发生错误,立即放弃/发送异常。
  2. 将请求视为原子事务,其中应写入所有数据或不写入任何数据。
  3. 如果发现任何故障,尝试写入发送异常的所有数据。
  4. 这里是否存在传统或正确的失败方式,或者设备是否因实施失败而需要仅在手册中记录?

2 个答案:

答案 0 :(得分:1)

根据图22:specification异常代码4的第31页上的“写多个寄存器状态图”应返回,但协议本身并未指定应用层的工作方式。

您的设备失败的方式必须考虑约束和可能的副作用。例如,如果您接受某些控制命令(设定点值或仅设置分配给不同寄存器的多个输出),则最好不要直接从寄存器分配这些值,但在将值重新写入内部程序变量之前先进行一些验证用于驱动IO或影响任何控制操作。这种方法符合您列表中的选项2。

如果记录的话,您可以实现最佳效果。如果您的从站受到能够实现部分应用层的主站的控制,您也可以考虑在发生故障时支持来自从站的诊断或错误信息请求,但是没有为异常0x4指定功能代码0x10。

答案 1 :(得分:0)

由于 master 无法知道在这种部分失败的写入操作的情况下什么是成功写入的,什么不是,最合适的方法是“全有或全无”,就像您在 #2 中提到的那样。这是最难实现的路径,但它是唯一的方法,让 master 不会因为这样的错误而陷入模棱两可的状态。