Modbus是工业现场最通用的开放式串行通信协议 ,无需授权、跨品牌兼容(三菱、西门子、台达、施耐德等PLC均支持),而Modbus RTU 是其最常用的串行通信模式,主打抗干扰强、传输效率高、硬件成本低,广泛用于PLC与PLC、PLC与变频器/传感器/触摸屏等工业设备的点对点/多点通信。
一、Modbus RTU 概念
1. 通信架构:主从式(一主多从)
Modbus RTU采用单主站多从站的通信规则,这是其最核心的通信逻辑,也是和其他协议的关键区别:
- 主站:唯一发起通信请求的设备(如主PLC、触摸屏、上位机),主动发送"读/写"指令,等待从站响应。
- 从站 :被动响应的设备(如从PLC、变频器、传感器),每个从站有唯一的地址(1~247) ,仅接收主站发给自身的指令,执行后返回响应帧;从站之间不能互相通信。
- 广播:主站地址写0时为广播指令,所有从站接收并执行(仅支持写指令,无响应)。
2. 通信介质与物理层
Modbus RTU基于串行异步通信 ,主流硬件为RS485(少量场景用RS232),两者对比如下(考试/实操重点):
| 接口 | 通信方式 | 节点数 | 传输距离 | 适用场景 |
|---|---|---|---|---|
| RS232 | 点对点(单主单从) | 2个 | ≤15米 | 近距离一对一(如PLC与电脑) |
| RS485 | 差分信号半双工 | 最多32个(加中继可扩展至128个) | ≤1200米 | 工业现场多节点(如PLC带多台变频器) |
RS485 关键接线要求(实操)
- 核心接线:两根差分线A(+)、B(-) ,所有设备的A接A、B接B,严禁接反(接反直接无通信)。
- 终端电阻:在总线两端的设备 上接120Ω/1W的终端电阻(匹配总线阻抗,减少信号反射),中间设备不接。
- 布线规范:用屏蔽双绞线,屏蔽层单端接地(接大地),远离动力线(强电干扰),总线尽量走直线,不星型连接。
3. 通信参数(必须全网一致)
所有参与Modbus RTU通信的设备,波特率、数据位、校验位、停止位 这4个参数必须完全相同,否则会出现"通信无响应、数据乱码",是实操中最常见的错误点,也是考试高频考点。
- 波特率:常用9600bps(默认),也可设4800/19200bps(波特率越高,传输越快,抗干扰越弱)。
- 数据位:固定8位(Modbus RTU标准)。
- 校验位:常用偶校验(Even) 或无校验(None)(无校验时停止位设为2位)。
- 停止位:1位(偶校验/奇校验)或2位(无校验)。
- 标准配置:9600 8 E 1(9600波特率、8数据位、偶校验、1停止位)。
4. Modbus RTU 与 Modbus ASCII 的区别
Modbus有RTU、ASCII、TCP三个主流版本,RTU和ASCII均为串行通信,核心区别如下:
| 特性 | Modbus RTU | Modbus ASCII |
|---|---|---|
| 数据格式 | 二进制(十六进制) | 十六进制字符(ASCII码) |
| 传输效率 | 高(二进制占字节少) | 低(字符占字节多) |
| 抗干扰 | 强(工业现场首选) | 弱(仅适用于低干扰场景) |
| 帧分隔 | 3.5个字符时间的静默间隔 | 起始符(:)+ 结束符(CR/LF) |
| 校验方式 | CRC16(2字节,严格) | LRC(1字节,简单) |
结论 :工业现场和PLC考试均以Modbus RTU为核心,ASCII基本不用,只需了解区别即可。
二、Modbus RTU 帧格式
Modbus RTU的通信单位是帧 ,主站发请求帧 ,从站回响应帧 ,帧由4个固定部分 组成,无起始/结束符 ,通过3.5个字符时间的静默间隔 区分帧边界,帧格式为二进制 ,按字节 传输,低位在前,高位在后(CRC校验尤为重要)。
通用帧格式(所有RTU通信均遵循)
| 字段 | 字节数 | 取值/含义 |
|---|---|---|
| 从站地址 | 1 | 1~247(唯一),0为广播 |
| 功能码 | 1 | 1 ~ 127(有效),128~255为异常响应(功能码+128) |
| 数据域 | N | 随功能码变化(请求帧:读/写的地址、数量/值;响应帧:返回的数/确认信息) |
| CRC16校验 | 2 | 对"从站地址+功能码+数据域"的CRC16循环冗余校验,低字节在前,高字节在后 |
关键说明
- 功能码异常 :若从站执行指令出错(如地址越界、功能码不支持),会返回异常响应帧,格式为「从站地址 + (功能码+128) + 异常码 + CRC16」,异常码表示错误原因(如01=非法功能码、02=非法数据地址)。
- CRC16校验 :Modbus RTU的核心校验方式,必须正确,否则从站会丢弃帧,不做任何响应;CRC16的计算有固定算法,PLC和调试软件会自动计算,无需手动算,只需知道校验范围和字节顺序。
帧格式实例(读保持寄存器,最常用)
以主站读从站1的40001~40002保持寄存器为例,功能码03,通信参数9600 8 E 1:
- 请求帧 (十六进制):
01 03 00 00 00 02 C4 0B- 01:从站地址
- 03:功能码(读保持寄存器)
- 00 00:起始寄存器地址(40001对应偏移0000,关键偏移!)
- 00 02:读取寄存器数量(2个)
- C4 0B:CRC16校验(低字节C4,高字节0B)
- 响应帧 (十六进制,假设寄存器值为000A、000B):
01 03 04 00 0A 00 0B 70 41- 01:从站地址
- 03:功能码(和请求一致)
- 04:返回数据的字节数(2个寄存器×2字节=4字节)
- 00 0A 00 0B:返回的寄存器值(40001=000A,40002=000B)
- 70 41:CRC16校验
三、Modbus RTU 寄存器分类
Modbus协议定义了4类寄存器 ,用于存储不同类型的数据(离散量/数字量、模拟量),只读/读写属性固定 ,地址为十进制 ,有固定的地址段和偏移规则 ,这是PLC编程中地址映射的核心。
核心原则 :Modbus寄存器地址为逻辑地址 ,需映射到PLC的实际寄存器 (如三菱的X/Y/D、西门子的I/Q/MW),映射的关键是偏移量(逻辑地址的后4位-1)。
4类寄存器详细说明
| 寄存器类型 | 逻辑地址段 | 读写属性 | 数据类型 | 对应PLC常用寄存器 | 核心用途 | 地址偏移规则(关键) |
|---|---|---|---|---|---|---|
| 线圈寄存器(Coil) | 00001~09999 | 读写 | 离散量(0/1) | 三菱Y、西门子Q | 控制设备输出(如继电器、指示灯) | 逻辑地址-00001=PLC映射偏移 |
| 离散输入寄存器 | 10001~19999 | 只读 | 离散量(0/1) | 三菱X、西门子I | 采集设备输入(如按钮、接近开关) | 逻辑地址-10001=PLC映射偏移 |
| 输入寄存器 | 30001~39999 | 只读 | 16位无符号整数 | 三菱AI、西门子PIW | 采集模拟量输入(如温度、压力) | 逻辑地址-30001=PLC映射偏移 |
| 保持寄存器 | 40001~49999 | 读写 | 16位无符号整数 | 三菱D、西门子MW | 存储/读写模拟量(如设定值、参数) | 逻辑地址-40001=PLC映射偏移 |
地址映射实例(三菱PLC为例)
Modbus保持寄存器40001 → 偏移0000 → 映射到三菱PLCD0 ;
Modbus保持寄存器40005 → 偏移0004 → 映射到三菱PLCD4 ;
Modbus线圈寄存器00003 → 偏移0002 → 映射到三菱PLCY2 ;
Modbus离散输入寄存器10002 → 偏移0001 → 映射到三菱PLCX1。
总结 :40001对应D0是工业现场和考试的默认映射规则,所有保持寄存器的偏移均以此为基准。
四、Modbus RTU 常用功能码
功能码是Modbus RTU的指令核心 ,1字节(01~127),表示主站对从站的操作指令 (读/写),不同功能码对应不同寄存器的操作,无需记忆所有功能码,只需掌握8个常用的(覆盖99%的PLC通信场景)。
读类功能码(主站读从站数据,最常用)
| 功能码 | 功能名称 | 适用寄存器 | 核心参数(数据域) |
|---|---|---|---|
| 01 | 读线圈状态 | 线圈寄存器(0区) | 起始地址、读取数量(最多2000个) |
| 02 | 读输入状态 | 离散输入寄存器(1区) | 起始地址、读取数量(最多2000个) |
| 03 | 读保持寄存器 | 保持寄存器(4区) | 起始地址、读取数量(最多125个) |
| 04 | 读输入寄存器 | 输入寄存器(3区) | 起始地址、读取数量(最多125个) |
写类功能码(主站写数据到从站,最常用)
| 功能码 | 功能名称 | 适用寄存器 | 核心参数(数据域) |
|---|---|---|---|
| 05 | 写单个线圈 | 线圈寄存器(0区) | 线圈地址、写入值(0000=关,FF00=开) |
| 06 | 写单个保持寄存器 | 保持寄存器(4区) | 寄存器地址、写入值(16位整数) |
| 15(0F) | 写多个线圈 | 线圈寄存器(0区) | 起始地址、数量、字节数、写入值 |
| 16(10) | 写多个保持寄存器 | 保持寄存器(4区) | 起始地址、数量、字节数、写入值 |
功能码使用原则
- 只读寄存器不能写 :如用06功能码写3区输入寄存器,从站会返回异常码02(非法数据地址)。
- 数量限制:读保持寄存器最多125个,读线圈最多2000个,超出会报错。
- 05/15写线圈 :写入值为0000(二进制0) 表示断开,FF00(二进制1) 表示闭合(固定规则,不能改)。
五、PLC 作为 Modbus RTU 主站/从站的编程实操
以三菱FX系列PLC (工业最常用)为例,搭配FX2N-485-BD RS485通信板,讲解从站编程 和主站编程的核心步骤,其他品牌PLC(西门子、台达)编程逻辑一致,仅指令不同。
前置准备
- 硬件:主PLC(FX3U)+ 从PLC(FX2N)+ 2块FX2N-485-BD + 屏蔽双绞线 + 120Ω终端电阻。
- 通信参数:全网设为9600 8 E 1 ,主站无地址,从站地址设为1。
- 寄存器映射:从站PLC的D0-D19映射到Modbus 40001-40020,Y0-Y7映射到00001-00008,X0-X7映射到10001-10008。
1. PLC 作为 Modbus RTU 从站(被动响应,简单)
三菱PLC做从站,无需写复杂逻辑,只需用RS指令 (串行通信指令)配置通信参数,开启Modbus RTU从站模式即可,核心是参数配置。
核心指令:RS指令(梯形图)
RS D0 K20 H0 K1 H1
; 解释:
; D0:通信数据存储起始地址
; K20:通信数据长度(20字节)
; H0:通信端口(FX系列固定H0)
; K1:波特率/校验位设置(K1=9600 8 E 1,固定对应标准配置)
; H1:从站地址(设为1,和通信参数一致)
编程步骤
- 打开GX Works2,新建FX3U项目,进入梯形图编辑。
- 编写RS指令,用M8000(运行监控) 触发(保持常通)。
- 下载程序到从站PLC,上电,从站即进入Modbus RTU从站模式,等待主站请求。
2. PLC 作为 Modbus RTU 主站(主动请求,核心)
三菱PLC做主站,推荐使用MODRW专用指令(Modbus RTU读/写指令,内置CRC16校验,无需手动计算),替代复杂的RS指令,是工业现场和考试的首选。
核心指令:MODRW指令(梯形图)
MODRW S1 S2 S3 S4 D
; 官方标准格式,解释:
; S1:0=主站模式,1=从站模式(主站设0)
; S2:功能码(03=读保持寄存器,06=写单个保持寄存器)
; S3:从站地址(和从站一致,设1)
; S4:读取/写入的寄存器数量(读设2=读2个,写设1=写1个)
; D:主站存储读取数据/写入数据的起始地址
编程实例1:主站读从站40001-40002保持寄存器
MODRW K0 K3 K1 K2 D100
; 触发条件:X0(启动按钮)
; 解释:主站模式,功能码03,从站1,读2个保持寄存器,数据存在主站D100-D101
; 对应:从站D0→主站D100,从站D1→主站D101
编程实例2:主站写从站40001保持寄存器(值为100)
MOV K100 D200 ; 先将100写入主站D200(写入值存储地址)
MODRW K0 K6 K1 K1 D200
; 触发条件:X1(写按钮)
; 解释:主站模式,功能码06,从站1,写1个保持寄存器,写入值存在主站D200
; 对应:主站D200=100→从站D0=100(40001=100)
编程步骤
- 主站PLC编写MODRW指令,设置触发条件(X0/X1,手动触发)。
- 下载程序到主站PLC,上电,接好RS485总线。
- 按下X0,主站发送读请求,从站响应,主站D100-D101即可读取从站数据;按下X1,主站发送写请求,从站D0被写入100。
六、Modbus RTU 调试与故障排查
通信调试的核心是**"先硬件,后软件;先参数,后程序",90%的Modbus RTU通信故障均为硬件接线、参数不匹配、地址映射错误**,无需复杂排查,按以下步骤逐一验证即可。
通用调试步骤
- 硬件排查:检查RS485接线(A接A、B接B)、终端电阻(两端接120Ω)、屏蔽层接地,用万用表测A/B之间的电压(正常为2~5V),无短路/断路。
- 参数排查 :所有设备的波特率、数据位、校验位、停止位、从站地址完全一致,无任何差异。
- 软件调试 :用串口调试助手(如SSCOM、Modbus Poll) 监控通信帧,电脑通过RS485转USB接总线,查看主站的请求帧 和从站的响应帧是否完整、CRC校验是否正确。
- 程序排查 :检查PLC指令的功能码、寄存器地址、偏移量是否正确,无越界/错用功能码。
常见故障及解决方法(高频考点)
| 故障现象 | 最可能原因 | 解决方法 |
|---|---|---|
| 通信无响应,无任何帧 | 1. A/B接反;2. 参数不匹配;3. 无终端电阻;4. 从站地址错误 | 1. 调换A/B;2. 统一全网参数;3. 两端加120Ω;4. 修正从站地址 |
| 能读数据,不能写数据 | 1. 功能码错(用读功能码写);2. 寄存器只读;3. 写值越界 | 1. 换写功能码(06/16);2. 换可写寄存器(4区/0区);3. 修正写入值 |
| 数据读写乱码/错误 | 1. 地址偏移错误;2. 数据长度不匹配;3. CRC校验错误 | 1. 按40001→D0映射;2. 调整读取/写入数量;3. 检查帧完整性 |
| 通信不稳定,偶尔断连 | 1. 总线过长/节点过多;2. 强电干扰;3. 终端电阻接错;4. 波特率过高 | 1. 加RS485中继;2. 用屏蔽线,远离动力线;3. 终端电阻仅接两端;4. 降波特率至4800bps |
七、核心考点总结(期末复习速记)
- Modbus RTU是主从式串行通信,一主多从,从站地址唯一(1~247)。
- 物理层主流RS485 ,接线A-A、B-B,两端接120Ω终端电阻,通信参数全网一致(9600 8 E 1)。
- 帧格式:从站地址+功能码+数据域+CRC16,CRC16低字节在前,高字节在后。
- 4类寄存器核心映射:40001→D0,00001→Y0,10001→X0,30001→AI0。
- 常用功能码:03(读保持寄存器)、06(写单个保持寄存器)、01(读线圈)、05(写单个线圈)。
- 故障排查优先级:参数不匹配 > 接线错误 > 程序错误 > 硬件故障。
八、延伸:Modbus RTU 与 Modbus TCP 的区别
Modbus TCP是基于以太网的Modbus协议,和RTU的核心区别如下,了解即可:
- 物理层:RTU为RS485,TCP为以太网(RJ45)。
- 传输效率:TCP远高于RTU(100/1000Mbps)。
- 节点数:TCP无限制,RTU最多32个(加中继除外)。
- 通信架构:TCP支持多主多从,RTU仅一主多从。
- 帧格式:TCP在RTU帧基础上加MBAP报文头(7字节),基于TCP/IP协议。
应用场景 :近距离工业现场用Modbus RTU ,远距离/多节点工控网用Modbus TCP。