用 ADAM-6052 学习 ModBus TCP 协议 (3) – 异常处理

目录 Content
[hide]

在前一篇文章《用 ADAM-6052 学习 ModBus TCP 协议 (1) – 读写 DO (线圈)状态》里,已经涉及到了一些异常处理的介绍,LT 觉得在这一节回顾和总结正合适。

一、如何响应请求

请求报文发出后有四种结果:

  1. 请求被服务端处理成功并给出响应
  2. 请求没有被服务端收到,因此没有响应
  3. 请求被服务端接收到但是被忽略,因此没有响应
  4. 请求被服务端接收到但是不能被正确处理,服务端返回响应异常

对于上面情况:

  1. 如果请求被服务端正确处理,服务端将返回一个正确响应。
  2. 如果请求没有被服务端收到没有响应,客户端需要做超时处理。
  3. 如果请求被服务端收到但是由于某些原因被忽略了,客户端需要做超时处理。
  4. 如果请求被服务端接收,但是不能正确处理,服务端返回一个异常相应,通知客户机错误原因(代码)。

二、异常响应

当发生异常响应时,协议会将功能码的MSB置1,并紧跟一个字节,其包含了异常码。

1. 异常响应报文

响应异常的报文长度是固定的,共9个字节,例如:

00 05 00 00 00 03 02 82 01

开始6个字节为命令头:

  • byte 0 :  事务标识符,本例为 00
  • byte 1 :  事务标识符,本例为 05
  • byte 2 :  协议标识符,通常为 00
  • byte 3 :  协议标识符,通常为 00
  • byte 4 :  后面的字节数,高字节。通常为 00,因为所有报文都小于 256 个字节
  • byte 5 :  后面的字节数,低字节。本例为 03,即 3 个字节

第7个字节开始为命令体:

  • byte 6 :  从站标识符,本例为 02
  • byte 7 :  功能码+0x80,本例为 02,即 read input,由于功能非法服务端将MSB置1
  • byte 8 :  异常码。本例为 01,即 非法功能。

2. 异常码

代码 名称 含义
1 非法功能 服务端不允许的操作

(后续会补充)

扩展阅读

Leave a Reply

Your email address will not be published. Required fields are marked *