MODBUS 协议详细解读
地址:MODBUS 协议中文版下载
一、协议定位
MODBUS 是OSI 模型第 7 层(应用层) 的报文传输协议,核心定位是为不同总线 / 网络(串行链路、TCP/IP)连接的设备提供客户机 / 服务器(主站 / 从站)通信能力,是工业自动化领域的 “事实标准”(1979 年起源,支持千万级自动化设备互联)。
核心定位特征
- 通信模式:请求 / 应答机制(客户机发起请求,服务器返回响应,无主动推送)。
- 网络适配:支持两类底层网络,且均基于国际标准构建:
- 串行链路:依赖 TIA/EIA-232-F、TIA/EIA-485-A 标准;
- TCP/IP:依赖 IETF 的 RFC793(TCP)、RFC791(IP),使用保留端口502。
- 应用场景:工业自动化中 PLC、HMI、I/O 设备、驱动器等的远程数据读写(如读传感器状态、写控制指令)。
二、协议整体结构
MODBUS 协议按 “分层映射 + 数据单元封装” 设计,整体结构分为协议规范框架和底层实现指南两大部分,具体如下:
1. 协议规范框架(三部分核心文档)
部分 | 名称 | 核心作用 |
---|---|---|
第一部分 | Modbus 协议规范 | 定义 MODBUS 事务处理框架、PDU(协议数据单元)、功能码、数据模型 |
第二部分 | TCP/IP 上的实现指南 | 提供 TCP/IP 环境下 MODBUS 应用层的映射规则(如 MBAP 头)、连接管理 |
第三部分 | 串行链路上的实现指南 | 提供串行链路(RS232/485)下的帧结构、传输模式(RTU/ASCII)、物理层参数 |
2. OSI 模型分层映射
MODBUS 不依赖底层通信层,仅需在对应 OSI 层完成 “协议映射”,具体映射关系如下:
网络类型 | OSI 层 | 对应内容 | 核心标准 / 组件 |
---|---|---|---|
串行链路(RS232/485) | 第 1 层(物理层) | 电气接口 | TIA/EIA-232-F、TIA/EIA-485-A(两线制必需,四线制可选) |
第 2 层(数据链路层) | 帧分隔、差错校验 | 主从协议、RTU/ASCII 模式、CRC/LRC 校验 | |
第 7 层(应用层) | 数据交互逻辑 | MODBUS PDU(功能码 + 数据)、异常响应 | |
TCP/IP | 第 1 层(物理层) | 以太网物理接口 | IEEE 802.3 以太网物理层 |
第 2 层(数据链路层) | 以太网帧 | 以太网 II/802.3 帧格式 | |
第 3 层(网络层) | IP 寻址 | RFC791(IP 协议) | |
第 4 层(传输层) | 可靠传输 | RFC793(TCP 协议,端口 502) | |
第 7 层(应用层) | 数据交互逻辑 | MODBUS ADU(MBAP 头 + PDU)、功能码 |
3. 数据单元结构
MODBUS 定义两类核心数据单元,PDU(协议数据单元) 为核心逻辑单元,ADU(应用数据单元) 为底层传输单元(PDU + 附加域)。
(1)PDU(协议数据单元)
- 核心组成:
功能码(1字节) + 数据域(n字节)
,与底层无关,仅定义应用层逻辑。 - PDU 类型:
- 请求 PDU(mb_req_pdu):客户机发送,数据域含地址、数量等参数(如读线圈的起始地址 + 线圈数);
- 响应 PDU(mb_rsp_pdu):服务器正常响应,数据域含请求结果(如线圈状态);
- 异常响应 PDU(mb_excep_rsp_pdu):服务器错误响应,功能码 = 原功能码 + 0x80,数据域含异常码(1 字节)。
(2)ADU(应用数据单元)
PDU 需添加底层适配域形成 ADU,不同网络的 ADU 结构不同:
网络类型 | ADU 结构 | 各域说明 | 长度限制 |
---|---|---|---|
串行链路(RS232/485) | 地址域(1 字节) + PDU + 差错校验(2 字节) | 地址域:从站地址(0 = 广播,1-247 = 从站,248-255 = 保留);差错校验:RTU 用 CRC,ASCII 用 LRC | 总长度 = 256 字节(PDU=253 字节) |
TCP/IP | MBAP 头(7 字节) + PDU | MBAP 头:事务标识(2 字节,匹配请求响应)、协议标识(2 字节,0x0000=MODBUS)、长度(2 字节,后续字节数)、单元标识(1 字节,路由用) | 总长度 = 256 字节(PDU=249 字节) |
三、关键术语与参数
1. 核心术语定义
术语 | 英文 | 核心定义 | 关键参数 / 规则 |
---|---|---|---|
协议数据单元 | PDU | 应用层核心逻辑单元,与底层无关 | 组成:功能码(1 字节)+ 数据域(n 字节) |
应用数据单元 | ADU | 底层传输单元,PDU + 附加域 | 串行:地址域 + PDU+CRC/LRC;TCP:MBAP+PDU |
MODBUS 协议头 | MBAP | TCP 环境下的 ADU 附加头,用于事务匹配 | 7 字节:事务标识 (2)+ 协议标识 (2,0x0000)+ 长度 (2)+ 单元标识 (1) |
循环冗余校验 | CRC | RTU 模式的帧差错校验 | 16 位值,覆盖整个 ADU(地址域 + PDU),低字节先传 |
纵向冗余校验 | LRC | ASCII 模式的帧差错校验 | 8 位值,覆盖除起始 “:” 和结束 “CRLF” 外的帧内容 |
功能码 | Function Code | 指示服务器执行的操作类型 | 范围:1-255(128-255 = 异常响应);分类:公共 / 用户定义 / 保留 |
2. 核心参数表(分模块)
(1)数据模型参数(4 个基础表格)
MODBUS 定义 4 类数据对象,覆盖工业场景中 “比特 / 字”“只读 / 读写” 需求:
数据表格 | 对象类型 | 访问类型 | 数据长度 | 核心用途 | 寻址范围 |
---|---|---|---|---|---|
离散量输入 | 单个比特 | 只读 | 1bit | 采集传感器状态(如按钮、传感器) | 0-65535 |
线圈 | 单个比特 | 读写 | 1bit | 控制执行器(如继电器、指示灯) | 0-65535 |
输入寄存器 | 16 位字 | 只读 | 16bit | 采集模拟量(如温度、电流) | 0-65535 |
保持寄存器 | 16 位字 | 读写 | 16bit | 存储控制参数(如设定值、配置参数) | 0-65535 |
(2)功能码参数(公共功能码核心示例)
公共功能码为强制支持,保证设备互操作性:
功能码(十进制 / 十六进制) | 名称 | 操作对象 | 关键限制 |
---|---|---|---|
01/0x01 | 读线圈 | 线圈 | 一次读 1-2000 个连续线圈 |
02/0x02 | 读离散量输入 | 离散量输入 | 一次读 1-2000 个连续离散量 |
03/0x03 | 读保持寄存器 | 保持寄存器 | 一次读 1-125 个连续寄存器 |
04/0x04 | 读输入寄存器 | 输入寄存器 | 一次读 1-125 个连续寄存器 |
05/0x05 | 写单个线圈 | 线圈 | 仅写 1 个线圈(0x0000=OFF,0xFF00=ON) |
06/0x06 | 写单个寄存器 | 保持寄存器 | 仅写 1 个保持寄存器 |
15/0x0F | 写多个线圈 | 线圈 | 一次写 1-1968 个连续线圈 |
16/0x10 | 写多个寄存器 | 保持寄存器 | 一次写 1-123 个连续寄存器 |
20/0x14 | 读文件记录 | 保持寄存器 | 一次读 1-10000 个连续寄存器 |
21/0x15 | 写文件记录 | 输入寄存器 | 一次写 1-10000 个连续寄存器 |
22/0x16 | 屏蔽写寄存器 | 保持寄存器 | 一次写 1-16 个连续寄存器 |
43/0x2B | 读设备识别码 | 设备信息 | 读取厂商名、产品代码等(分基本 / 正常 / 扩展对象) |
(3)异常码参数(核心错误类型)
服务器通过 “功能码 + 0x80” 标识异常,数据域含 1 字节异常码:
异常码(十进制) | 名称 | 核心含义 | 应用场景 |
---|---|---|---|
01 | 非法功能 | 服务器不支持请求的功能码 | 客户机发送保留功能码 |
02 | 非法数据地址 | 请求的地址不存在或超出范围 | 读线圈起始地址 + 数量超出设备最大地址 |
03 | 非法数据值 | 请求的参数值无效 | 写线圈时数据非 0x0000/0xFF00 |
04 | 从站设备故障 | 服务器执行操作时内部故障 | 寄存器读写时硬件错误 |
06 | 从站设备忙 | 服务器正在处理长任务 | 执行复杂配置时的临时忙状态 |
(4)物理层与传输参数
参数类别 | 核心参数 | 要求 / 范围 | 支撑场景 |
---|---|---|---|
串行链路接口 | 电气接口 | 必需:RS485 两线制;可选:RS485 四线制、RS232 | RS485 支撑多点通信(32 台设备无中继),RS232 支撑点对点(<20m) |
波特率 | 速率 | 必需:9600bps;推荐:19200bps;可选:1200/2400/4800 等 | 9600bps 为基础速率,19200bps 提升传输效率 |
传输模式 | 帧格式 | 必需:RTU 模式;可选:ASCII 模式 | RTU:高数据密度(8 位字节),用 3.5 字符空闲分隔帧;ASCII:易调试(2 字符 / 字节),用 “:” 和 “CRLF” 分隔 |
校验方式 | 字符校验 | 必需:偶校验;可选:奇校验、无校验(需 2 个停止位) | 偶校验减少串行链路字符传输错误 |
帧校验 | 帧完整性 | RTU 用 CRC(16 位);ASCII 用 LRC(8 位) | 确保帧在传输中未被篡改或丢失 |
(5)实现等级参数
MODBUS 串行链路设备分 “基本级” 和 “常规级”,确保不同设备互操作性:
实现等级 | 寻址 | 广播 | 传输模式 | 波特率 | 校验 | 电气接口 |
---|---|---|---|---|---|---|
基本级 | 从站 1-247(可配置) | 支持 | 仅 RTU | 9600(19200 可选) | 仅偶校验 | RS485 两线制 / RS232 |
常规级 | 同基本级 | 支持 | RTU+ASCII(可配置) | 9600/19200 + 可选速率 | 偶校验 + 可选奇 / 无校验 | RS485 两线制(四线制可选)/RS232 |
四、协议关键流程
MODBUS 协议的核心流程围绕 “底层传输适配 + 应用层事务处理” 展开,需结合串行链路(RS232/485)与 TCP/IP 两种底层网络,分别拆解通信、事务处理、数据传输三大核心流程。
(一)通信流程原理:主从 / 客户机 - 服务器双模式
1. 串行链路:主从通信流程(依赖 TIA/EIA-485/232 标准)
串行链路采用单主多从机制,总线中仅 1 个主站发起请求,从站仅响应自身地址的请求,流程如下:
- 主站初始化:主站进入 “空闲” 状态(电源上电后初始状态),仅在此状态可发起请求;
- 请求发送:
- 单播模式:主站向指定从站地址(1-247)发送 ADU(地址域 + PDU+CRC/LRC),随后进入 “等待应答” 状态,启动 “响应超时” 定时器(需覆盖从站处理 + 传输延迟,9600bps 时通常 1 - 几秒);
- 广播模式:主站向地址 0 发送请求(仅支持写操作),无需等待应答,发送后进入 “等待转换延迟” 状态(100-200ms,确保从站完成处理);
- 从站响应:
- 从站持续监听总线,仅接收地址匹配(或广播地址 0)的帧,检测到帧后校验 CRC/LRC(RTU/ASCII 模式);
- 若帧合法且能处理,单播从站返回 ADU(自身地址 + 响应 PDU+CRC/LRC),广播从站无响应;
- 若帧错误(如 CRC 不匹配、地址不匹配),从站不返回任何响应;
- 主站处理:
- 单播:主站收到应答后校验,无错则处理数据,有错则重试(重试次数可配置);若超时无应答,判定为从站故障或传输错误;
- 广播:主站等待转换延迟后回到 “空闲” 状态,可发起新请求。
2. TCP/IP:客户机 - 服务器通信流程(依赖 IETF RFC793/791)
TCP/IP 采用客户机主动发起、服务器侦听机制,基于端口 502 建立连接,流程如下(图 7/9:、):
- 服务器初始化:服务器在 TCP 502 端口持续侦听,支持 “优先连接库”(绑定特定 IP,不主动关闭)和 “非优先连接库”(超限时关闭最早空闲连接);
- 连接建立:
- 客户机向服务器 IP:502 发起 TCP 连接,本地端口 > 1024 且唯一;
- 服务器校验客户机 IP(访问控制模块:白名单 IP 允许连接,未配置 IP 默认禁止),若连接数未超上限(通常 1-16,依设备能力),则建立连接;
- 事务并行处理:
- 客户机可在同一连接上并发发送多个请求(通过 MBAP 头 “事务标识” 区分),无需等待前一响应;
- 服务器接收请求后,按 “事务标识” 独立处理,生成响应后通过原连接返回;
- 连接关闭:
- 通信结束后客户机主动关闭连接;若连接空闲超 “保持连接” 计时器(默认 2 小时),服务器发送试探帧,8 次无响应则关闭连接()。
(二)事务处理流程:请求 - 响应 / 异常响应机制
MODBUS 事务处理的核心是 “PDU 交互”,分为正常响应和异常响应两类,流程如下:
1. 正常事务处理(无差错)
- 客户机 / 主站构造请求 PDU:PDU = 功能码(1 字节)+ 请求数据(如读线圈的 “起始地址 + 线圈数量”),串行链路添加 “地址域 + CRC/LRC” 形成 ADU,TCP 添加 “MBAP 头” 形成 ADU;
- 服务器 / 从站处理请求:
- 校验 ADU 合法性(如地址、CRC/LRC、功能码支持性);
- 执行功能码对应的操作(如读线圈状态、写寄存器值);
- 服务器 / 从站构造响应 PDU:响应 PDU = 原功能码(1 字节)+ 响应数据(如线圈状态、寄存器值),封装为 ADU 后返回;
- 客户机 / 主站处理响应:校验响应 ADU(如 MBAP 事务标识匹配、CRC/LRC 正确),提取数据并反馈给应用层。
2. 异常事务处理(含差错)
当服务器 / 从站无法处理请求(如非法功能码、地址超出范围),触发异常响应:
- 异常检测:服务器在 “功能码校验”“地址校验”“数据校验”“操作执行” 任一环节检测错误(图 10/11:、);
- 异常响应 PDU 构造:异常 PDU=(原功能码 + 0x80)(1 字节)+ 异常码(1 字节),如 “读线圈功能码 01” 错误时,功能码变为 0x81,异常码 02 表示 “非法数据地址”;
- 客户机 / 主站错误处理:识别功能码最高位为 1(异常标识),通过异常码定位错误原因(如 01 = 非法功能、03 = 非法数据值),避免盲目重试。
(三)数据传输流程:三种模式的帧处理逻辑
MODBUS 根据底层网络差异,定义 RTU(串行)、ASCII(串行)、TCP 三种数据传输模式,核心是 “帧边界识别 + 差错校验”。
1. RTU 模式(串行链路必需,默认模式:)
- 帧结构:地址域(1 字节)+ 功能码(1 字节)+ 数据域(0-252 字节)+CRC(2 字节,低字节先传),总长度≤256 字节;
- 帧分隔:通过 “空闲时间” 区分帧 —— 帧起始前需≥3.5 个字符空闲(t3.5),帧内字符间隔≤1.5 个字符空闲(t1.5);波特率 > 19200bps 时,t3.5 固定为 1.75ms,t1.5 固定为 750μs;
- 校验逻辑:CRC 覆盖 “地址域 + 功能码 + 数据域”,发送端预装 CRC 寄存器为 0xFFFF,逐字节异或后移位计算,接收端重新计算并对比。
2. ASCII 模式(串行链路可选)
- 帧结构:起始符 “:”(1 字节)+ 地址域(2 字符)+ 功能码(2 字符)+ 数据域(0-504 字符)+LRC(2 字符)+ 结束符 “CRLF”(2 字节),总长度≤513 字符;
- 帧分隔:通过特殊字符 ——“:” 标识帧起始,“CRLF” 标识帧结束,字符间隔≤1 秒;
- 校验逻辑:LRC 覆盖 “地址域 + 功能码 + 数据域”(不含 “:” 和 “CRLF”),计算方式为 “字节累加→取反→加 1”,接收端重新计算并对比。
3. TCP 模式
- 帧结构:MBAP 头(7 字节)+PDU(功能码 + 数据),总长度≤256 字节();MBAP 头各域含义:事务标识(2 字节,匹配请求响应)、协议标识(2 字节,0x0000=MODBUS)、长度(2 字节,= 单元标识 1 字节 + PDU 长度)、单元标识(1 字节,路由用,直连 TCP 设备用 0xFF);
- 帧分隔:TCP 为字节流,通过 MBAP 头 “长度域” 确定 PDU 结束位置(如长度 = 6,表示后续 6 字节 = 单元标识 1 字节 + PDU 5 字节);
- 校验逻辑:依赖 TCP 的 ACK 重传机制(传输层),无需额外帧校验(以太网 CRC-32 已覆盖链路层)。
五、协议详细配置方法
MODBUS 配置需按 “底层网络(串行 / TCP)→数据链路层→应用层” 分层操作,核心是确保 “设备参数一致 + 互操作性”,具体配置项及方法如下:
(一)串行链路配置(RS232/485,对应文档第二部分)
1. 物理层配置(关键影响通信稳定性)
配置项 | 配置要求 | 配置方法 |
---|---|---|
电气接口 | 必需:RS485 两线制;可选:RS485 四线制、RS232 | - RS485 两线制:D0(A 线)、D1(B 线)+ 公共地,主干两端加 150Ω 终端电阻(匹配阻抗,减少反射);- RS485 四线制:TXD0/TXD1(发送对)、RXD0/RXD1(接收对)+ 公共地,每对两端加终端电阻;- RS232:仅点对点(<20m),TXD 接对方 RXD,RXD 接对方 TXD,公共地共地 |
波特率 | 必需:9600bps;推荐:19200bps;可选:1200/2400/4800/38400bps 等 | 所有设备波特率需一致;波特率精度:发送端≥1%,接收端允许 ±2% 误差 |
字符格式 | 数据位:RTU=8 位,ASCII=7 位;校验位:必需偶校验,可选奇校验 / 无校验(无校验需 2 个停止位);停止位:1 位(有校验)/2 位(无校验) | 通过设备配置工具(如 HMI、串口工具)设置,所有设备字符格式需一致 |
线路偏置 | 若设备需稳定空闲状态,在 D1 线加 450-650Ω 上拉电阻(至 5V),D0 线加 450-650Ω 下拉电阻(至公共地) | 仅在主站或网关处配置 1 组偏置电阻,避免多设备重复偏置导致总线过载;偏置后最大设备数减少 4 台 |
电缆 | 必需屏蔽双绞线;RS485 两线制需 1 对平衡线 + 1 根公共地,4 线制需 2 对平衡线 + 1 根公共地;推荐线径:AWG24(1000m)、CAT5(600m) | 电缆屏蔽层两端接保护地;避免与强电电缆并行敷设;分支电缆≤20m(多分支时≤40m/n,n 为分支数) |
2. 数据链路层配置(影响帧传输正确性)
配置项 | 配置要求 | 配置方法 |
---|---|---|
传输模式 | 必需:RTU;可选:ASCII | 通过设备拨码或软件设置,同一总线所有设备模式需一致;默认优先 RTU(数据密度高) |
从站地址 | 主站无地址;从站地址:1-247(唯一),0 为广播地址 | 禁止同一总线重复地址(会导致总线瘫痪);通过设备手册的 “地址配置” 章节设置(如拨码、串口指令) |
超时参数 | 响应超时(主站):需≥从站处理时间 + 传输时间(9600bps 时建议 1-3 秒);转换延迟(主站广播后):100-200ms | 主站配置工具中设置 “响应超时时间” 和 “广播延迟时间” |
(二)TCP/IP 配置(对应文档第三部分)
1. 网络层配置(确保 TCP 连接建立)
配置项 | 配置要求 | 配置方法 |
---|---|---|
IP 地址 / 子网掩码 | IP 地址:A/B/C 类合法地址;子网掩码:与 IP 地址类型匹配(如 C 类默认 255.255.255.0) | 通过设备 Web 界面、串口工具或 DHCP 服务器分配;禁止 0.0.0.0 或广播地址 |
默认网关 | 与本地 IP 同子网;无网关时设为 127.0.0.1 或本地 IP | 若设备跨网段通信,需配置网关 IP(如 192.168.1.1) |
2. 传输层配置(优化 TCP 连接稳定性)
配置项 | 配置要求 | 配置方法 |
---|---|---|
端口号 | 默认:502(必需侦听);可选:自定义端口(需客户机 / 服务器一致) | 设备配置工具中设置 “MODBUS TCP 端口”;即使自定义端口,502 端口需保持可用(互操作性要求) |
TCP 参数 | - TCP_NODELAY:启用(禁用 NAGLE 算法,减少小报文延迟);- SO_KEEPALIVE:启用(空闲 2 小时后发送试探帧,8 次无响应关闭连接);- SO_REUSEADDR:启用(允许端口在 2MSL 时间内复用) | 通过操作系统或设备驱动配置 TCP 选项;嵌入式设备需厂商提供 “TCP 参数配置” 接口 |
连接管理 | 推荐:自动连接(对应用透明),保持连接不频繁断开;连接数:客户机≤16,服务器≤16(依设备能力) | 客户机配置 “自动重连”;服务器配置 “优先连接 IP 列表”(不主动关闭关键设备连接) |
3. 应用层配置(确保 PDU 正确交互)
配置项 | 配置要求 | 配置方法 |
---|---|---|
MBAP 头参数 | - 事务标识:客户机按递增赋值(匹配请求响应);- 单元标识:直连 TCP 设备用 0xFF,网关路由用从站地址(1-247) | 客户机程序中生成事务标识(如从 1 开始递增);网关配置 “单元标识 - 从站地址” 映射 |
超时参数 | 事务超时:≥网络延迟 + 服务器处理时间(局域网建议 100-500ms,广域网建议 1-3 秒) | 客户机配置 “事务超时时间”,超时后重试(重试次数≤3 次,避免网络拥塞) |
(三)设备一致性配置(必做检查项)
- 参数一致性:同一网络内所有设备的 “传输模式(RTU/ASCII)、波特率、校验位、数据位、停止位(串行)”“端口号、MBAP 单元标识(TCP)” 必须一致;
- 地址唯一性:串行链路从站地址、TCP 设备 IP 地址必须唯一;
- 功能码兼容性:客户机发送的功能码需在服务器支持列表内(公共功能码默认兼容,用户功能码需提前确认);
- 线路检查:串行链路需测通 D0/D1 / 公共地,无短路 / 断路;TCP 链路需 ping 通设备 IP,502 端口可访问(telnet IP 502 测试)。
六、通信帧设计
(一)核心概念:PDU 与 ADU 的关系
- PDU(协议数据单元):应用层核心逻辑单元,与底层网络无关,统一结构为
功能码(1字节)+ 数据域(n字节)
,用于定义 “操作类型 + 操作参数 / 结果”(如 “读线圈” 功能码 01+“起始地址 + 线圈数量”)。 - ADU(应用数据单元):底层传输单元,由 PDU 附加 “地址域 / MBAP 头”“差错校验域” 构成,适配不同传输模式的帧分隔与校验需求。
(二)串行链路通信帧设计(RTU/ASCII 模式,对应文档第二部分)
串行链路依赖 “地址域 + 帧校验” 实现多点通信,分 RTU(默认必需)和 ASCII(可选)两种模式,帧结构需适配串行链路的 “无帧边界” 特性(通过空闲时间或特殊字符分隔)。
1. RTU 模式帧设计(高效紧凑,主流工业场景)
RTU 模式以 “字节流 + CRC 校验” 为核心,数据密度高,适合工业现场高干扰环境,帧结构与关键规则如下:
(1)帧结构(总长度≤256 字节)
域名称 | 长度 | 取值范围 / 作用 |
---|---|---|
地址域 | 1 字节 | 0(广播地址,无响应)、1-247(从站地址,唯一)、248-255(保留) |
PDU | 253 字节(最大) | 功能码(1 字节,1-255)+ 数据域(0-252 字节,如起始地址、数量、数据) |
CRC 校验域 | 2 字节 | 覆盖 “地址域 + PDU” 的 16 位循环冗余校验值,低字节先传输 |
(2)关键设计规则
- 帧分隔机制:通过 “空闲时间” 区分帧 —— 帧起始前需≥3.5 个字符时间(t3.5),帧内字符间隔≤1.5 个字符时间(t1.5);波特率 > 19200bps 时,t3.5 固定为 1.75ms,t1.5 固定为 750μs(避免高速传输时计时误差)、。
- CRC 计算逻辑:预装 16 位寄存器为 0xFFFF,逐字节与寄存器低字节异或后右移 1 位,若 LSB 为 1 则与多项式 0xA001 异或,重复 8 次 / 字节,最终结果低字节先传(如 CRC 值 0x1241,传输顺序为 0x41→0x12)、。
- 示例:请求 “读从站 1 的线圈 20-38(起始地址 0x0013,数量 0x0013)” 的 RTU 帧(十六进制):
01 01 00 13 00 13 CD 6B
,其中 “01” 为从站地址,“01” 为功能码,“00 13 00 13” 为数据域,“CD 6B” 为 CRC。
2. ASCII 模式帧设计(易调试,低干扰场景)
ASCII 模式以 “字符编码 + LRC 校验” 为核心,每个字节用 2 个 ASCII 字符表示,易人工读取,帧结构与关键规则如下:
(1)帧结构(总长度≤513 字符)
域名称 | 长度 | 取值范围 / 作用 |
---|---|---|
起始符 | 1 字符 | “:”(ASCII 0x3A),标识帧起始 |
地址域 | 2 字符 | 十六进制 00-FF(对应十进制 0-255,含义同 RTU) |
功能码 | 2 字符 | 十六进制 01-FF(对应十进制 1-255,含义同 RTU) |
数据域 | 0-504 字符 | 十六进制编码,每个字节对应 2 个字符(如数据 0x12 表示为 “12”) |
LRC 校验域 | 2 字符 | 覆盖 “地址域 + 功能码 + 数据域” 的 8 位纵向冗余校验值,ASCII 编码 |
结束符 | 2 字符 | “CRLF”(ASCII 0x0D+0x0A),标识帧结束 |
(2)关键设计规则
- 帧分隔机制:通过 “起始符:” 和 “结束符 CRLF” 明确帧边界,字符间隔≤1 秒(超过则判定为帧错误)。
- LRC 计算逻辑:对 “地址域 + 功能码 + 数据域” 的字节累加(忽略进位),取二进制补码(累加值→取反→加 1),结果用 2 个 ASCII 字符表示(如 LRC 值 0x61,编码为 “61”)、。
- 示例:请求 “读从站 1 的线圈 20-38” 的 ASCII 帧(字符):
:0101001300139C\r\n
,其中 “:” 为起始符,“01” 为从站地址,“01” 为功能码,“00130013” 为数据域,“9C” 为 LRC,“\r\n” 为结束符。
(三)TCP/IP 通信帧设计(MBAP 头 + PDU,跨网络场景)
TCP/IP 模式依赖 “MBAP 头(MODBUS 协议头)” 实现事务匹配与路由,适配 TCP 的 “字节流” 特性,帧结构与关键规则如下(对应文档第三部分):
1. 帧结构(总长度≤256 字节)
域名称 | 长度 | 取值范围 / 作用 |
---|---|---|
MBAP 头 | 7 字节 | 含事务标识、协议标识、长度、单元标识,用于事务匹配与路由 |
PDU | 249 字节(最大) | 与串行链路一致:功能码(1 字节)+ 数据域(0-248 字节) |
2. MBAP 头各域详解(核心适配 TCP 特性)
MBAP 子域 | 长度 | 取值 / 作用 | 客户机 / 服务器职责 |
---|---|---|---|
事务标识 | 2 字节 | 0x0000-0xFFFF,唯一标识单个事务(匹配请求与响应) | 客户机生成(递增),服务器复制请求值返回 |
协议标识 | 2 字节 | 0x0000(仅 MODBUS 协议),用于多路复用 | 客户机设为 0x0000,服务器复制返回 |
长度 | 2 字节 | 后续字节数(= 单元标识 1 字节 + PDU 长度) | 客户机计算请求长度,服务器计算响应长度 |
单元标识 | 1 字节 | 0xFF(直连 TCP 设备)、1-247(串行链路从站地址,网关路由用) | 客户机按需设置,服务器复制返回 |
3. 关键设计规则
- 帧定位机制:TCP 无帧边界,通过 MBAP 头 “长度域” 确定 PDU 结束位置(如长度 = 6,表示后续 6 字节 = 单元标识 1 字节 + PDU 5 字节)。
- 端口与传输:所有帧通过 TCP 502 端口传输(保留端口,必需侦听),自定义端口需确保客户机 / 服务器一致,且 502 端口需保持可用(互操作性要求)、。
- 示例:请求 “读寄存器 108-110(起始地址 0x006B,数量 0x0003)” 的 TCP 帧(十六进制):
00 01 00 00 00 06 FF 03 00 6B 00 03
,其中 “00 01” 为事务标识,“00 00” 为协议标识,“00 06” 为长度(=1+5),“FF” 为单元标识,“03 00 6B 00 03” 为 PDU、。
(四)异常响应帧设计(统一格式,跨模式兼容)
当服务器 / 从站无法处理请求时,返回异常响应帧,核心是 “功能码最高位设 1 + 异常码”,格式跨 RTU/ASCII/TCP 统一:
1. 异常响应 PDU 结构
域名称 | 长度 | 取值 / 作用 |
---|---|---|
异常功能码 | 1 字节 | 原功能码 + 0x80(如原功能码 01→0x81) |
异常码 | 1 字节 | 01(非法功能)、02(非法数据地址)、03(非法数据值)、04(从站故障)等 |
2. 示例(RTU 模式)
请求 “读从站 1 的非法地址线圈”,异常响应帧(十六进制):01 81 02 F8 3A
,其中 “01” 为从站地址,“81” 为异常功能码(01+0x80),“02” 为异常码(非法数据地址),“F8 3A” 为 CRC。
七、协议使用注意事项
基于文档规范,MODBUS 协议使用需重点关注 “参数一致性、物理部署、通信交互、故障规避” 四大类注意事项,确保落地稳定性与互操作性:
(一)参数一致性注意事项(核心前提)
- 串行链路参数必须统一:所有设备的 “波特率、传输模式(RTU/ASCII)、校验位、数据位、停止位” 必须完全一致,否则帧无法解析(如 RTU 设备接收 ASCII 帧会判定为 CRC 错误);
- TCP/IP 参数匹配:客户机与服务器的 “端口号(默认 502)、MBAP 头协议标识(必须为 0x0000)” 必须一致,否则服务器拒绝连接或丢弃请求;
- 功能码兼容性:客户机发送的功能码必须在服务器支持列表内(公共功能码默认兼容,用户功能码需提前确认),避免发送保留功能码(如 24-64)。
(二)物理部署注意事项(串行链路关键)
- RS485 线路部署:
- 终端电阻:仅在主干电缆两端加 150Ω 终端电阻,分支电缆禁止加(避免信号反射);
- 线路偏置:仅在主站或网关处加 1 组偏置电阻(D1 上拉 450-650Ω 至 5V,D0 下拉 450-650Ω 至地),禁止多设备重复偏置(导致总线过载);
- 电缆选型:必需使用屏蔽双绞线,AWG24 及以上线径(1000m 传输),避免与强电电缆并行敷设(间距≥30cm);
- RS232 距离限制:通信距离≤20m,超过需改用 RS485(加中继可延长至 4000m);
- 接地规范:公共地需单端接地(如主站侧),避免两端接地产生地环流(干扰信号)。
(三)通信交互注意事项
- 地址唯一性:
- 串行链路从站地址 1-247 必须唯一,禁止重复(会导致总线冲突,主站无法通信);
- TCP/IP 设备 IP 地址必须唯一,避免 IP 冲突导致连接失败;
- 帧完整性:
- RTU 模式:帧内字符间隔≤1.5 个字符时间,帧间间隔≥3.5 个字符时间(波特率 > 19200bps 时固定为 750μs/1.75ms),否则帧被丢弃;
- ASCII 模式:帧必须以 “:” 起始、“CRLF” 结束,字符间隔≤1 秒;
- 超时与重试:
- 主站 / 客户机需设置合理超时(串行响应超时 1-3 秒,TCP 事务超时 100-500ms),避免过短导致误判、过长影响效率;
- 重试次数≤3 次(避免网络拥塞),重试间隔≥响应超时时间;
- 广播限制:仅支持写操作(如功能码 05/15),禁止广播读操作(无响应导致主站超时)。
(四)故障规避与异常处理注意事项
- 校验机制启用:
- 串行链路必须启用 CRC(RTU)或 LRC(ASCII)校验,禁止关闭(避免传输错误未被检测);
- TCP 模式依赖 TCP 重传,无需额外帧校验,但需启用 SO_KEEPALIVE(检测断连);
- 异常码解读:收到异常响应后,需按异常码排查(如 01 = 非法功能码→检查功能码是否支持,02 = 非法地址→检查地址范围),禁止盲目重试;
- 数据编码:多字节数据(如 16 位寄存器)采用 Big-Endian 编码(先传 MSB),禁止小端序(导致数据解析错误,如 0x1234 传为 0x3412);
- 连接管理(TCP):
- 避免频繁断开 / 建立连接(推荐保持连接),减少 TCP “时间等待” 状态(启用 SO_REUSEADDR);
- 服务器连接数不超过上限(1-16),优先保障关键设备连接(配置 “优先连接 IP 列表”)。
八、MODBUS 与同类工业协议的原理及使用差异
工业自动化领域常见同类协议包括 Profinet(西门子)、EtherNet/IP(罗克韦尔)、DeviceNet(ODVA),MODBUS 与它们的差异核心在于 “分层架构、通信机制、适用场景”,以下基于文档中 MODBUS 的核心特性展开对比:
(一)原理差异(核心是 “轻量性 vs 实时性 / 复杂性”)
对比维度 | MODBUS | Profinet | EtherNet/IP | DeviceNet |
---|---|---|---|---|
OSI 分层映射 | 仅定义第 7 层(应用层),依赖底层网络(串行链路第 1-2 层、TCP/IP 第 1-4 层),无自定义中间层(、) | 全分层:第 1 层(以太网物理层)、第 2 层(实时以太网帧)、第 7 层(Profinet 应用层),自定义 “实时通道”(IRT)优化时延 | 基于 CIP 协议:第 1-4 层(TCP/IP 或 UDP/IP)、第 7 层(CIP 应用层),CIP 定义对象模型和服务 | 基于 CAN 总线:第 1 层(CAN 物理层)、第 2 层(CAN 数据链路层)、第 7 层(DeviceNet 应用层),依赖 CAN 的 ID 优先级 |
通信机制 | 请求 - 应答(主从 / TCP 客户机 - 服务器),无主动推送;串行链路单主,TCP 支持多客户机并发(、) | 混合机制:周期传输(实时数据,如 I/O)+ 非周期传输(非实时数据,如配置),支持 “生产者 - 消费者”(设备主动推送数据) | 生产者 - 消费者机制:设备按 “对象 ID” 推送数据,订阅者接收,无需请求;支持 TCP(可靠)和 UDP(实时) | 主从 + 生产者 - 消费者:主站管理总线,从站可主动推送事件数据(如故障报警) |
数据单元 | PDU(功能码 + 数据)+ADU(底层附加域),结构简单,无对象封装(、) | 实时帧(RT_FRAME)+ 标准以太网帧,实时帧含 “实时标识”,数据按 “过程对象” 封装 | CIP 对象:数据封装为 “属性 - 服务” 对象(如 “温度传感器对象” 含 “当前值” 属性),服务对应操作 | 对象模型:数据按 “设备对象”“装配对象” 封装,支持 “显性报文”(配置)和 “隐性报文”(实时 I/O) |
差错控制 | 多层校验:字符级(奇偶校验)、帧级(CRC/LRC)、应用级(异常响应)(、) | 链路层(以太网 CRC-32)+ 应用层(实时帧校验和),支持 “冗余连接”(双网备份) | 传输层(TCP 重传)+ 应用层(CIP 校验),支持 “设备健康状态监测” | CAN 数据链路层(CRC-15)+ 应用层(报文校验),支持 “总线错误计数” |
(二)使用差异(核心是 “通用性 vs 场景适配性”)
对比维度 | MODBUS | Profinet | EtherNet/IP | DeviceNet |
---|---|---|---|---|
适用场景 | 中低速、非实时工业场景:如传感器数据采集(温度、压力)、PLC 与 HMI 通信、小型控制系统 | 高速、实时场景:如运动控制(机器人、数控机床)、大型生产线(时延≤1ms) | 中高速、灵活场景:如过程控制(化工、冶金)、混合控制系统(支持 TCP/UDP 切换) | 低速、低成本场景:如传感器、执行器分布式连接(汽车生产线、物流设备) |
互操作性 | 极高:公共功能码(01/03/05 等)全球统一,无厂商壁垒,任何支持 MODBUS 的设备可直接通信 | 较高:需符合 Profinet 一致性测试,但依赖西门子生态(如硬件芯片、配置工具) | 较高:需符合 ODVA 认证,支持多厂商设备,但 CIP 对象配置较复杂 | 较高:需符合 ODVA 认证,CAN 总线成本低,但传输距离短(≤500m) |
复杂度 | 极低:帧结构简单(无复杂对象封装),开发难度低(仅需实现 PDU/ADU 解析),适合中小厂商 | 高:需实现实时帧调度、IRT 协议,依赖专用芯片(如西门子 PN 芯片),开发周期长 | 中:需实现 CIP 对象模型和服务,配置工具(如 RSLogix)较复杂 | 中:需熟悉 CAN 总线特性,设备地址和报文 ID 配置需按规范 |
传输性能 | 串行:9600-19200bps,1000m(RS485);TCP:100Mbps(以太网),时延≥10ms(非实时) | 100Mbps/1Gbps(以太网),实时时延≤1ms(IRT),周期传输最小周期 125μs | 100Mbps/1Gbps(以太网),实时时延≤10ms(UDP),非实时时延≥100ms(TCP) | 125/250/500kbps(CAN),传输距离≤500m(500kbps 时≤100m) |
成本 | 极低:串行链路(RS485 芯片成本 < 1 美元),TCP 设备无额外硬件成本,无需授权费 | 高:专用芯片(如 PN-IRT 芯片)成本高,需支付 Profinet 联盟认证费 | 中:需支付 ODVA 认证费,无专用芯片,但配置工具(如罗克韦尔软件)需付费 | 低:CAN 芯片成本低(<2 美元),无需认证费,但总线节点数有限(≤64) |
(三)MODBUS 的核心优势与局限性
1. 核心优势(文档支撑的特性)
- 通用性:支持串行 / TCP 两种底层网络,公共功能码统一,全球千万级设备兼容;
- 轻量性:帧结构简单,开发难度低,适合资源受限设备(如 8 位 MCU 传感器);
- 灵活性:支持用户定义功能码(65-72、100-110),可扩展自定义需求(如设备专用配置指令)();
- 低成本:串行链路无需复杂硬件,TCP 无需专用芯片,无授权或认证费用(、)。
2. 局限性(对比同类协议的短板)
- 实时性差:依赖请求 - 应答机制,无周期传输或主动推送,无法满足运动控制等低时延场景;
- 功能单一:仅支持数据读写,无冗余、安全(如加密)、故障诊断等高级功能(同类协议如 Profinet 支持双网冗余);
- 串行链路瓶颈:单主机制限制并发,RS485 无中继仅支持 32 台设备,传输速率低(≤38400bps)。