• 正文
  • 相关推荐
申请入驻 产业图谱

用快递站的故事快速理解Modbus协议

06/02 14:39
1068
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言

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"。

相关推荐