Modbus TCP/IP之异常响应

文章目录

    • 一、异常响应
    • 二、异常码分析
      • 2.1 异常码0x01
      • 2.2 异常码0x02
      • 2.3 异常码0x03
      • 2.4 异常码0x06
      • 2.5 异常码0x04、0x05等

一、异常响应

  1. 对于查询报文,存在以下四种处理反馈:
    • 正常接收,正常处理,返回正常响应报文;
    • 因为通信错误等原因,造成从站设备没有接收到查询报文,主站设备将按超时处理;
    • 从站设备接收到的查询报文存在通信错误(如:Modbus串行的LRC、CRC错误),此时从站设备将丢弃报文不响应,主站设备按超时处理;
    • 从站设备接收到正确报文,但超出处理范围,此时从站设备将返回包含异常码的响应报文。
  2. 本文将围绕Modbus TCP/IP的异常响应进行讨论,并通过Modbus Slave和Poll进行举例。
  3. Modbus TCP/IP正常响应的常用功能码格式见本文:Modbus协议在TCP/IP上的运用
  4. 正常响应和异常响应最大的区别是从功能码开始的,异常响应的功能码为:正常功能码+0x80,然后跟一个占1字节的异常码,其目的是通知客户机异常原因。
    Modbus TCP/IP之异常响应_第1张图片

二、异常码分析

下面是针对几种异常码的介绍。

2.1 异常码0x01

  1. 概念:0x01异常码,即非法功能码。对于服务器(从站)来说,询问中收到的功能码是不可允许的操作,即从站设备不支持此功能码。
  2. 例子:主站发出功能码为0x03的报文,但从站支持0x04功能码。
  3. Modbus Poll配置
    Modbus TCP/IP之异常响应_第2张图片
    图1. Modbus Poll的connection配置

Modbus TCP/IP之异常响应_第3张图片

图2. Modbus Poll的setUp配置

  1. Modbus Slave配置
    Modbus TCP/IP之异常响应_第4张图片
    图3. Modbus Slave的connection配置

Modbus TCP/IP之异常响应_第5张图片

图4. Modbus Slave的setUp配置
  1. 通信结果
    Modbus TCP/IP之异常响应_第6张图片

    图5. 通信结果

  2. 结果分析:salve和poll连接后,poll报错Illegal Function,即非法功能码。再打开通信展示,对接收报文进行分析,其功能码为0x83=0x03+0x80,后再跟一字节的异常码0x01

2.2 异常码0x02

  1. 概念:0x02异常码,即非法数据地址。对于服务器(从站)来说,询问中收到的数据地址是不可允许的地址,即指定的数据地址在从站设备中不存在。特别是,起始地址和读取数量的组合是无效的。比如:对带有100个寄存器的slave来说,带有起始地址96和读取数量4的请求会成功,但带有起始地址96和读取数量5的请求将产生异常码02。

  2. 例子:poll和slave的配置如2.1中的操作,但把poll的功能码改为0x04,把quantity改为15。如下图:
    Modbus TCP/IP之异常响应_第7张图片

    图6. poll的setUp配置

  3. 通信结果
    Modbus TCP/IP之异常响应_第8张图片

    图7. 通信结果

  4. 结果分析:salve和poll连接后,poll报错Illegal Data Address,即非法数据地址。再打开通信展示,对接收报文进行分析,其功能码为0x84=0x04+0x80,后再跟一字节的异常码0x02

2.3 异常码0x03

  1. 概念:0x03异常码,即非法数据值。对于服务器(从站)来说,询问中包括的值是不可允许的值,即指定的数据超过范围或不允许使用。当主机软件发送一个写入请求时,如果请求中的数据值无效或超出从机设备可接受的范围,从机会返回错误码0x02。这表示主机发送了一个无效的数据值,从机无法接受并处理该数据。

  2. 例子:poll和slave的配置如2.2中的操作,但把poll的quantity改回10,把poll第一个寄存器(编号0)显示设为有符整型,Signed;把slave对应的寄存器(编号0)显示设为有符整型,Signed。通过导航栏的Dispay选择。 可以不用设置,默认就是这个。我只是提一下修改显示的步骤。
    Modbus TCP/IP之异常响应_第9张图片

    图8. Display

  3. 在slave的该寄存器中写值32768时,无法写出去。因为超出了数值范围,是无效数。我认为可能和软件机制有关,为了避免了这种错误,所以超出范围的无效值不允许发送。不过,这个错误码是我根据概念解释自己理解和模拟的,如果有错误的地方或者其他意见欢迎讨论。
    Modbus TCP/IP之异常响应_第10张图片

图9. 错误提示

2.4 异常码0x06

  1. 概念:0x06异常码,即从属设备忙。与编程命令一起使用。服务器正在处理长持续时间的程序命令。当服务器空闲时,客户机稍后重新传输保文。

  2. 例子:poll和slave的配置如2.1中的操作,但poll和slave的功能码统一为0x03。然后在slave中选择”setUp->slave definition“,并勾选弹窗中的Return exception 06, Busy,即返回设备繁忙状态。这是slave的故障模拟功能。配置如下:
    Modbus TCP/IP之异常响应_第11张图片

    图10. slave配置

  3. 通信结果:poll红字报错Slave Device Busy,且通信中响应报文功能码0x83=0x03+0x80,再加一个异常码0x06。
    Modbus TCP/IP之异常响应_第12张图片

    图11. poll结果显示

2.5 异常码0x04、0x05等

代码 名称
含义
0x04 从站设备故障 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。即从站设备处理响应的过程中,出现未知错误等。
0x05 确认 与编程命令一起使用。服务器已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机中发生超时错误。客户机可以继续发生轮询程序完成保文来确定是否完成处理。
0x08 存储奇偶性差错 指示扩展文件区不能通过一致性校验。
0x0A 不可用网关路径 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路劲。通常意味着网关是错误配置的或过载的。
0x0B 网关目标设备响应失败 与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。

你可能感兴趣的:(通信,tcp/ip,网络协议,网络,Modbus)