Modbus RTU(PLC通信版)

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循环冗余校验,低字节在前,高字节在后

关键说明

  1. 功能码异常 :若从站执行指令出错(如地址越界、功能码不支持),会返回异常响应帧,格式为「从站地址 + (功能码+128) + 异常码 + CRC16」,异常码表示错误原因(如01=非法功能码、02=非法数据地址)。
  2. 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区) 起始地址、数量、字节数、写入值

功能码使用原则

  1. 只读寄存器不能写 :如用06功能码写3区输入寄存器,从站会返回异常码02(非法数据地址)
  2. 数量限制:读保持寄存器最多125个,读线圈最多2000个,超出会报错。
  3. 05/15写线圈 :写入值为0000(二进制0) 表示断开,FF00(二进制1) 表示闭合(固定规则,不能改)。

五、PLC 作为 Modbus RTU 主站/从站的编程实操

三菱FX系列PLC (工业最常用)为例,搭配FX2N-485-BD RS485通信板,讲解从站编程主站编程的核心步骤,其他品牌PLC(西门子、台达)编程逻辑一致,仅指令不同。

前置准备

  1. 硬件:主PLC(FX3U)+ 从PLC(FX2N)+ 2块FX2N-485-BD + 屏蔽双绞线 + 120Ω终端电阻。
  2. 通信参数:全网设为9600 8 E 1 ,主站无地址,从站地址设为1
  3. 寄存器映射:从站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,和通信参数一致)
编程步骤
  1. 打开GX Works2,新建FX3U项目,进入梯形图编辑。
  2. 编写RS指令,用M8000(运行监控) 触发(保持常通)。
  3. 下载程序到从站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)
编程步骤
  1. 主站PLC编写MODRW指令,设置触发条件(X0/X1,手动触发)。
  2. 下载程序到主站PLC,上电,接好RS485总线。
  3. 按下X0,主站发送读请求,从站响应,主站D100-D101即可读取从站数据;按下X1,主站发送写请求,从站D0被写入100。

六、Modbus RTU 调试与故障排查

通信调试的核心是**"先硬件,后软件;先参数,后程序",90%的Modbus RTU通信故障均为硬件接线、参数不匹配、地址映射错误**,无需复杂排查,按以下步骤逐一验证即可。

通用调试步骤

  1. 硬件排查:检查RS485接线(A接A、B接B)、终端电阻(两端接120Ω)、屏蔽层接地,用万用表测A/B之间的电压(正常为2~5V),无短路/断路。
  2. 参数排查 :所有设备的波特率、数据位、校验位、停止位、从站地址完全一致,无任何差异。
  3. 软件调试 :用串口调试助手(如SSCOM、Modbus Poll) 监控通信帧,电脑通过RS485转USB接总线,查看主站的请求帧 和从站的响应帧是否完整、CRC校验是否正确。
  4. 程序排查 :检查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

七、核心考点总结(期末复习速记)

  1. Modbus RTU是主从式串行通信,一主多从,从站地址唯一(1~247)。
  2. 物理层主流RS485 ,接线A-A、B-B,两端接120Ω终端电阻,通信参数全网一致(9600 8 E 1)。
  3. 帧格式:从站地址+功能码+数据域+CRC16,CRC16低字节在前,高字节在后。
  4. 4类寄存器核心映射:40001→D0,00001→Y0,10001→X0,30001→AI0
  5. 常用功能码:03(读保持寄存器)、06(写单个保持寄存器)、01(读线圈)、05(写单个线圈)
  6. 故障排查优先级:参数不匹配 > 接线错误 > 程序错误 > 硬件故障

八、延伸: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

相关推荐
鲁邦通物联网9 小时前
架构拆解:如何构建支持室外内外网络切换的机器人梯控中间件?
机器人·机器人梯控·agv梯控·机器人乘梯·机器人自主乘梯·agv机器人梯控
xixixi777779 小时前
太赫兹通信:6G时代的“超高速无线血液”
无线通信·信息与通信·无线·通信·6g·频谱·太赫兹
不做无法实现的梦~9 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
大江东去浪淘尽千古风流人物11 小时前
【SLAM】Hydra-Foundations 层次化空间感知:机器人如何像人类一样理解3D环境
深度学习·算法·3d·机器人·概率论·slam
大江东去浪淘尽千古风流人物18 小时前
【VLN】VLN Paradigm Alg:Reinforcement learning 强化学习及其细节(4)
机器人·大模型·概率论·端侧部署·巨身智能
才兄说19 小时前
机器人租售出场分几次?分段专人触发
机器人
麦德泽特19 小时前
基于 ESP32S3芯片的机器人设计与实现
机器人
元让_vincent19 小时前
DaliyCoding C++ ROS | C++ 避坑指南:ROS 回调函数中的对象生命周期陷阱 (Use-After-Free)
开发语言·c++·机器人·ros·ros2
clt12332119 小时前
阿里千问聊天机器人
机器人
星浩AI19 小时前
手把手教你安装 OpenClaw 并接入飞书,让本地 AI 在飞书里听你指挥
后端·机器人·agent