【问题标题】:What is the correct response to a modbus request with too few data bytes?对数据字节太少的 modbus 请求的正确响应是什么?
【发布时间】:2014-05-08 12:55:29
【问题描述】:

在 Modbus 服务器实现中,如果服务器从客户端接收到包含太少(或没有)数据字节而无法正确解释的请求,它应该发送什么响应?

例如,modbus RTU 服务器(地址为 0x01)接收 ADU 数据报:0x01、0x01、0xE0、0xC1。在这种情况下,没有检测到物理传输层错误,地址正确,CRC 正确,功能(读取线圈)正确并在服务器上实现,但 PDU 不包含所需的起始地址或输入数量字段处理请求。

服务器是否应该假设发生了(非常罕见的)位错误并且根本不响应? 服务器是否应该将此解释为服务器不允许的“查询数据字段中的值”并以 ILLEGAL DATA VALUE 异常响应? 服务器应该做一些完全不同的事情吗?

【问题讨论】:

    标签: modbus


    【解决方案1】:

    根据我的经验,至少对于 Modbus TCP,设备往往会忽略格式错误的请求。

    【讨论】:

    • 忽略它们似乎是一种常见的做法。但是,我试图找出什么是真正正确的。 MODBUS 应用协议规范 V1.1b3 规范的第 7 节似乎建议(至少对我而言)需要异常,因为它明确指出异常不能用于指示范围问题。如果不是为了这个,它什么时候应该返回一个 ILLEGAL DATA VALUE 异常?
    • 要回答我之前评论中的问题,图 21 -“写入多个输出 (0x0F)”的状态图 - 显示如果字节计数与输出数量不匹配,则会返回此异常要写。我真的不知道它和包含错误字节数的 PDU 有什么区别。 (在这种情况下,字节计数字段本身对我来说似乎是多余的。呵呵。)
    • 在我看来,所有异常代码都是针对应用层问题定义的——基本上,规范中的所有内容都是在格式良好的请求的上下文中定义的。
    • 感谢@Kevin Herron。
    【解决方案2】:

    从规范 MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3 来看,异常(代码 3)是正确的。图 9 MODBUS Transaction 状态图清楚地表明了对格式错误消息的异常响应。

    我怀疑拒绝消息的常见响应与传输错误无法区分,然后将诱导故障客户端的实现者更正其实现。

    您建议可能是通信错误触发了这种情况,但前提是基础链接未检测到丢失的字节。除 0xFF 之外的任何字节都会将起始位引入串行通道,而 TCP/UDP 实现中丢失字节的可能性更小。

    【讨论】:

    • 您引用的流程图中“验证数据值”过程的含义不明确。规范的第 7 节。表示异常代码 3 用于“查询数据字段中包含的值不是服务器允许的值”时。但是任何函数的流程图都没有表明应该检查请求的大小,只检查其中包含的值。这是我的问题:格式错误的 PDU 似乎超出了规范的范围。
    • 我建议验证数据值同样适用于寄存器的数量,长度不匹配会导致它无效。众所周知,任何未正式指定的协议都可能包含这样的歧义。在异常代码表中,有“例如隐含长度不正确”,涵盖了这种特定情况。您是对的,各个功能的流程图没有涵盖这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多