Modbus 通讯协议是工业自动化领域应用非常广泛的一种主从式串行通信协议,由 Modicon 公司在 1979 年开发,最初是为了让 PLC 和现场各类设备之间能够稳定交换数据,现在已经变成工业现场最普及的标准通信协议之一。这套协议核心思路很简单,就是由主站主动发起请求,从站收到请求之后再返回应答,所有设备按照统一的数据帧规则进行收发,不需要复杂的协商过程,开发门槛低,硬件成本低,所以在变频器 温控仪表 传感器 智能电表 远程 IO 模块这些设备上大量搭载 Modbus 通讯协议。Modbus 通讯协议分为多个变种,最常见的是 Modbus RTU Modbus ASCII 还有 Modbus TCP,前两种跑在串口 RS485 物理层上,Modbus TCP 是把协议报文封装之后跑在以太网网络里面,不管哪种变种,寄存器寻址 功能码 数据校验这套核心逻辑保持一致,这也是 Modbus 通讯协议能够长期沿用的关键原因。
协议诞生背景与普及原因
早期工业设备厂商各自定义私有通信报文,不同品牌 PLC 仪表互相不能通信,现场集成的时候需要单独做驱动,调试维护工作量很大。Modicon 推出 Modbus 通讯协议之后,把报文格式 寻址方式 功能码全部标准化,任何厂商只要按照规范实现,设备之间就可以直接通信。
能够长期普及主要有几个原因,第一协议本身公开免费,不需要支付授权费用,第二协议结构简单,单片机这类低成本控制器也可以实现,第三支持总线多机挂载,一条 RS485 总线最多可以挂载 247 个从站,第四容错设计完善,带有校验机制,可以识别传输错误,适合工厂电磁干扰比较强的现场环境。
Modbus 通讯协议核心概念
| 项目 | 详细说明 |
|---|---|
| 通信模式 | 主从轮询,同一时刻只能主站发起通信,从站不能主动上报数据 |
| 从站地址 | 每个从站分配唯一地址,范围 1 到 247,地址 0 是广播地址 |
| 功能码 | 规定主站要执行什么操作,比如读保持寄存器 读输入寄存器 写单个寄存器 写多个寄存器 |
| 寄存器类型 | 保持寄存器 输入寄存器 离散输入 线圈,四类数据区域,分别对应不同功能码 |
| 校验机制 | RTU 模式使用 CRC16 校验,ASCII 模式使用 LRC 校验,Modbus TCP 不需要额外校验,依靠以太网本身校验 |
常用功能码说明
1 功能码 01 读线圈,读取开关量输出状态
2 功能码 02 读离散输入,读取外部开关量输入状态
3 功能码 03 读保持寄存器,最常用,读取模拟量参数 设定值
4 功能码 04 读输入寄存器,读取传感器采集的模拟量原始数据
5 功能码 05 写单个线圈,控制单个开关输出
6 功能码 06 写单个保持寄存器,修改单个参数设定值
15 功能码 15 写多个线圈,批量控制多个开关
16 功能码 16 写多个保持寄存器,批量写入多个参数
Modbus RTU 报文收发步骤
第一步 主站确定目标从站地址,选择对应的功能码,填写寄存器起始地址 寄存器数量 数据内容,组装成完整 RTU 报文。
第二步 通过 RS485 总线发送报文,总线上面所有从站都会收到这份报文,只有地址匹配的从站才会处理。
第三步 从站校验 CRC,校验失败直接丢弃报文,不做应答。校验通过之后,从站执行对应的读写操作,组装应答报文返回给主站。
第四步 主站等待应答,超过设定超时时间没有收到回复,判定本次通信失败,可以执行重发。
第五步 如果从站执行出错,会返回异常应答报文,把原功能码最高位置 1,附带异常码,主站根据异常码判断故障原因。
Modbus TCP 和 RTU 的差异
Modbus TCP 物理层是以太网,报文里面不再包含 CRC 校验,从站地址改成单元标识,报文前面增加 MBAP 报文头,支持网络并发访问,不再严格局限单主轮询,但是很多工业应用依旧沿用主从轮询逻辑。Modbus RTU 是串行总线,半双工通信,同一时间只能一个设备发送,适合远距离现场布线,成本更低。
协议局限性
Modbus 通讯协议本身没有内置身份认证加密机制,报文是明文传输,直接暴露在网络或者总线上,在高安全要求场景需要额外增加网关或者安全模块。同时主从轮询机制,如果从站数量很多,轮询周期会变长,实时性会下降,并且从站不能主动报警推送,所有报警信息都需要主站定时轮询读取。
【常见问题】
问题 1 Modbus 通讯协议里面主站最多可以挂载多少个从站
回答 1 Modbus 通讯协议 RTU 模式标准从站地址范围是 1 到 247,理论最大支持挂载 247 个从站,实际现场还要考虑 RS485 总线负载 通信波特率 轮询周期,一般不会跑到理论上限。
问题 2 Modbus 通讯协议 03 功能码是用来做什么的
回答 2 Modbus 通讯协议 03 功能码是读保持寄存器,是现场最频繁使用的功能码,主要用来读取设备内部保存的模拟量参数 运行数值 设定参数。
问题 3 Modbus 通讯协议 RTU 和 ASCII 可以在同一条 RS485 总线混用吗
回答 3 Modbus 通讯协议 RTU 和 ASCII 不能在同一条 RS485 总线混用,两种模式帧间隔 编码方式 校验算法都不一样,混用之后所有设备都无法正确解析报文,通信会直接失效。
问题 4 Modbus 通讯协议出现超时无应答一般是什么原因
回答 4 Modbus 通讯协议出现超时无应答常见原因有从站地址设置错误 RS485 接线接反 波特率校验位不匹配 总线干扰 从站掉电 总线终端电阻缺失,需要逐项排查。
【免责申明】
本文仅对 Modbus 通讯协议相关技术原理做科普讲解,实际项目部署的时候需要结合现场硬件 电磁环境 设备手册进行调试,本文内容不能替代原厂设备技术手册,工程应用风险由使用者自行承担。


