Modbus

Modbus

简介

Modbus是一个位于应用层的消息传递协议,位于OSI模型第七层.它为连接在不同总线或者网络上的设备之间提供客户端/服务器通信.

自1979年以来,Modbus一直是业界公认的串行标准,至今仍在为数以百万计的自动化设备提供通信服务.

Modbus是一种请求应答协议,提供功能代码(Function Code)指定的服务.

目前它主要基于以下几种媒介实现:

  • TCP/IP over Ethernet.
  • Asynchronized serial transmission over a variety of media(EIA/TIA-232-E(RS-232),EIA-422,EIA/TIA-485-A(RS-485),光纤,无线广播等).
  • Modbus PLUS,高速令牌传递网络.
    备注: Modbus在TCP/IP协议栈上的保留端口为502.

Modbus通信协议栈

Modbus网络架构

协议描述

协议组成

Modbus定义了一个简单,独立于通信层的协议数据单元(PDU).Modbus协议在特定总线或者网络上的实现,可以在应用数据单元(ADU)中引入额外的字段.一般的Modbus数据帧如下图所示:

PDU

PDU由功能码(Function Code),数据组成:

  • 功能码指明了服务器应该执行何种操作.它被编码为1个字节,取值范围为[1,255]的整数(其中128-255被保留,作为异常码使用),在一些功能码中添加子功能码(子功能代码位于数据字段内),可以为一个功能码定义多个操作.
  • 数据是客户端传递给服务端为执行执行功能码指定操作的附带信息,可以是离散地址,寄存器地址,要处理项的数量等.在某些类型的请求中,数据字段可能不存在.

PDU的最大值为256字节,这个最大值受限于第一个modbus在串口网络的实现(max RS485 ADU = 256 bytes)

因此:

1
Modbus PDU for serial line communication = 256 - Server address (1 byte) - CRC(2 bytes) = 253 bytes

故而

1
2
RS232/RS485 ADU = 253 + Server Address (1 byte) + CRC (2 bytes) = 256 bytes
TCP Modbus ADU = 253 bytes + MBAP( 7 bytes ) = 260 bytes

Modbus 一共定义了三种PDU

  • Modbus Request PDU, mb_req_pdu.
  • Modbus Response PDU, mb_rsp_pdu.
  • Modbus Exception Response PDU, md_excep_rsp_pdu.
Modbus Request PDU

由功能码 + 请求数据组成:
功能码: 1个字节,
请求数据: n个字节,可取值:变量引用,变量数量,数据偏移,子功能代码等.

Modbus Response PDU

由功能码 + 响应数据组成:
功能码: 1个字节,
响应数据: n个字节,可取值:变量引用,变量数量,数据偏移,子功能代码等.

Modbus Exception Response PDU

由异常功能码 + 请求数据组成:
异常代码: 1个字节,是功能代码+0x80.

ADU

ADU(Modbus Frame with Serial Transmission)

基于串口通信的ADU由设备地址(1 bytes),PDU(253 bytes),错误校验组成(2 bytes).

ADU(Modbus Frame With TCP/IP Transmission)

基于TCP/IP实现的ADU由MBAP(7 bytes),PDU(253 bytes)组成.
MBAP由事务标识符,协议标识符,长度,单位标识符组成,如下图所示:

- 事务标识符,用于事务匹配,服务器在响应中复制客户端请求中的值.如果客户端在每次查询时生成唯一的表示符,则可以为此查询分配唯一的响应.

  • 协议标识符,由于使用Modbus协议,因此此字段始终为0.
  • 长度,数据长度,包括单位标识符(1 byte),函数代码(1 byte)和数据.
  • 单位标识符,对应基于串口通信的Modbus协议ADU中的设备地址.此字段用于内部系统路由,如果控制器不支持路由,此字段始终为0.

备注:由于TCP/IP数据链路层的校验机制保证了数据的完整性,因此Modbus TCP的报文中不再带有数据校验.

数据编码字节序

Modbus协议在发送数据时,采用与网络一样大端字节序发送数据,首先发送MSB.

Modbus数据模型

基本表 对象类型 访问类型 注释
离散量输入 单个位 只读 I/O系统可提供这种类型的数据
线圈 单个位 读写 通过应用程序可以改变这种类型的数据
输入寄存器 16位 字 只读 I/O系统可提供这种类型的数据
保持寄存器 16位 字 读写 通过应用程序可以改变这种类型数据

对于每一个基本表,协议都允许单个地选择65535个数据项.

实现示例

设备组织数据的方法有很多种,每个设备根据其应用都有自己的组织数据的方法.

  1. 示例1,含有四个独立块的设备

2. 示例2,含有单个独立块的设备

Modbus寻址模型

Modbus应用协议精确地定义了PDU寻址规则.
在Modbu PDU中,从065535寻址每一个数据.
Modbus应用协议明确地规定了由四个块构成的Modbus数据模型,每个块由几个编号为1
n的元素构成.
在Modbus数据模型中,从1~n来编号每一个元素.
Modbus数据模型和设备应用之间的映射完全与特定设备无关.

Modbus事务定义

如图所示描述了在服务侧Modbus事务处理的一般处理流程

一旦服务器处理请求,就必须使用相应的Modbus服务器事务处理生成Modbus响应.
根据处理结果,可以建立两种类型响应:

  1. 一个正常的Modbus响应:响应功能码=请求功能码
  2. 一个异常的Modbus响应:异常功能码=请求功能码 + 0x80
    用来为客户机提供处理过程中与所发现的差错相关的信息,提供异常码来表示发生差错的原因.

功能码类别

共有三类Modbus功能码,分为为:公共功能码,用户自定义功能码,保留功能码.它们的分布如下:

公共功能码

  1. 被确切定义的功能码.
  2. 保证是唯一的.
  3. 由MODBUS.org组织验证.
  4. 公开文档.
  5. 可进行一致性测试.
  6. 包含已被定义的公共功能码和保留给未来使用的功能码.

用户自定义功能码

  1. 共有两个用户自定义功能码区域,即十进制的65-72,100-110.
  2. 用户无需Modbus组织的任何批准就可以选择和实现一个功能码.
  3. 不能保证被选用的功能码的使用是唯一的.
  4. 如果用户希望将某种功能设置为一个公共功能码,那么用户必须启动RFC,以便将这种变更引入公共分类中,并且指配一个新的公共功能码.

保留功能码

某些公司在传统产品上先行使用的功能码,不作为公共使用.

公共功能码定义

参考

  1. Modbus_Application_Protocol_V1_1b3
  2. Modbus TCP通信概述
  3. 技术手册 PD4-E MODBUS TCP