Modbus协议是最常用、最基础的通信协议,没有之一。在使用的时候由于很多工程师第一次接触或者知道的不多,所以使用和理解起来比较吃力。虽然Modbus协议比较简单,但是里面也包含很多的规定和术语。有客户在使用的时候有下面几个误区。
1, 协议了解不够完整。有些工程师知道Modbus协议,但是往往会出现以偏概全的情况,知道一些,一部分规则,就认为全知道了,知识体系不全面。在使用时会出现错误。
2, 总喜欢问为什么。这种学习的态度是好的。Modbus协议的规则就是这么规定的,没有为什么。比如03功能码对应的是4X的数据区,用起来比较别扭,但是协议就是这边规定的。大家都这样约定俗成的这样使用了。
3, Modbus很难学。其实不难,就是多看看,强制记忆协议的规则就好了,在结合一些实际的用例,很快就可以掌握。并且结合一些测试软件,如VFbox Studio软件,可以电脑端安装测试,看协议报文。很容易上手。
以下是使用比喻的方式介绍Modbus协议,用另外一个方式来理解Modbus协议,甚至也有助于理解其他协议。工业协议有很多种,原理都是想通的,无非就是实现数据的交换,各有优缺点,没有一个协议适合所有的应用场景,只能选择最合适的通信协议。我们深耕协议转换十多年,如果您有这方面的疑问,欢迎交流。
想象一下你住在一个小区里,小区里有一个快递驿站(这就是Modbus)。
Modbus本质上就是一套"快递驿站的工作规则"——规定了怎么问、怎么答、怎么存、怎么取。
💡一句话总结:Modbus是工业设备之间"聊天"的标准方言,让不同厂家的设备能互相听懂。
假设你开工厂,买了:
它们互相听不懂,你的工厂就乱套了。
Modbus就像"英语"——不管设备是哪国造的,只要会说Modbus,就能互相交流。这是1979年由Modicon公司发明的,现在成了工业界最通用的"普通话"。
就像:发送"01010011"这样的二进制代码
优点:速度快、数据紧凑
缺点:人看不懂,需要专用工具
适用:串口线连接(RS485/RS232)
就像:发送"Hello:Temp=25"这样的文字
优点:人类可读,调试方便
缺点:比RTU慢,数据量大
适用:调试时使用
就像:通过网线/ WiFi发送数据包 优点:利用现有网络,距离远 缺点:稍微复杂一点 适用:以太网连接
小白选择建议:看到"RS485"选RTU,看到"网线"选TCP。
驿站里有四种货架,存不同类型的"包裹":
| 货架区名称 | 英文术语 | 能做什么 | 生活类比 |
|---|---|---|---|
| 线圈区 | Coil | 读/写单个开关状态 | 快递柜的格子门:开(1)或关(0) |
| 离散输入区 | Discrete Input | 只能读开关状态 | 只能看的指示灯:亮(1)或灭(0) |
| 保持寄存器 | Holding Register | 读/写16位数值 | 可修改的密码锁:存温度设定值 |
| 输入寄存器 | Input Register | 只能读16位数值 | 只能看的显示屏:当前温度值 |
场景1:控制一盏灯
场景2:读取温度
场景3:设置温度目标
去快递驿站,你要告诉管理员你要干嘛。Modbus定义了功能码:
| 功能码 | 业务类型 | 生活类比 |
|---|---|---|
| 01 | 读线圈 | "帮我看看A01柜门开着吗?" |
| 02 | 读离散输入 | "帮我看看门口的灯亮着吗?" |
| 03 | 读保持寄存器 | "告诉我密码锁现在的密码" |
| 04 | 读输入寄存器 | "告诉我显示屏上的温度" |
| 05 | 写单个线圈 | "帮我把A01柜门打开" |
| 06 | 写单个寄存器 | "把密码改成1234" |
| 15 | 写多个线圈 | "把A01到A05柜门都打开" |
| 16 | 写多个寄存器 | "批量修改一组密码" |
主机问(去驿站查询):
从机地址:01(找1号驿站) 功能码:03(读保持寄存器) 起始地址:00 00(从第1个寄存器开始) 数量:00 02(读2个寄存器) CRC校验:C4 0B(防伪验证码)
从机答(驿站回复):
从机地址:01(我是1号驿站)
功能码:03(你要的保持寄存器)
字节数:04(4个字节的数据)
数据1:00 64(第1个值 = 100)
数据2:00 C8(第2个值 = 200)
CRC校验:...(防伪验证)
💡 翻译成人话:
- 主机:"1号驿站,我要读保持寄存器,从第1个开始读2个"
- 从机:"好的,第1个值是100,第2个值是200"
Modbus地址看起来奇怪:00001、10001、30001、40001…
这是约定俗成的"邮编规则":
| 地址范围 | 对应区域 | 功能码 |
|---|---|---|
| 00001 ~ 09999 | 线圈(Coil) | 01, 05, 15 |
| 10001 ~ 19999 | 离散输入(Discrete Input) | 02 |
| 30001 ~ 39999 | 输入寄存器(Input Register) | 04 |
| 40001 ~ 49999 | 保持寄存器(Holding Register) | 03, 06, 16 |
实际通信时,开头的"1、3、4"会被去掉,只发后面的偏移量。但文档里写40001大家一看就知道是保持寄存器。
记忆口诀:1开头只能读开关,3开头只能读数字,4开头能读能写数字,0开头能读能写开关。
[温湿度传感器] ←RS485→ [PLC主控] ←网线→ [电脑监控软件]
↓ ↓
Modbus从机 Modbus主机
地址:01 地址:00(主机没地址)
传感器数据: - 温度 → 输入寄存器 30001 - 湿度 → 输入寄存器 30002 PLC控制: - 风扇开关 → 线圈 00001 - 目标温度 → 保持寄存器 40001
工作流程:
| 错误现象 | 可能原因 | 排查方法 |
|---|---|---|
| 设备不回复 | 地址错了 | 确认从机地址是1还是2 |
| 数据乱码 | 波特率不对 | 检查双方波特率是否一致(如9600) |
| CRC错误 | 接线松动 | 拧紧RS485的A、B线 |
| 超时 | 线路太长 | RS485理论1200米,实际建议<800米 |
| 功能码异常 | 寄存器不存在 | 查手册确认地址范围 |
如果你要接一个新设备:
Modbus = 一套简单的"问答规则"
主机问:"1号设备,读40001开始的2个寄存器"
从机答:"好的,值是100和200"
不管传的是温度、压力还是开关状态,套路都一样。
附录:Modbus vs 其他协议
| 协议 | 复杂度 | 速度 | 适用场景 |
|---|---|---|---|
| Modbus | 简单 | 中等 | 工业传感器、PLC |
| Profibus | 复杂 | 快 | 大型自动化系统 |
| CAN总线 | 中等 | 快 | 汽车电子 |
| MQTT | 中等 | 依赖网络 | 物联网云平台 |
Modbus最大的优势:简单、免费、通用——就像工业界的"HTTP"。