目录
一、Modbus协议简介
二、Modbus协议详解
1、Modbus RTU
(1)存储区及其地址介绍
(2)功能码及其作用
(3)报文格式
(4)相对地址与绝对地址
2、Modbus ASCII
3、Modbus TCP/IP
(1)Modbus TCP/IP与RTU区别
(2)Modbus TCP/IP报文格式
报文结构详解
三、如何选择协议
ModbusPoll安装包
Modbus协议中文版: https://pan.baidu.com/s/1oxqQy9n8tVG-Go1asIHqhg 提取码: 8cyb
Modbus协议:https://pan.baidu.com/s/1MF1oIgo_b8XZoZseo-CkPA 提取码: bwe8
ModbusPoll是调试Modbus通讯最常用的软件,其使用方法以后会给出,其实读懂本文对Modbus协议的解析之后,此软件便会用了,若使用有问题,欢迎留言询问,软件安装包已在文末给出。
一、Modbus协议简介
Modbus通讯协议是工业自动化领域应用最广泛的通信协议之一,由美国Modicon公司(现属施耐德电气)于1979年为其PLC产品设计。最初目的是为工业设备提供一种简单、通用的通信方式,以实现控制器与现场设备之间的数据交换。
核心架构是主从模式,即一主多从,在同一时间总线上只能 有一个主设备,但可以有一个或者多个(最多 247 个)从设备。这与之前介绍的几种协议有所区别。主要变种:Modbus RTU, Modbus ASCII, Modbus TCP/IP。 主要常见RS-485, RS-232,也可基于以太网(Modbus TCP)。最大的特点是标准、开放、简单,可免费使用,帧格式紧凑易懂。
| 特性 | Modbus RTU | Modbus ASCII | Modbus TCP/IP |
| 运行环境 | 串行通信(如RS-485, RS-232) | 串行通信(如RS-485, RS-232) | 以太网(TCP/IP网络) |
| 数据编码 |
二进制 |
ASCII字符 | 二进制 |
| 校验方式 | CRC(循环冗余校验) | LRC(纵向冗余校验) | 由TCP/IP协议栈确保数据完整性 |
| 特点 | 效率高、紧凑,最常用的串行模式 | 可读性强、易于调试,但效率较低 | 传输速度快,可利用现有以太网设施 |
| 典型应用 | PLC、传感器、变频器等工业设备现场通信 | 需人工读取调试的慢速数据交换场景 | 车间级监控、SCADA系统、设备联网 |
二、Modbus协议详解
1、Modbus RTU
Modbus RTU:这是工业现场总线中最主流的形式。它采用二进制编码,数据帧非常紧凑,传输效率高。每个数据帧都以一段沉默间隔开始和结束,并通过CRC校验来保证数据的准确性,非常适应工业环境下的抗干扰需求。
(1)存储区及其地址介绍
Modbus RTU协议将设备的数据组织在四个核心存储区中,每个区有特定的功能和地址范围。下面这个表格汇总了它们的核心特性:
| 存储区名称 | 读写特性 | 数据类型 | 功能码举例 | 5位标准地址范围 | 6位扩展地址范围 |
| 线圈寄存器 (Coils) | 读/写 | 位 (1 bit) | 0x01 (读), 0x05 (写单个), 0x0F (写多个) | 00001 – 09999 | 000001 – 065536 |
| 离散输入寄存器 (Discrete Inputs) | 只读 | 位 (1 bit) | 0x02 (读) | 10001 – 19999 | 100001 – 165536 |
| 保持寄存器 (Holding Registers) | 读/写 |
字 (16 bits) |
0x03 (读), 0x06 (写单个), 0x10 (写多个) | 40001 – 49999 |
400001 – 465536 |
| 输入寄存器 (Input Registers) | 只读 |
字 (16 bits) |
0x04 (读) | 30001 – 39999 | 300001 – 365536 |
存储区详解与使用要点
线圈寄存器 (0区):通常用来控制开关量设备,比如继电器的通断、指示灯的亮灭。每个线圈的状态就是一个布尔值(0或1)。
离散输入寄存器 (1区):用于表示只能读取的开关量状态,例如按钮是否被按下、限位开关是否触发等。
保持寄存器 (4区):最常见的用于存储数据的区域,可读可写。常用来存放设备参数(如设定温度、速度)、计数器值等。每个寄存器可以存储一个16位的整数,或多个寄存器组合存储浮点数等复杂数据。
输入寄存器 (3区):用于存储从外部采集的、只读的数据,例如温度传感器的读数、电压电流值等。
地址编号规则
Modbus设备通常支持两种地址编号方式:5位标准地址和6位扩展地址。
5位标准地址:这是最传统的格式,地址范围如上表所示。地址的第一位数字(前缀)用于区分不同的存储区。
6位扩展地址:为了支持更大的数据容量,许多现代设备采用了6位地址格式,将每个存储区的寻址范围扩展到了最多65536个单元。
绝对地址与 相对地址
理解这两种地址的区别对正确进行通信至关重要:
绝对地址:这是在设备手册、组态软件或HMI界面上看到的地址编号,例如40001。它是一个便于人类识别的“标签”。
相对地址:这是在实际通信报文中使用的地址。它是从每个存储区的起始位置开始计算的偏移量。例如,绝对地址40001对应的相对地址是0000;绝对地址40002对应的相对地址是0001,以此类推。
当你在编程或配置主站设备(如PLC、SCADA系统)时,需要根据设备的说明书,将手册中给出的绝对地址转换为相应的相对地址填入通信指令中。
(2)功能码及其作用
Modbus协议主要通过功能码(Function Code) 来约定不同设备的行为。下表列举了一些最常用的功能码:
| 功能码(十六进制) | 名称 | 作用 |
| 01H | 读线圈状态 | 读取一组开关量输出(DO)的状态(ON/OFF) |
| 02H | 读输入状态 | 读取一组开关量输入(DI)的状态(ON/OFF) |
| 03H | 读保持寄存器 | 非常常用。读取从设备保持寄存器(如PLC的数据块)中的内容 |
| 04H | 读输入寄存器 | 读取从设备输入寄存器中的内容(如模拟量输入值) |
| 05H | 写单个线圈 | 强制一个线圈为ON或OFF(实现单个开关控制) |
| 06H | 写单个寄存器 | 向一个保持寄存器写入预设值(如修改一个设定参数) |
| 0FH | 写多个线圈 | 向多个连续的线圈写入数据 |
| 10H | 写多个寄存器 | 非常常用。向多个连续的保持寄存器写入数据(如批量下发改定值) |
(3)报文格式
Modbus 协议 RTU 报文格式如下所示:

