文章目录
- 一、异常响应
- 二、异常码分析
- 2.1 异常码0x01
- 2.2 异常码0x02
- 2.3 异常码0x03
- 2.4 异常码0x04、0x05等
一、异常响应
- 对于查询报文,存在以下四种处理反馈:
- 正常接收,正常处理,返回正常响应报文;
- 因为通信错误等原因,造成从站设备没有接收到查询报文,主站设备将按超时处理;
- 从站设备接收到的查询报文存在通信错误(如:Modbus串行的LRC、CRC错误),此时从站设备将丢弃报文不响应,主站设备按超时处理;
- 从站设备接收到正确报文,但超出处理范围,此时从站设备将返回包含异常码的响应报文。
- 本文将围绕Modbus TCP/IP的异常响应进行讨论,并通过Modbus Slave和Poll进行举例。
- Modbus TCP/IP正常响应的常用功能码格式见本文:Modbus协议在TCP/IP上的运用
- 正常响应和异常响应最大的区别是从功能码开始的,异常响应的功能码为:
正常功能码+0x80
,然后跟一个占1字节的异常码,其目的是通知客户机异常原因。
二、异常码分析
下面是针对几种异常码的介绍。
2.1 异常码0x01
- 概念:0x01异常码,即非法功能码。对于服务器(从站)来说,询问中收到的功能码是不可允许的操作,即从站设备不支持此功能码。
- 例子:主站发出功能码为0x03的报文,但从站支持0x04功能码。
- Modbus Poll配置:
图1. Modbus Poll的connection配置
- Modbus Slave配置:
图3. Modbus Slave的connection配置
-
通信结果:
图5. 通信结果 -
结果分析:salve和poll连接后,poll报错
Illegal Function
,即非法功能码。再打开通信展示,对接收报文进行分析,其功能码为0x83=0x03+0x80
,后再跟一字节的异常码0x01
。
2.2 异常码0x02
-
概念:0x02异常码,即非法数据地址。对于服务器(从站)来说,询问中收到的数据地址是不可允许的地址,即指定的数据地址在从站设备中不存在。特别是,起始地址和读取数量的组合是无效的。比如:对带有100个寄存器的slave来说,带有起始地址96和读取数量4的请求会成功,但带有起始地址96和读取数量5的请求将产生异常码02。
-
例子:poll和slave的配置如2.1中的操作,但把poll的功能码改为0x04,把quantity改为15。如下图:
图6. poll的setUp配置 -
通信结果:
图7. 通信结果 -
结果分析:salve和poll连接后,poll报错
Illegal Data Address
,即非法数据地址。再打开通信展示,对接收报文进行分析,其功能码为0x84=0x04+0x80
,后再跟一字节的异常码0x02
。
2.3 异常码0x03
-
概念:0x03异常码,即非法数据值。对于服务器(从站)来说,询问中包括的值是不可允许的值,即指定的数据超过范围或不允许使用。当主机软件发送一个写入请求时,如果请求中的数据值无效或超出从机设备可接受的范围,从机会返回错误码0x02。这表示主机发送了一个无效的数据值,从机无法接受并处理该数据。
-
例子:poll和slave的配置如2.2中的操作,但把poll的quantity改回10,把poll第一个寄存器(编号0)显示设为有符整型,Signed;把slave对应的寄存器(编号0)显示设为有符整型,Signed。通过导航栏的
Dispay
选择。 可以不用设置,默认就是这个。我只是提一下修改显示的步骤。
图8. Display -
在slave的该寄存器中写值
32768
时,无法写出去。因为超出了数值范围,是无效数。我认为可能和软件机制有关,为了避免了这种错误,所以超出范围的无效值不允许发送。不过,这个错误码是我根据概念解释自己理解和模拟的,如果有错误的地方或者其他意见欢迎讨论。
2.4 异常码0x04、0x05等
代码 | 名称 | |
---|---|---|
0x04 | 从站设备故障 | 当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。即从站设备处理响应的过程中,出现未知错误等。 |
0x05 | 确认 | 与编程命令一起使用。服务器已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机中发生超时错误。客户机可以继续发生轮询程序完成保文来确定是否完成处理。 |
0x06 | 从属设备忙 | 与编程命令一起使用。服务器正在处理长持续时间的程序命令。当服务器空闲时,客户机稍后重新传输保文。 |
0x08 | 存储奇偶性差错 | 指示扩展文件区不能通过一致性校验。 |
0x0A | 不可用网关路径 | 与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路劲。通常意味着网关是错误配置的或过载的。 |
0x0B | 网关目标设备响应失败 | 与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。 |