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