【ModBus进阶日记】①ModBus协议栈解析

2023-12-13 13:40:40

关注+星标公众号,不错过精彩内容
在这里插入图片描述



前言

本专栏包括Modbus协议的基础、如何使用Modbus协议进行设备间通信、如何读写寄存器、如何处理异常情况等。包含一些实际应用、案例和一些Modbus开源项目和各种程序代码、工具箱、模拟器和调试工具。

本章详细介绍了ModBus RTU协议栈、协议栈处理流程、异常处理、使用注意事项等实际开发过程中可能遇到的实际问题。


一、ModBus简介

Modbus是由 Modicon (现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。

ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。

为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给IDA (Interface for Distributed Automation,分布式自动化接口) 组织,并成立了Modbus-IDA 组织,为Modbus今后的发展奠定了基础。

《基于Modbus协议的工在中国,Modbus已经成为国家标准,标准编号: GB/T19582-2008,标准名称:业自动化网络规范》,分 3 个部分:

  1. 《GB/T 19582.1-2008 第 1 部分: Modbus 应用协议》
  2. 《GB/T 19582.2-2008 第 2 部分: Modbus 协议在串行链路上的实现指南》
  3. 《GB/T 19582.3-2008 第 3 部分: Mdbus 协议在 TCP/IP 上的实现指南》

二、ModBus协议概述

2.1 ModBus RTU主机框架

在这里插入图片描述

2.2 ModBus RTU从机框架

从机的核心就是等待主机消息并应答回复。
在这里插入图片描述

按照7层OSI通信模型,ModBus标准包括应用层、数据链路层和物理层:
在这里插入图片描述
Modbus串行链路协议是一个主/从协议。该协议位于 OSI 模型的第二层。

一个主从类型的系统有一个向某个“子”节点发出显式命令并处理响应的节点(主节点)。典型的子节点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。

在物理层,Modbus串行链路系统可以使用不同的物理接口(RS485、RS232)。最常用的是TIA/EIA-485(RS485) 两线制接口。

Modbus的主节点以两种模式对子节点发出Modbus请求: 单播模式(子节点地址1 ~ 247) 和广播模式(地址0)。虽然Modbus寻址空间有256个不同地址,但是248 ~ 255是保留地址,不能使用。

三、ModBus帧描述

《Modbus 应用协议》定义了简单的协议数据单元(PDU - Protocol Data Unit):
在这里插入图片描述
发起Modbus事务处理的客户端构造Modbus PDU,然后添加附加的域以构造应用数据单元,即 ADU在RS232和RS485链路中,ADU最大为256 bytes。
在这里插入图片描述
其中:

  1. 地址域只有子节点地址。
  2. 功能码指明服务器要执行的动作。功能码后面可跟有表示含有请求和响应参数的数据域。
  3. 数据是与功能码相关的具体数据。
  4. 错误检验域是对报文内容执行"几余校验”的计算结果,根据不同的传输模式(RTU or ASCII)使用两种不同的计算方法。

四、ModBus RTU模式的报文断帧

由发送设备将Modbus报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新顿,并且知道何时报文结束,不完整的报文必须能够被检测到而错误标志必须作为结果被设置。

在 RTU 模式,报文由时长至少为 3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作 t3.5。
在这里插入图片描述
整个报文顿必须以连续的字符流发送。如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文被认为不完整应该被接收节点丢弃。
在这里插入图片描述
RTU 接收驱动程序的实现,由于t1.5 和 t3.5 的定时,隐含着大量的对中断的管理。在高通信速率下,这导致 CPU 负担加重。因此,在通信速率等于或低于 19200 bps 时,这两个定时必须严格遵守。

对于波特率大于 19200 bps 的情形,应该使用 2 个定时的固定值:

  1. 建议的字符间超时时间(t1.5)为 750us
  2. 顿间的超时时间(t1.5) 为 1750ms。

五、ModBus字节序

ModBus的地址和数据项均采用大端字节序,即先发高字节再发低字节。

ModBus以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
在这里插入图片描述

六、ModBus事务处理流程

下图描述了在服务器侧ModBus事务处理的一般处理过程
在这里插入图片描述
一旦服务器处理请求,使用合适的ModBus服务器事务建立ModBus响应。根据处理结果,可以建立两种类型响应:

  1. 一个正确的ModBus响应: 响应功码 = 请求功能能码。
  2. 一个ModBus异常响应:
    ①用来为客户机提供处理过程中与被发现的差错相关的信息。
    ②响应功能码 = 请求功能码 + 0x80。
    ③提供一个异常码来指示差错原因。

七、ModBus异常响应

当客户机设备向服务器设备发送请求时,客户机希望一个正常响应,从主站询问中出现下列四种可能事件之一:

  1. 如果服务器设备接收到无通信错误的请求,并且可以正常地处理询问,那么服务器设备将返回一个正常响应。
  2. 如果由于通信错误,服务器没有接收到请求,那么不能返回响应,客户机程序将最终处理请求的超时状态。
  3. 如果服务器接收到请求,但是检测到一个通信错误 (奇偶校验、LRC、CRC、…) ,那么不能返回响应客户机程序将最终处理请求的超时状态。
  4. 如果服务器接收到无通信错误的请求,但不能处理这个请求(例如,如果请求读一个不存在的输出或寄存器),服务器将返回一个异常响应,通知用户错误的本质特性。

异常响应报文有两个与正常响应不同的域:

  1. 功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为 0(它们的值都低于十六进制 80)。在异常响应中,服务器设置功能码的MSB 为 1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制 80。通过设置功能码的 MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。
  2. 数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。

ModBus异常码定义如下:
在这里插入图片描述

八、ModBus功能码定义

功能码分类:
ModBus有三类功能码: 公共功能码、用户自定义功能码和保留功能码:
在这里插入图片描述

  1. 公共功能码:
    ①是较好地被定义的功能码。
    ②保证是唯一的。
    ③ModBus组织可改变的。
    ④公开证明的。
    ⑤具有可用的一致性测试。
    ⑥MB IETF RFC 中证明的。
    ⑦包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。
  2. 用户定义功能码:
    ①有两个用户定义功能码的定义范围,即十进制 65 至72 和100 至110。
    ②用户没有ModBus组织的任何批准就可以选择和实现一个功能码。
    ③不能保证被选功能码的使用是唯一的。
    ④如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC(保留功能码),以便将改变引入公共分类中,并且指配一个新的公共功能码。
  3. 保留功能码:
    ①一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
    ②如果我们需要实现自定义的一些功能码,必须在 65-72 或 100-110 中进行选择。

ModBus的公共功能码定义如下:

在这里插入图片描述

九、ModBus使用注意项

  1. 对于Modbus,不推荐使用串口空闲中断,因为空闲中断是单字符超时如果串口硬件自带超时时间配置功能,可以使用。
  2. 485总线的收发切换问题,一定要正确做485状态的接收切换,如果大家是自制的485硬件自动收发,尤其要注意。:当然如果硬件自带硬件流控制也是可以的。
  3. 485硬件问题:485是差分信号,硬件上485A接485A,485B接485B。
  4. 上拉下拉电阻,终端电阻:比如没有接上拉和下拉电阻,使能DE发送后,如果没有立即发送,会有短暂的不确定态,不过时间短,不影响使用大家项目中使用,推荐接上。
    在这里插入图片描述

总结

本章详细介绍了ModBus RTU协议栈、协议栈处理流程、异常处理、使用注意事项等实际开发过程中可能遇到的实际问题。


关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

文章来源:https://blog.csdn.net/weixin_42037809/article/details/134955400
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。