| 组成部分 | 长度 (字节) | 描述与要点 |
| 设备地址 | 1 | 标识总线上的从站设备,范围通常为 1-247。地址0为广播地址。 |
| 功能码 | 1 | 定义请求的操作类型,如 0x03为读保持寄存器,0x10为写多个寄存器。 |
| 数据域 | N | 变长字段,内容取决于功能码。例如,读寄存器请求中包含起始地址和数量;响应中则包含读取到的数据。 |
| CRC校验 | 2 | 循环冗余校验码,用于检测传输错误。采用CRC-16算法,多项式为 0xA001。传输时低字节在前。 |
分析一段监控到的报文来加深理解:
(主)发送:01 03 00 00 00 02 C4 0B
01 从站地址;03 读输出寄存器;00 00 起始寄存器;00 02 寄存器长度;C4 0B CRC校验。
(主)接收:01 03 04 01 46 01 3B 5A 59
01 从站地址;03 读输出寄存器;04 字节计数;01 46 01 3B 具体4个字节;5A 59 CRC校验。
(4)相对地址与绝对地址
理解Modbus协议中的相对地址与绝对地址,是确保通信成功的关键。
| 特性 | 绝对地址 (Absolute Address) | 相对地址 (Relative Address) |
| 定义 | 包含存储区代号的完整地址,是给人看的“门牌号” | 不包含存储区代号,仅表示在某个存储区内的偏移量,是协议实际传输的“房间号” |
| 表现形式 | 通常为5位或6位数字,如 40001, 300001 | 从0开始的整数,如 0, 9, 99 |
|
功能码依赖 |
独立,通过地址本身即可确定存储区 | 高度依赖,必须结合功能码才能确定操作哪个存储区 |
| 主要应用场景 | 设备手册、工程师沟通、软件配置界面 | Modbus协议数据帧内部 |
| 示例 | 手册注明“温度值在40010地址” | 功能码03的报文中,地址字段填写 0009(十六进制)来读取40010地址的数据 |
2、Modbus ASCII
Modbus ASCII:这种模式使用可打印的ASCII字符来编码数据。虽然传输效率较低,但优点是发送的数据可以直接被终端软件显示或人工解读,非常便于调试和诊断。它使用LRC进行校验。消息以冒号(:)开始,以回车换行符(CR, LF)结束。
报文格式与Modbus RTU一样:设备地址+功能码+数据域+CRC校验。
可读的文本格式:这是最本质的区别。Modbus ASCII 将每个数据字节(如 0x4F)用两个对应的ASCII字符(即 '4'和 'F')来表示。因此,用普通的串口调试助手捕获到的报文是像 :010300000001FB\\r\\n这样的可读字符串,非常便于人工阅读和调试。
宽松的时序要求:由于有明确的开始和结束标志,Modbus ASCII 对帧内字符之间的传输间隔要求很宽松(最长可达1秒),这使其在通信质量不佳或波特率不稳定的低速场景中更具适应性。
效率与适用场景:文本编码的代价是传输效率较低。同样一条指令,Modbus ASCII 帧的长度约为 RTU 帧的两倍。因此,它通常用于数据量小、速率低、或需要频繁人工介入调试的场合,例如连接一些老旧的工业设备或实验室仪器。而对于高速、大数据量的工业现场通信,Modbus RTU 是绝对的主流选择。
简单来说,您可以将 Modbus ASCII 理解为 RTU 的“文本版”,牺牲了效率,换来了更高的可读性和对通信条件的容忍度。总体来说与RTU差别不大。
3、Modbus TCP/IP
(1)Modbus TCP/IP与RTU区别
Modbus TCP/IP通过IP地址区分从机;TCP/IP数据包中已存在校验。

