Modbus TCP/IP之异常响应

一、异常响应

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

二、异常码分析

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

2.1 异常码0x01

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

在这里插入图片描述

图2. Modbus Poll的setUp配置

  1. Modbus Slave配置
    在这里插入图片描述
    图3. Modbus Slave的connection配置

在这里插入图片描述

图4. Modbus Slave的setUp配置
  1. 通信结果
    在这里插入图片描述

    图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。如下图:
    在这里插入图片描述

    图6. poll的setUp配置

  3. 通信结果
    在这里插入图片描述

    图7. 通信结果

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

2.3 异常码0x03

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

  2. 例子1:slave寄存器的数值无效,poll和slave的配置如2.2中的操作,但把poll的quantity改回10,把poll第一个寄存器(编号0)显示设为有符整型,Signed;把slave对应的寄存器(编号0)显示设为有符整型,Signed。通过导航栏的Dispay选择。 可以不用设置,默认就是这个。我只是提一下修改显示的步骤。
    在这里插入图片描述

    图8. Display

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

图9. 错误提示
  1. 例子2:请求数量超额,由于Modbus工具限制,poll、slave只能读取、发送125个寄存器。如果想把poll的quantity设为126(大于125)时,会弹出“Enter an integer between 1 and 125.”的弹框。所以使用poll和slave没法模拟该情景。但当写有一个主端程序,申请读126个寄存器值时,应答报文显示0x03的错误。因为slave只能发125个寄存器的值。

2.4 异常码0x06

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

  2. 例子:poll和slave的配置如2.1中的操作,但poll和slave的功能码统一为0x03。然后在slave中选择”setUp->slave definition“,并勾选弹窗中的Return exception 06, Busy,即返回设备繁忙状态。这是slave的故障模拟功能。配置如下:
    在这里插入图片描述

    图10. slave配置

  3. 通信结果:poll红字报错Slave Device Busy,且通信中响应报文功能码0x83=0x03+0x80,再加一个异常码0x06。
    在这里插入图片描述

    图11. poll结果显示

2.5 异常码0x04、0x05等

代码名称
含义
0x04从站设备故障当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。即从站设备处理响应的过程中,出现未知错误等。
0x05确认与编程命令一起使用。服务器已经接受请求,并且正在处理这个请求,但是需要长的持续时间进行这些操作。返回这个响应防止在客户机中发生超时错误。客户机可以继续发生轮询程序完成保文来确定是否完成处理。
0x08存储奇偶性差错指示扩展文件区不能通过一致性校验。
0x0A不可用网关路径与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路劲。通常意味着网关是错误配置的或过载的。
0x0B网关目标设备响应失败与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 编写200smart Modbus TCP通讯客户端程序需要以下几个步骤: 1. 创建TCP连接:首先,需要使用200smart智能终端与Modbus TCP服务器之间建立一个TCP连接。可以使用编程语言自带的网络库或第三方库来实现TCP连接的创建和管理。 2. 发送Modbus请求:一旦TCP连接建立成功,客户端可以通过发送Modbus请求来与Modbus TCP服务器进行通信。根据Modbus协议规范,客户端需要构建相应的Modbus请求帧,包括设备地址、功能码以及其他参数。 3. 接收Modbus响应:客户端通过TCP连接接收Modbus服务器返回的响应数据。根据Modbus协议规范,响应数据包括设备地址、功能码、数据长度以及实际的数据。 4. 解析响应数据:客户端需要解析Modbus服务器返回的响应数据,提取需要的信息。根据Modbus协议规范,可以根据不同的功能码和数据类型进行解析。 5. 关闭TCP连接:通信结束后,客户端需要关闭与Modbus TCP服务器的TCP连接,释放资源。 编写200smart Modbus TCP通讯客户端程序需要对Modbus协议有一定的了解,了解Modbus协议的各种功能码和数据类型,并能正确解析响应数据。此外,还需要熟悉TCP网络编程相关的知识,包括TCP连接的创建和管理、数据的发送和接收等。 使用合适的编程语言和相关库,按照以上步骤编写客户端程序即可实现200smart与Modbus TCP服务器之间的通讯。 ### 回答2: 编写200Smart Modbus TCP通讯客户端程序是为了实现与Modbus设备之间的通信。以下是一个简单的程序编写步骤: 1. 导入必要的库:程序需要导入能够实现Modbus TCP通信的相关库文件,例如modbus-tk库。 2. 创建Modbus主机:使用库提供的函数,创建一个Modbus主机对象,通过指定IP地址和端口号来连接与Modbus设备进行通信。 3. 建立连接:使用主机对象的连接函数,与Modbus设备建立连接。如果连接成功,返回一个连接对象。 4. 读取寄存器:使用连接对象的读取函数,指定寄存器的地址和长度,发送读取请求给Modbus设备,并接收响应数据。 5. 写入寄存器:使用连接对象的写入函数,指定寄存器的地址和值,发送写入请求给Modbus设备,并接收响应数据。 6. 关闭连接:使用连接对象的关闭函数,关闭与Modbus设备的连接。 7. 处理异常:在程序中添加异常处理机制,以提高程序的稳定性并防止程序崩溃。 8. 其他功能:根据需要,可能需要添加其他功能,如批量读写寄存器、订阅通知等。 以上是一个基本的200Smart Modbus TCP通讯客户端程序的编写步骤。根据实际需求,可能还需要进行更详细的编码和配置,如设置超时时间、处理不同类型的寄存器等。 ### 回答3: 编写200smart的Modbus TCP通讯客户端程序需要以下几个步骤: 1. 导入相关库:首先,需要导入相应的库来实现Modbus通讯功能,例如Python的pymodbus库。可以使用pip安装该库。 2. 创建Modbus TCP客户端对象:使用pymodbus库中的ModbusClient方法来创建一个Modbus TCP的客户端对象。需要指定要连接的服务器的IP地址和端口号。 3. 连接到Modbus服务器:使用客户端对象的connect()方法来连接到Modbus服务器。可以对连接是否成功进行判断,并作出处理。 4. 发送Modbus请求:通过调用相关方法来发送Modbus请求,例如读取寄存器的值或者写入寄存器的值。在发送请求之前,需要指定请求的目标设备ID,寄存器地址和长度等参数。 5. 处理Modbus响应:获取Modbus服务器返回的响应,并进行处理。可以判断响应的状态码是否为成功,如果出现错误可以进行相应的处理。 6. 断开与Modbus服务器的连接:使用客户端对象的close()方法来断开与Modbus服务器的连接,释放资源。 7. 错误处理:在程序中添加相应的错误处理机制,例如捕获异常,并输出相应的错误信息。 需要注意的是,具体编写200smart的Modbus TCP通讯客户端程序还需要根据具体的业务需求来进行相关的配置和处理,例如指定寄存器的类型和长度,定义报文格式等。同时,还可以根据需要添加其他功能,例如定时读写数据或者与其他设备进行通讯等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值