MODBUS标准最新版本中文翻译
MODBUS 是一种应用层消息协议,位于 OSI 模型的第 7 层,用于在不同类型的总线或网络上连接的设备之间实现主站/从站通信。
自 1979 年以来,MODBUS 一直是工业领域的串行通信事实标准,至今仍在使数百万自动化设备实现通信。
如今,MODBUS 简洁而优雅的结构仍在持续获得支持。互联网社区可以通过 TCP/IP 协议栈上的保留系统端口 502 访问 MODBUS。
MODBUS 是一种请求/应答协议,通过功能码提供指定的服务。
MODBUS 功能码是 MODBUS 请求/应答 PDU(协议数据单元)的组成部分。本文档的目标是描述在 MODBUS 事务框架中使用的功能码。
MODBUS 是一种用于在不同类型的总线或网络上连接的设备之间进行主站/从站通信的应用层消息协议。
目前其实现方式包括:
-
通过以太网的 TCP/IP。参见《MODBUS 消息实现指南 V1.0a》。
-
通过多种介质的异步串行传输(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线电等)。
-
MODBUS PLUS,一种高速令牌传递网络。
📘 参考文献
-
RFC 791,《互联网协议》,1981年9月,DARPA(美国国防高级研究计划局)
🔤 缩写说明
-
ADU:应用数据单元(Application Data Unit)
-
HDLC:高级数据链路控制(High-level Data Link Control)
-
HMI:人机界面(Human Machine Interface)
-
IETF:互联网工程任务组(Internet Engineering Task Force)
-
I/O:输入/输出(Input/Output)
-
IP:互联网协议(Internet Protocol)
-
MAC:媒体访问控制(Media Access Control)
-
MB:MODBUS 协议(MODBUS Protocol)
-
MBAP:MODBUS 应用协议(MODBUS Application Protocol)
-
PDU:协议数据单元(Protocol Data Unit)
-
PLC:可编程逻辑控制器(Programmable Logic Controller)
-
TCP:传输控制协议(Transmission Control Protocol)
背景
MODBUS协议允许在所有类型的网络架构中进行简单的通信。
每种类型的设备(PLC、HMI、控制面板、驱动器、运动控制、I/O设备等)都可以使用MODBUS协议来发起远程操作。
同样的通信也可以在串行线路以及以太网TCP/IP网络上进行。网关允许使用MODBUS协议在几种不同类型的总线或网络之间进行通信。
总体描述
协议描述
MODBUS协议定义了一个简单的协议数据单元(PDU),它独立于底层通信层。
在特定总线或网络上映射MODBUS协议可能会在应用数据单元(ADU)上引入一些附加字段。
MODBUS 应用数据单元由发起 MODBUS 事务的主站构建。功能码告知从站要执行何种操作。
MODBUS 应用协议规定了由主站发起请求的格式。
MODBUS 数据单元的功能码字段编码为一个字节。
有效码值为十进制 1 … 255(范围 128 – 255 保留并用于异常响应)。
当消息从主站发送到从站设备时,功能码字段告知从站要执行何种操作。
功能码“0”无效。某些功能码会添加子功能码以定义多个操作。
从站接收消息中的数据字段包含从站用于执行功能码所定义操作的其他信息。
这可能包括诸如离散量和寄存器地址、要处理的项目数量以及字段中实际数据字节的计数等内容。
在某些类型的请求中,数据字段可能不存在(长度为零),此时从站不需要任何额外信息,仅功能码即指明了操作。
如果在正确接收的 MODBUS ADU 中,与请求的 MODBUS 功能相关的错误没有发生,则从站发送给主站的响应数据字段包含所请求的数据。
如果发生了与请求的 MODBUS 功能相关的错误,则该字段包含一个异常代码,从站应用程序可用其确定下一步要采取的操作。
例如,主站可以读取一组离散输出或输入的 ON/OFF 状态,或者可以读取/写入一组寄存器的数据内容。
当从站向主站响应时,它使用功能码字段来指示是正常(无错误)响应还是发生了某种错误(称为异常响应)。
对于正常响应,从站仅将原始功能码回显给请求。
异常响应时,从站返回的代码等于请求 PDU 中的原始功能码,但将其最高有效位置1。
注意:建议设置超时管理,以避免无限期等待可能永远不会到达的响应。
MODBUS PDU 的大小受到最初在串行线网络上实现 MODBUS 时的尺寸限制所约束(最大 RS485 ADU=256 字节)。
因此:
用于串行线通信的 MODBUS PDU=256-从站站号(1 字节)-CRC(2 字节)=253字节。
RS232/RS485 ADU=253+从站站号(1字节)+CRC(2字节)=256字节。
TCP MODBUS ADU=253+MBAP(7字节)=260字节。
MODBUS 协议定义了三种 PDU。它们是:
-
MODBUS 请求 PDU,mb_req_pdu
-
MODBUS 响应 PDU,mb_rsp_pdu
-
MODBUS 异常响应 PDU,mb_excep_rsp_pdu
mb_req_pdu = {功能码, 请求数据},
其中:
功能码 = [1 字节] MODBUS 功能码,
请求数据 = [n 字节] 此字段取决于功能码,通常包含诸如变量引用、变量数量、数据偏移量、子功能码等信息。
mb_rsp_pdu = {功能码, 响应数据},
其中
功能码 = [1 字节] MODBUS 功能码
响应数据 = [n 字节] 此字段取决于功能码,通常包含诸如变量引用、变量数量、数据偏移量、子功能码等信息。
mb_excep_rsp_pdu = {异常功能码,异常代码},
其中
异常功能码 = [1 字节] MODBUS 功能码 + 0x80
异常代码 = [1 字节] MODBUS 异常代码(定义于“MODBUS 异常代码”)
数据编码
MODBUS 对地址和数据项采用大端序(big-Endian)表示。当传输大于单字节的数值时,最高有效字节优先发送。例如:
|
寄存器大小
|
数值
|
|---|---|
|
16 位
|
0x1234
|
则先发送的字节为 0x12,随后是 0x34。
数据模型
MODBUS 的数据模型基于一系列具有不同特性的表。四个主表如下:
|
主表
|
对象类型
|
访问类型
|
说明
|
|---|---|---|---|
|
离散输入
|
单比特
|
只读
|
此类数据可由 I/O 系统提供。
|
|
线圈
|
单比特
|
读写
|
此类数据可由应用程序更改。
|
|
输入寄存器
|
16位字
|
只读
|
此类数据可由 I/O 系统提供。
|
|
保持寄存器
|
16位字
|
读写
|
此类数据可由应用程序更改。
|
输入与输出之间、以及比特寻址与字寻址数据项之间的区别,并不暗示任何应用程序行为。
如果目标机器上最自然的解释是将所有四个表视为相互重叠,这完全可以接受,并且非常常见。
对于每个主表,协议允许单独选择 65536 个数据项,并且对这些项的读写操作设计为可跨越多个连续数据项,最大数据大小取决于事务功能码的限制。
显然,所有通过 MODBUS 处理的数据(比特、寄存器)必须位于设备应用内存中。
但内存中的物理地址不应与数据引用混淆。唯一的要求是将数据引用与物理地址关联起来。
MODBUS 功能中使用的 MODBUS 逻辑引用号是从零开始的无符号整数索引。
• MODBUS 模型实现示例
以下示例展示了设备中组织数据的两种方式。可能还有不同的组织形式,但本文档未全部描述。
每个设备可根据其应用程序拥有自己的数据组织方式。
示例 1:具有 4 个独立块的设备
下图展示了一个具有数字量与模拟量、输入与输出的设备中的数据组织。
每个块是独立的,因为来自不同块的数据没有关联。因此,每个块可通过不同的 MODBUS 功能访问。
示例 2:仅具有 1 个块的设备
本例中,设备仅包含 1 个数据块。
相同的数据可以通过多种 MODBUS 功能访问,无论是通过 16 位访问还是按位访问。
寻址模型
MODBUS 应用协议精确定义了 PDU 的寻址规则。
在 MODBUS PDU 中,每个数据的寻址范围是从 0 到 65535。
同时,它也明确定义了一个由 4 个块组成的 MODBUS 数据模型,每个块包含从 1 到 n 编号的若干元素。
在 MODBUS 数据模型中,每个数据块内的元素编号是从 1 到 n。
随后,MODBUS 数据模型必须与设备应用程序(IEC-61131 对象,或其他应用模型)进行绑定。
MODBUS 数据模型与设备应用程序之间的预映射完全取决于供应商设备的特定实现。
编号为 X 的 MODBUS 数据在 MODBUS PDU 中的寻址值为 X-1。
MODBUS事务
以下状态图描述了在从站处理MODBUS事务的通用流程。

