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

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

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

前言

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(你要的保持寄存器)
字节数:044个字节的数据)
数据100 64(第1个值 = 100
数据200 C8(第2个值 = 200
CRC校验:...(防伪验证)

💡 翻译成人话

主机:"1号驿站,我要读保持寄存器,从第1个开始读2个"

从机:"好的,第1个值是100,第2个值是200"

六、地址的秘密——为什么地址是5位数?

Modbus地址看起来奇怪:00001100013000140001

这是约定俗成的"邮编规则"

地址范围 对应区域 功能码
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"。

相关推荐