1

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

  1. 尝试依次写入每个寄存器。如果发生错误立即放弃/发送异常。
  2. 将请求视为原子事务,其中应写入所有数据或不写入。
  3. 如果观察到任何失败,则尝试写入最后发送异常的所有数据。

是否有传统的或适当的方法来失败,或者设备失败的方式是特定于实现的,只需要在手册中记录?

4

2 回答 2

1

根据规范第 31 页的图 22:Write Multiple Registers 状态图应该返回异常代码 4,但协议本身并没有指定应用层应该如何工作。

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

只要记录在案,您就可以实施最有效的任何行为。如果您的从站受能够实现部分应用程序层的主站控制,您还可以考虑支持从站的诊断或错误信息请求,以防发生故障,但未针对功能代码 0x10 的异常 0x4 指定此类功能。

于 2014-01-30T16:21:40.523 回答
0

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

于 2021-06-03T08:29:28.280 回答