GB/T  ××××—×××× 
欢迎来到控制中文网
http://www.cechinamag.com
前      言 
-----------串行链路和 TCP/IP 上的 MODBUS 标准介绍 
该标准包括两个通信规程中使用的 MODBUS 应用层协议和服务规范: 
·串行链路上的 MODBUS 
MODBUS 串行链路取决于 TIA/EIA 标准:232-F 和 485-A。 
·TCP/IP 上的 MODBUS 
MODBUS TCP/IP 取决于 IETF 标准:RFC793 和 RFC791 有关。 
串行链路和 TCP/IP 上的 MODBUS 是根据相应 ISO 层模型说明的两个通信规程。
下图强调指出了该标准的主要部分。绿色方框表示规范。灰色方框表示已有的国际标准
(TIA/EIA 和 IETF 标准)。 
 
 
Modbus
协 议规 范
45 页 
MODBUS 报文
传输在 TCP/IP
上的实现指南 
49 页 
MODBUS 应用层 
在 TCP/IP 上的 MODBUS 映射 
MODBUS 报 文
传输在串行链路
上的实现指南 
45 页 
串行链路主站/从站 
TCP 
IETF RFC 793 
IP 
IETF RFC 791 
以太网 II/802.3 
IEEE 802.2 
TIA/EIA-232-F 
TIA/EIA-485-A 
以太网物理层 
 
 
MODBUS 标准分为三部分。第一部分(“Modbus 协议规范”)描述了 MODBUS 事
物处理。第二部分(“MODBUS 报文传输在 TCP/IP 上的实现指南”)提供了一个有助于
开发者实现 TCP/IP 上的 MODBUS 应用层的参考信息。第三部分(“MODBUS 报文传
输在串行链路上的实现指南”)提供了一个有助于开发者实现串行链路上的 MODBUS
应用层的参考信息。 
 
 
 
0 
 
 
 
 
GB/T  ××××—×××× 
第一部分:Modbus 协议 
欢迎来到控制中文网
http://www.cechinamag.com
1 
GB/T  ××××—×××× 
第一部分:Modbus 协议 
 
1    引言 
1.1  范围 
MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备
之间提供客户机/服务器通信。 
自从 1979 年出现工业串行链路的事实标准以来,MODBUS 使成千上万的自动化设备能够通信。
目前,继续增加对简单而雅观的 MODBUS 结构支持。互联网组织能够使 TCP/IP 栈上的保留系统端
口 502 访问 MODBUS。 
MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。MODBUS 功能码是 MODBUS
请求/应答 PDU 的元素。本文件的作用是描述 MODBUS 事务处理框架内使用的功能码。 
1.2  规范性引用文件 
1.RFC791,互联网协议,Sep81 DARPA 
2.MODBUS 协议参考指南 Rev J,MODICON ,1996 年 6 月,doc#PI_MBUS_300 
MODBUS 是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客
户机/服务器通信。 
目前,使用下列情况实现 MODBUS: 
以太网上的 TCP/IP。 
各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行
传输。 
MODBUS PLUS,一种高速令牌传递网络。 
 
MODBUS 应用层 
基于 TCP 的 Modbus
TCP 
IP 
MODBUS+/HDL 
主站/从站 
以太网 II/802.3 
物理层 
EIA/TIA-232 或
EIA/TIA-485 
以太网物理层 
 
图 1:MODBUS 通信栈 
 
其它 
其它 
 
2    缩略语 
ADU     应用数据单元 
2 
 
GB/T  ×××× —×××× 
HDLC    高级数据链路控制 
HMI     人机界面 
IETF     因特网工程工作组 
I/O        输入/输出设备 
IP         互连网协议 
MAC      介质访问控制 
MB        MODBUS 协议 
MBAP    MODBUS 协议 
PDU      协议数据单元 
PLC      可编程逻辑控制器 
TCP      传输控制协议 
 
3    背景概要 
MODBUS 协议允许在各种网络体系结构内进行简单通信。 
 
MODBUS 通信 
驱动器 
PLC 
HMI 
I/O 
I/O 
PLC 
I/O 
MODBUS ON TCP/IP 
网关 
MODBUS 
ON MB+ 
I/O 
PLC 
HMI 
驱动器 
I/O 
网关 
M
O
D
B
U
S
O
N
R
S
2
3
2
 
 
 
驱动器 
网关 
 
M
O
D
B
U
S
O
N
R
S
4
8
5
 
PLC 
I/O 
I/O 
 
驱动器 
 
