串行链路和 TCP/IP 上的 MODBUS 介绍

1.范围

MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备 之间提供客户机/服务器通信。
自从 1979 年出现工业串行链路的事实标准以来,MODBUS 使成千上万的自动化设备能够通信。 目前,继续增加对简单而雅观的 MODBUS 结构支持。互联网组织能够使 TCP/IP 栈上的保留系统端 口 502 访问 MODBUS。
MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是 MODBUS 请求/应答 PDU 的元素。

图 1:MODBUS 通信栈

2.背景概要

MODBUS 协议允许在各种网络体系结构内进行简单通信。

图 2:MODBUS 网络体系结构的实例

每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用 MODBUS 协议来启动远程操作。

在基于串行链路和以太 TCP/IP 网络的 MODBUS 上可以进行相同通信。 一些网关允许在几种使用 MODBUS 协议的总线或网络之间进行通信。

3.总体描述

3.1协议描述

MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。

图 3:通用 MODBUS 帧

启动 MODBUS 事务处理的客户机创建 MODBUS 应用数据单元。功能码向服务器指示将执行哪

种操作。
MODBUS 协议建立了客户机启动的请求格式。
用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。 向一些功能码加入子功能码来定义多项操作。

从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。 在某种请求中,数据域可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息。功

能码仅说明操作。如果在一个正确接收的 MODBUS ADU 中,不出现与请求 MODBUS 功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求 MODBUS 功能有关的差错,那么域包 括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。

例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数 据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称 为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。

图 4:MODBUS 事务处理(无差错)

对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑 。

图 5 MODBUS 事务处理(异常响应)

注释:需要管理超时,以便明确地等待可能不会出现的应答。

串行链路上第一个 MODBUS 执行的长度约束限制了 MODBUS PDU 大小(最大 RS485ADU=256 字节)。

因此,对串行链路通信来说,MODBUS PDU=256-服务器地址(1 字节)-CRC(2 字节)=253 字节。

从而:
RS232 / RS485 ADU = 253 字节+服务器地址(1 byte) + CRC (2 字节) = 256 字节。 TCP MODBUS ADU = 249 字节+ MBAP (7 字节) = 256 字节。

MODBUS 协议定义了三种 PDU。它们是:
l MODBUS 请求 PDU,mb_req_pdu
l MODBUS 响应 PDU,mb_rsp_pdu
l MODBUS 异常响应 PDU,mb_excep_rsp_pdu 定义 mb_req_pdu 为:mb_req_pdu = { function_code, request_data},其中
function_code - [1 个字节] MODBUS 功能码request_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义 mb_rsp_pdu 为:mb_rsp_pdu = { function_code, response_ data},其中
function_code - [1 个字节] MODBUS 功能码response_data - [n 个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。
定义 mb_excep_rsp_pdu 为:mb_excep_rsp_pdu = { function_code, request_data},其中 function_code - [1 个字节] MODBUS 功能码 + 0x80 exception_code - [1 个字节],在下表中定义了 MODBUS 异常码。

3.2数据编码

MODBUS 使用一个‘big-Endian’ 表示地址和数据项。这意味着当发射多个字节时,首先发 送最高有效位。例如:

寄存器大小 值16 – 比特 0x1234 发送的第一字节为 0x12 然后 0x34

3.3MODBUS 数据模型

MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:

基本表格

对象类型

访问类型

内容

离散量输入

单个比特

只读

I/O 系统提供这种类型数据

线圈

单个比特

读写

通过应用程序改变这种类型数据

输入寄存器

16-比特字

只读

I/O 系统提供这种类型数据

保持寄存器

16-比特字

读写

通过应用程序改变这种类型数据

输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果 这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四 个表格全部覆盖了另外一个表格。

对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操 作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。很显然,必须将通过 MODBUS 处理的所有数据放置在设备应用存储器中。但是,存储器的物 理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。

MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引。 MODBUS 模型实现的实例 下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述

出来。每个设备根据其应用都有它自己的数据结构。

3.4MODBUS 事务处理的定义

下列状态图描述了在服务器侧 MODBUS 事务处理的一般处理过程。

图 8:MODBUS 事务处理的状态图

一旦服务器处理请求,使用合适的 MODBUS 服务器事务建立 MODBUS 响应。 根据处理结果,可以建立两种类型响应:

一个正 MODBUS 响应:

● 响应功能码 = 请求功能码
一个 MODBUS 异常响应:

用来为客户机提供处理过程中与被发现的差错相关的信息;

响应功能码 = 请求功能码 + 0x80;
提供一个异常码来指示差错原因。

Jinming

95后典型金牛座,强迫症。

相关推荐

暂无评论

小程序 小程序
小程序