Modbus简介

Modbus 是一种在工业自动化、能源管理和楼宇系统中广泛使用的通信协议,用于让不同设备之间进行数据交换。在介绍 Modbus 是什么 时,通常会强调它由 Modicon(现施耐德电气)于 1979 年提出,并凭借开放、简单、稳定等特点成为目前全球使用最广、兼容性最好、实施成本最低的工业协议之一。

无论是 PLC、电力仪表、暖通设备,工业与 IoT 集成中最基础、最重要的通信语言。

Modbus 的通信模型

理解 Modbus 是什么 还需要了解它的通信方式。Modbus 通信遵循 “主站发起 → 从站响应” 的轮询机制:

  1. 主站发送读/写指令

  2. 从站按寄存器地址返回数据

  3. 主站解析寄存器内容并执行处理

这种结构清晰、易调试的通信方式,是 Modbus 能成为工业主流协议的重要原因。

Modbus 可以应用于哪些场景?

理解 Modbus 是什么 也意味着要知道它的应用领域。Modbus 几乎出现在所有工业与楼宇设备中,包括:

● 工业自动化

  • PLC、RTU、仪表的数据采集;产线运行参数监控;设备状态管理、状态量读取、动作控制

● 能源管理与计量

  • 电表、水表、热量表、气表等能耗采集;机房和楼宇的能耗集中监测;接入 EMS / BMS / IoT 平台;楼宇自动化(BA);HVAC 空调、冷机房、风机盘管;电力仪表、照明系统;泵阀设备控制

● 电力监控;

  • 变压器、配电柜参数监测;保护装置数据采集;电能质量分析设备

● 环境与安全监测

  • 烟感、温湿度、气体监测;工控安全与设备健康监测

● 智能制造与 IoT 上云

  • CNC 数控设备;机器人单元;自动化测试设备;工业设备数字化改造、设备上云;

● 典型行业案例(概述)

  • 工厂产线设备数据集中采集;园区能源监测与碳排分析;楼宇暖通和动力机房实时监控

Modbus 协议的技术优势与局限性

技术特性

  • 完全开放,无需授权费 无需任何版权或认证成本。

  • 生态成熟,兼容性极强 几乎所有工业与楼控厂商都提供 Modbus 支持。

  • 简单易懂,工程实施成本低 寄存器模型简单、可维护性高。

  • 通信方式灵活 支持串口(RTU/ASCII)与以太网(TCP)。

  • 工业级稳定性优秀 抗干扰能力强,适合噪声复杂环境。

局限性

  • 无原生加密,安全性需额外保障

  • 基于轮询,实时性有限

  • 带宽较低,不适合大批量数据传输

  • 地址需人工管理,复杂度随规模上升

  • 不支持主动上报(需第三方扩展)

Modbus协议类型

  • Modbus-RTU(走串口的一个设备,也是Modbus协议上规定的默认协议,且设备必须支持此协议。)

  • Modbus-ASCII(双字节发送报文,效率较低,一般不用。)

  • Modbus-TCP(使用以太网链路进行通信。)

Modbus是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。

一个总线上有一个主机,多个从机,主机查询其中一个从机,首先你必须得这些从机分配地址(这样才能知道哪个从机,而且每个地址必须唯一),分配好地址后,主机要查询,然后数据下发(数据内容下面会介绍),从机得到主机发送的数据,然后对应地址的从机回复,主机得到从机数据,这样就是一个主机到从机的通信过程。

Modbus-RTU协议解析

Modbus RTU 是工业自动化领域最经典、最常用的串口通信协议之一,广泛应用于 PLC、仪表、变频器、能源计量设备以及物联网网关的数据采集场景。Modbus RTU 基于 RS-485/RS-232 串口进行通信,结构简单、稳定可靠,是目前工业设备最常见的默认通信协议。

它通过 RS-485/RS-232 串口传输数据,采用严格的帧结构和 CRC 校验保证可靠性。

Modbus RTU 的主要特点:

  • 使用 RS-485/RS-232 串口通信

  • 主从结构(Master-Slave)

  • 每个从站地址范围 1–247

  • 采用 CRC16 校验

  • 帧间必须保持 3.5 个字符时间的间隔

  • 体积小、开销低,适合嵌入式设备

因此,Modbus RTU 成为工业控制、楼宇自控、能源监控与 IoT 接入方案的标准协议之一。

帧结构

Modbus-RTU报文结构如下:

帧结构 = 地址 + 功能码+ 数据 + 校验
+------------+---------------+-------------+-----------------+
| Address(1) | Function(1) | Data(N) | CRC16(2 bytes) |
+------------+---------------+-------------+-----------------+

字段名

长度

说明

Address

1 字节

从站地址(1–247)

Function Code

1 字节

指定读写操作类型

Data

N 字节

寄存器数据、数量、值等

CRC16

2 字节

故障检测校验码(低位在前,小端)CRC16 采用多项式 0xA001。

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)。

Modbus 地址说明