一旦从站完成对请求的处理,系统将利用相应的MODBUS从站事务构建MODBUS响应。
根据处理结果,会生成以下两种类型的响应:
-
MODBUS正响应:
响应功能码 = 请求功能码 -
MODBUS异常响应:
目的是向主站提供有关处理过程中检测到错误的相关信息;
异常功能码 = 请求功能码 + 0x80;
同时提供异常代码以说明错误原因。
功能码分类
MODBUS 功能码分为以下三类:
公共功能码
-
是明确定义的功能码
-
保证具有唯一性
-
经过 MODBUS.org 社区验证
-
有公开的文档说明
-
提供可用的一致性测试
-
包括已定义的公共分配功能码以及预留供未来使用的未分配功能码。
用户定义功能码
-
有两段用户定义功能码范围,即十进制 65 至 72 和 100 至 110。
-
用户可以选择并实现规范不支持的功能码。
-
不能保证所选功能码的使用是唯一的。
-
如果用户希望将功能作为公共功能码重新定位,必须发起 RFC 以将该变更引入公共类别,并申请分配新的公共功能码。
-
MODBUS 组织公司明确保留开发所提议 RFC 的权利。
保留功能码
-
目前由一些公司为其传统产品使用的功能码,不供公共使用。
-
提示说明:“MODBUS 保留功能码、子码及 MEI 类型”。
| 数据访问类型 | 功能描述 | 功能代码 | 十六进制 |
|---|---|---|---|
| 位访问 | 物理离散输入 | 02 | 02 |
| 内部位或物理线圈 | 01 | 01 | |
| 写单个线圈 | 05 | 05 | |
| 写多个线圈 | 15 | 0F | |
| 16位访问 | 物理输入寄存器 | 04 | 04 |
| 内部寄存器或物理输出寄存器 | 03 | 03 | |
| 写单个寄存器 | 06 | 06 | |
| 写多个寄存器 | 16 | 10 | |
| 读/写多个寄存器 | 23 | 17 | |
| 屏蔽写寄存器 | 22 | 16 | |
| 读取FIFO队列 | 24 | 18 | |
| 文件记录访问 | 读取文件记录 | 20 | 14 |
| 写文件记录 | 21 | 15 | |
| 读取异常状态 | 07 | 07 | |
| 诊断 | 诊断 | 08(00-18, 20) | 08 |
| 获取通信事件计数器 | 11 | 0B | |
| 获取通信事件日志 | 12 | 0C | |
| 报告服务器ID | 17 | 11 | |
| 读取设备标识 | 43(14) | 2B | |
| 其他 | 封装接口传输 | 43(13,14) | 2B |
| CANopen通用参考 | 43(13) | 2B |

MODBUS 是一种应用层消息协议,位于 OSI 模型的第 7 层,用于在不同类型的总线或网络上连接的设备之间实现主站/从站通信。
自 1979 年以来,MODBUS 一直是工业领域的串行通信事实标准,至今仍在使数百万自动化设备实现通信。
如今,MODBUS 简洁而优雅的结构仍在持续获得支持。互联网社区可以通过 TCP/IP 协议栈上的保留系统端口 502 访问 MODBUS。
MODBUS 是一种请求/应答协议,通过功能码提供指定的服务。
浙公网安备 33010602011771号