如果在验证了写入多个寄存器(0x10)请求之后但在所有写入完成之前遇到错误,Modbus设备应该如何失败? specification (6.12)在这一点似乎含糊不清,网络搜索并未证明富有成效。我看到三种可能性:
这里是否存在传统或正确的失败方式,或者设备是否因实施失败而需要仅在手册中记录?
答案 0 :(得分:1)
根据图22:specification异常代码4的第31页上的“写多个寄存器状态图”应返回,但协议本身并未指定应用层的工作方式。
您的设备失败的方式必须考虑约束和可能的副作用。例如,如果您接受某些控制命令(设定点值或仅设置分配给不同寄存器的多个输出),则最好不要直接从寄存器分配这些值,但在将值重新写入内部程序变量之前先进行一些验证用于驱动IO或影响任何控制操作。这种方法符合您列表中的选项2。
如果记录的话,您可以实现最佳效果。如果您的从站受到能够实现部分应用层的主站的控制,您也可以考虑在发生故障时支持来自从站的诊断或错误信息请求,但是没有为异常0x4指定功能代码0x10。
答案 1 :(得分:0)
由于 master 无法知道在这种部分失败的写入操作的情况下什么是成功写入的,什么不是,最合适的方法是“全有或全无”,就像您在 #2 中提到的那样。这是最难实现的路径,但它是唯一的方法,让 master 不会因为这样的错误而陷入模棱两可的状态。