在 Modbus 地址体系中,有两类常见的地址表示方式:

  1. 逻辑地址(如 40001、30001 等)

  2. 实际寄存器偏移地址(从 0 开始,如 0、1、2……)

设备手册中常见的逻辑写法与软件中实际使用的寄存器偏移可能不同,因此阅读 Modbus 地址对照表时需要特别注意两者的对应关系。虽然不同厂商文档写法不同,但 Modbus 地址结构本质相同。

地址区间(逻辑地址)

数据类型

操作

功能码

0xxxx (00001–09999)

线圈(Coils)

读/写单个或多个线圈

01(读) / 05(写单个) / 15(写多个)

1xxxx (10001–19999)

离散输入(Discrete Inputs)

只读

02

3xxxx (30001–39999)

输入寄存器(Input Registers)

只读

04

4xxxx (40001–49999)

保持寄存器(Holding Registers)

读/写单个或多个寄存器

03(读) / 06(写单个) / 16(写多个)

这张 Modbus 地址对照表 也是 Modbus 工程调试、设备接入和功能码选择的基础表格,建议在 Modbus 开发过程中优先参考。

地址与偏移量的关系(常见坑)

许多厂商手册提供的“40001、30001”这种逻辑地址,在使用 Modbus 工具或编写程序时需要转换为“寄存器偏移地址”。

例如逻辑地址:40010

对应的实际偏移为:40010 → 偏移 9

计算方式:

真实寄存器地址 = 逻辑地址 - 地址区类型起始位
40010 → 40010 - 40001 = 9

这类偏移关系是阅读 Modbus 地址对照表时必须掌握的关键点。

⚠️ 在实际项目中,一定要确认你的设备使用的是 40001 基准 还是 0 基准,避免读错寄存器。

常见厂商定义差异(重要)

不同厂商在 Modbus 地址对照表中的写法可能存在差异,例如:

  • 使用 0-based 地址(偏移:0、1、2…)

  • 使用 1-based 地址(逻辑地址)(如 40001、40002…)

因此,在使用 Modbus 地址对照表配置地址时,务必:

  1. 查看设备说明书的地址体系

  2. 使用调试工具验证读写是否正确

  3. 结合协议驱动确认是否需要减 1

Modbus 地址使用示例

读取保持寄存器 40010 的数据(基于 Modbus 地址对照表的标准规则):

功能码:03(Read Holding Registers)
寄存器地址:9(从 0 开始)
数量:1

功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。

Modbus功能码说明

Modbus 功能码对照表是 Modbus 协议中最核心的重要内容之一。Modbus 功能码(Function Code)用于告诉从站设备要执行何种操作,是所有 Modbus 通讯中必不可少的参数。本页整理最常用的 Modbus 功能码、对应的读写能力、典型场景与示例,适合开发、运维与系统集成工程师参考。

Modbus 功能码是什么?

Modbus 功能码用于指定从站执行的操作类型,是所有 Modbus 指令的基础。常见的 Modbus 功能码包括:

  • 读取线圈(Read Coils)

  • 读取输入寄存器

  • 写单个寄存器

  • 写多个保持寄存器

任何一次 Modbus 数据操作都必须同时指定 Modbus 功能码 + 寄存器地址 才能正确完成读写,因此理解 Modbus 功能码对照表至关重要。

Modbus 常见功能码对照表

功能码(Hex)

操作类型

说明

使用场景

0x01

Read Coils

读取线圈(开关量输出)

读取或监控开关状态

0x02

Read Discrete Inputs

读取离散输入

读取传感器开关量输入

0x03

Read Holding Registers

读取保持寄存器

读取测量值、运行状态

0x04

Read Input Registers

读取输入寄存器

读取只读类传感数据

0x05

Write Single Coil

写单个线圈

控制继电器或启停操作

0x06

Write Single Register

写单个保持寄存器

设置设备参数或阈值

0x0F (15)

Write Multiple Coils

写多个线圈

同时控制多路 DO 输出

0x10 (16)

Write Multiple Registers

写多个保持寄存器

批量下发配置与参数

以上表格是最标准、最常见的 Modbus 功能码对照表,用于快速查找每个功能码的能力与适配场景。

使用时的典型组合示例

下表展示了常见的操作类型与对应的 Modbus 功能码组合:

操作需求

使用什么功能码

示例地址

读取温度值

03

40001(保持寄存器)

读取电压、电流

04

30001(输入寄存器)

控制继电器闭合

05

00001(线圈)

下发多个参数

16

40010–40020

这些场景都是基于 Modbus 功能码对照表中功能码与寄存器类型的匹配关系。

完整示例

以下示例进一步展示 Modbus 功能码在真实操作中的使用方式。

读取 2 个保持寄存器:

功能码:03
起始地址:0x000A
寄存器数量:0x0002

写单个寄存器(设定阈值):

功能码:06
寄存器地址:0x0010
写入值:0x00FA

这些示例均体现了“选择正确的 Modbus 功能码”在实际读写过程中的关键作用。