(2)Modbus TCP/IP报文格式
Modbus TCP/IP:这是Modbus协议运行在以太网上的版本。为了适应TCP/IP协议栈,它在标准的Modbus协议数据单元(PDU)前增加了一个MBAP报文头。这个报文头包含了事务标识符、协议标识符、长度和单元标识符等信息,用于在网络环境中管理通信会话。由于底层TCP协议已经提供了可靠的连接,因此不再需要CRC或LRC校验。它默认使用502端口。
Modbus TCP/IP的报文格式如下:

报文结构详解
整个报文可以理解为在标准的 Modbus 指令外面,套上了一个适应网络环境的“信封”。
1)MBAP 报文头(Modbus Application Protocol Header)
这是 Modbus TCP/IP 特有的部分,共 7 个字节,用于网络通信的管理。您可以将其理解为一个“快递面单”。
-
事务处理标识符(2 字节):这是由客户端(主站)生成的唯一编号,用于匹配请求和响应。服务器(从站)在返回响应时必须原样返回此标识符。这解决了在网络中可能同时存在多个未完成请求时,如何正确配对的问题。
-
协议标识符(2 字节):用于标识这是 Modbus 协议。固定为 0,其他值通常被视为非法。
-
长度字段(2 字节):指示其后所有字节的数量。具体来说,是从下一个字节(即单元标识符)开始,到整个 PDU 结束的字节数。例如,一个典型的读寄存器请求(单元标识符1 + 功能码1 + 地址2 + 数量2 = 6字节),此字段值就是6。
-
单元标识符(1 字节):这个字段的作用类似于 Modbus RTU 中的从站地址,但它是在TCP/IP网络内部使用的。当一个TCP连接(例如,通过网关)后端连接了多个串行设备时,此字段用于指定最终要访问的从站设备。如果只有一个设备,通常设为 1 或 255。
2) PDU 报文(协议数据单元)
这部分是标准的 Modbus 协议内容,与您在 RTU 或 ASCII 模式中看到的核心部分完全相同。它包含了具体的操作指令。
-
功能码(1 字节):定义要执行的操作,例如 0x03是读保持寄存器,0x10是写多个寄存器。这与 Modbus RTU 中的功能码完全一致。
-
数据区(N 字节):功能码所带的参数。例如,读请求 (0x03) 的数据区包含“起始地址”和“寄存器数量”;响应 (0x03) 的数据区则包含“字节数”和“寄存器的值”。
三、如何选择协议
在选择合适的Modbus协议时,可以遵循一个简单的原则:根据通信介质和速度需求来决策。
需要高速、远距离通信,或集成到现有企业网络: 优先选择 Modbus TCP/IP。它适合车间级的数据采集和监控系统(SCADA)。
在设备现场进行布线,追求高可靠性和实时性: 选择 Modbus RTU。它是工业控制柜内设备通信的绝对主力。
通信速率要求不高,但需要频繁查看数据内容进行调试: 可以考虑 Modbus ASCII。它在调试或需要高可读性的慢速场景中有其价值。
ModbusPoll安装包
https://pan.baidu.com/s/18-c1qmXULNfa7JxVXGk8Xw 提取码: c446
网硕互联帮助中心



评论前必须登录!
注册