图 2:MODBUS 网络体系结构的实例 
 
每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用 MODBUS
协议来启动远程操作。 
在基于串行链路和以太 TCP/IP 网络的 MODBUS 上可以进行相同通信。 
一些网关允许在几种使用 MODBUS 协议的总线或网络之间进行通信。 
4    总体描述 
4.1  协议描述 
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上
的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。 
 
 
3 
GB/T  ××××—×××× 
 
ADU 
地址域 
功能码 
数据 
差错校验 
PDU 
图 3:通用 MODBUS 帧 
 
启动 MODBUS 事务处理的客户机创建 MODBUS 应用数据单元。功能码向服务器指示将执行哪
种操作。 
MODBUS 协议建立了客户机启动的请求格式。 
用一个字节编码 MODBUS 数据单元的功能码域。有效的码字范围是十进制 1-255(128-255 为
异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。 
向一些功能码加入子功能码来定义多项操作。 
从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义
的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。 
在某种请求中,数据域可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息。功
能码仅说明操作。 
如果在一个正确接收的 MODBUS ADU 中,不出现与请求 MODBUS 功能有关的差错,那么服
务器至客户机的响应数据域包括请求数据。如果出现与请求 MODBUS 功能有关的差错,那么域包
括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。 
例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数
据内容。 
当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称
为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。 
 
客户机 
服务器 
启动请求 
接收响应 
功能码 
数据请求 
执行操作 
启动响应 
图 4:MODBUS 事务处理(无差错) 
操作码 
数据响应 
 
对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻
辑 1。 
4 
 
 
客户机 
服务器 
GB/T  ×××× —×××× 
启动请求 
接收响应 
功能码  数据请求 
在操作中检测的差错 
启动差错 
差错码 
异常码 
 
 
F 注释:需要管理超时,以便明确地等待可能不会出现的应答。 
图 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 异常码。 
4.2  数据编码 
l  MODBUS 使用一个‘big-Endian’  表示地址和数据项。这意味着当发射多个字节时,首先发
送最高有效位。例如: 
寄存器大小             值 
 
5 
GB/T  ××××—×××× 
16 –  比特          
 0x1234 
        发送的第一字节为      0x12       然后 0x34   
F 注释:更详细的信息参见[1]。 
4.3  MODBUS 数据模型 
MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为: 
 
基本表格 
对象类型 
访问类型 
内容 
离散量输入 
线圈 
输入寄存器 
保持寄存器 
单个比特 
单个比特 
16-比特字 
16-比特字 
只读 
读写 
只读 
读写 
I/O 系统提供这种类型数据 
通过应用程序改变这种类型数据 
I/O 系统提供这种类型数据 
通过应用程序改变这种类型数据 
 
输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果
这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四
个表格全部覆盖了另外一个表格。 
对于基本表格中任何一项,协议都允许单个地选择 65536 个数据项,而且设计那些项的读写操
作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。 
很显然,必须将通过 MODBUS 处理的所有数据放置在设备应用存储器中。但是,存储器的物
理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。 
MODBUS 功能码中使用的 MODBUS 逻辑参考数字是以 0 开始的无符号整数索引。 
l  MODBUS 模型实现的实例 
下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述
出来。每个设备根据其应用都有它自己的数据结构。 
实例 1:有 4 个独立块的设备 
下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。由于不
同块中的数据不相关,每个块是相互独立。按不同 MODBUS 功能码访问每个块。 
 
 
 
 
 
 
 
 
 
6 
 
GB/T  ×××× —×××× 
 
设备应用存储器 
MODBUS 访问 
输入离散量 
线圈 
 
 
                                                       
 
 
 
 
 
 
MODBUS 服务器设备 
输入寄存器 
保存寄存器 
 
MODBUS 请求 
 
 
图 6:带有独立块的 MODBUS 数据模型 
实例 2:仅有 1 个块的设备 
在这个实例中,设备仅有 1 个数据块。通过几个 MODBUS 功能码可能得到一个相同数据,或
者通过 16 比特访问或 1 个访问比特。 
 
设备应用存储器 
R 
W 
MODBUS 访问 
输入离散量 
线圈 
R 
W 
输入寄存器 
保存寄存器 
MODBUS 请求 
MODBUS 服务器设备 
 
图 7:仅带有 1 个块的 MODBUS 数据模型 
4.4  MODBUS 事务处理的定义 
下列状态图描述了在服务器侧 MODBUS 事务处理的一般处理过程。 
 
 
 
 
 
 
 
7