数据:根据功能码不同,有不同结构,在下面的实例中有说明。

校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。

报文示例

下面是使用03功能码查询01地址的一个例子:

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E

通信拓扑结构

Modbus RTU 一般采用 半双工 RS-485 总线拓扑,支持多达 32 个从站,距离可超过 1000 米。 典型结构如下:

  • 一个主站(PLC / 网关 / 工控机)

  • 多个从站(仪表、传感器、控制器)

  • 半双工通信(所有设备共享两根信号线)

该结构具有成本低、布线简单、抗干扰能力强的特性。

拓补图

调试与工程常见问题(FAQ)

为什么设备读不到数据?

  • 地址基准不同(0-based/1-based)

  • 寄存器类型错误(如 01 和 03 混淆)

  • 波特率校验位参数不一致

CRC 错误怎么办?

  • 总线过长、电磁干扰强

  • 设备接地不正确

  • 485 A/B 线接反

  • 终端电阻未正确配置

Modbus RTU 支持广播吗?
支持地址 0 广播写操作(但读操作不支持)。

可以多主机吗?
协议上不推荐多主机,否则会导致冲突;若有需求,可使用 Modbus TCP 或 RTU → TCP 网关。

Modbus-TCP协议解析

Modbus TCP 是一种基于 TCP/IP 网络的工业通信协议,是将 Modbus 应用层协议封装在 TCP/IP 网络传输层之上的协议版本。用于在 PLC、仪表、能源管理设备、IoT 网关等设备之间进行快速、稳定的数据交互。相比传统串口方式的 Modbus RTU,Modbus TCP 具备更高带宽、更强并发能力与更灵活的网络拓扑,是现代工业自动化和物联网平台最常用的协议之一。

主要特点包括:

  • 使用 TCP 502 端口

  • 通过 MBAP Header 替代 RTU 帧头与 CRC

  • 速度快、无时序限制,可跨网段传输

  • 功能码与寄存器模型与 Modbus RTU 完全一致

  • 可支持多个客户端同时访问同一个从站设备

这使得 Modbus TCP 成为智能制造、工业互联、能源监控系统等领域的通用通信方式。

报文结构(MBAP + PDU)

Modbus TCP 报文结构 = MBAP Header + PDU,如下所示:

+----------------------+---------------------------+
| MBAP Header (7 字节) | PDU(Function + Data) |
+----------------------+---------------------------+

MBAP Header(7 字节)

字段

长度

含义

Transaction ID

2

请求编号,用于客户端匹配响应

Protocol ID

2

固定为 0(表示 Modbus)

Length

2

后续 PDU 数据长度

Unit ID

1

从站地址(用于 TCP → RTU 网关)

PDU(功能码 + 数据)

PDU = Function Code (1 字节) + Data (N 字节)

PDU 与 Modbus RTU 完全一致,因此 Modbus TCP 在应用层保持良好兼容性。

Modbus TCP 与 Modbus RTU 的区别

项目

Modbus TCP

Modbus RTU

传输介质

TCP/IP 网络

RS-485 串口

校验方式

依赖 TCP(无需 CRC)

带 CRC 校验

地址规则

Unit ID(主要用于网关场景)

1–247

帧结构

MBAP Header + PDU

起始位 + PDU + CRC

并发性

多客户端并发

单主机

性能

高速,无时序限制

受串口波特率限制

总结:Modbus TCP 更适用于需要稳定、高速、跨网络访问的场景,是物联网平台和 SCADA 系统的主流协议方案。

Modbus TCP 报文示例

请求(读取保持寄存器 40001 开始 2 个寄存器)

00 01 00 00 00 06 01 03 00 00 00 02
↑ MBAP Header ↑ ↑ PDU(功能码+地址+数量) ↑

响应

00 01 00 00 00 05 01 03 04 00 0A 00 14

解析:

  • 功能码:03

  • 返回字节:04

  • 数据:0x000A、0x0014

Modbus TCP 通信拓扑结构

Modbus TCP 基于以太网进行通信,通常采用星型或树型网络拓扑,典型结构包括:

  • 一个主站(SCADA / PLC / 工控机 / 网关)

  • 多个从站(智能仪表、传感器、控制器等)

  • 通过交换机进行以太网连接

相比 RTU,Modbus TCP 支持更高的通信速率,网络扩展更灵活,并可通过 IP 地址方式管理大量设备。

拓补图

Modbus TCP 常见问题(FAQ)

Modbus TCP 是否需要 Unit ID?
需要,但不一定生效。

  • 真·TCP 设备 → Unit ID 通常固定为 1

  • 网关(TCP→RTU) → Unit ID = RTU 从站地址

为什么 Modbus TCP 没有 CRC?
因为 TCP 传输层已经提供可靠性保证,不需要冗余 CRC。

Modbus TCP 是否支持广播?
不支持,广播仅在 Modbus RTU 中有效。

Modbus TCP 地址与 RTU 是否相同?
完全一致,Modbus TCP 仅改变了链路层封装。