跳到主要内容

Modbus 异常响应

前面 Modbus 功能码 中提到,对于广播模式以外的查询报文,如果一切正常,从站设备会返回一个正常响应报文。但是,如果出现差错,会怎么办呢?—— 没错,从站设备会返回异常响应报文。

异常响应

通常来说,在 Modbus 主设备(客户端)和从设备(服务器)的通信过程中,存在以下 4 种处理反馈:

  • 正常接收,正常处理,返回正常响应报文。
  • 因为通信错误等原因,造成从站设备没有接收到查询报文,主站设备将按超时处理。
  • 从站设备接收到查询报文,但报文存在错误(例如 LRC、CRC 错误等),从站设备将丢弃报文不响应,主站设备将按超时处理。
  • 从站设备接收到正确的报文,但是超过处理范围(例如不存在的功能码或者寄存器等),从站设备将按返回包含异常码(Exception Code)的响应报文。

下图大致展示了 Modbus 的查询报文、正常响应报文和异常响应报文的帧格式。

异常功能码

异常响应报文由从站地址、功能码以及异常码构成。其中,功能码与正常响应报文不同,在异常响应报文中,功能码最高位(即 MSB)被设置为 1。

因为 Modbus 协议中功能码占用一个字节,因此可以用如下表达式描述正常功能码和异常功能码的关系:

异常功能码 = 正常功能码 + 0x80

异常帧

与正常报文类似,从设备给主设备回复的异常报文也包含 4 个域:

定义大小(RTU 格式)描述
1从设备号(地址)1 个字节从设备的唯一地址,1-247
2异常功能码1 个字节请求功能码 + 128(0x80)
3异常数据n 个字节异常码(看下面说明)
4校验和2 个字节CRC 校验和(ASCII 为 LRC)

异常数据域通常存放异常码,至于返回什么异常码则依赖于此次通信发生了何种错误。

下表列出了 Modbus 协议中常见的异常码。

异常码名称描述
01 (0x01)非法功能码从站设备不支持此功能码。
02 (0x02)非法数据地址指定的数据地址在从站设备中不存在。
03 (0x03)非法数据值指定的数据超过范围或者不允许使用。
04 (0x04)从站设备故障从站设备处理响应的过程中,出现未知错误等。
05 (0x05)确认从站设备已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。
06 (0x06)从站设备忙从站设备正在处理长持续时间的程序命令。
07 (0x07)否定确认从站设备无法执行主站设备发送的请求。
08 (0x08)存储奇偶性差错指示扩展文件区不能通过一致性校验。
10 (0x0A)不可用的网关路径与网关一起使用,指示网关不能为处理请求分配输入端口值输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。
11 (0x0B)网关目标设备响应失败与网关一起使用,指示没有从目标设备中获得响应,通常意味着设备未在网络中。