一、Modbus协议的起源:从PLC联网需求说起
Modbus协议诞生于1979年。那时候我还没入行,但这个故事我听过很多遍。
当时Modicon公司(就是后来被施耐德收购的那家)遇到一个问题:他们的PLC之间怎么通信?说白了,就是想让一台PLC能读写另一台PLC的数据。于是他们搞出了Modbus协议——一个简单、开放、免费的通信协议。
为什么它能活到现在?我个人觉得,就三个字:够简单。你想想看,一个1979年的协议,到今天还在工业现场跑着,这本身就说明问题。
核心要点:Modbus是工业通信的"通用语言",它不挑硬件,不挑厂家,只要你想让设备之间交换数据,它就能干。
二、RTU与ASCII模式:两种"方言"
Modbus有两种传输模式:RTU和ASCII。嗯,这里要注意,它们不是两个协议,而是同一种协议的不同"包装方式"。
2.1 RTU模式(二进制传输)
RTU模式用二进制传输数据。每个字节就是8位二进制数,紧凑、高效。我在项目中遇到过很多次,RTU模式是默认选择,因为同样的波特率下,RTU能传更多数据。
RTU报文格式:
地址码 | 功能码 | 数据区 | CRC校验(16位)
1字节 1字节 N字节 2字节
CRC校验是RTU模式的关键。我曾经见过一个现场,通信时好时坏,查了半天发现是CRC计算错了——一个字节的移位搞反了。从那以后,我写CRC代码都会反复对几遍标准例程。
2.2 ASCII模式(文本传输)
ASCII模式把每个字节拆成两个ASCII字符发送。比如0x4A就变成'4'和'A'两个字符。效率低了一半,但好处是肉眼可读。
ASCII报文格式:
起始符':' | 地址码 | 功能码 | 数据区 | LRC校验 | 结束符CR/LF
1字节 2字符 2字符 N字符 2字符 2字符
什么时候用ASCII?我个人习惯是调试阶段用。拿串口助手一看,报文清清楚楚,不用算CRC,LRC校验简单得多。但正式项目我从来不用ASCII——太浪费带宽了。
| 对比项 | RTU模式 | ASCII模式 |
|---|---|---|
| 数据密度 | 高(1字节=1字节) | 低(1字节=2字符) |
| 校验方式 | CRC-16(强) | LRC(弱) |
| 调试友好度 | 差(二进制乱码) | 好(文本可读) |
| 实际应用 | 95%以上项目 | 调试或特殊需求 |
我的建议:新项目一律用RTU。除非甲方明确要求ASCII,或者你只是临时抓个数据看看。
三、主从架构:谁说了算?
Modbus是典型的主从架构。一个网络里只有一个主机(Master),其他都是从机(Slave)。主机主动发请求,从机只能被动响应。
为什么这样设计?因为工业现场需要确定性。如果两个设备同时发数据,总线就冲突了。主从架构避免了这个问题——主机控制节奏,从机排队回答。
我在一个项目中见过有人想用两个主机。结果呢?数据乱飞,两个主机都在抢总线。最后老老实实改回单主机,加了个轮询调度,问题就解决了。
主从通信流程:
- 主机发送请求帧(包含从机地址、功能码、数据)
- 所有从机收到帧,检查地址是否匹配
- 匹配的从机执行操作,返回响应帧
- 不匹配的从机直接丢弃,不回复
- 主机收到响应,处理数据,然后发下一帧
避坑指南:我曾经遇到过从机不回复的情况。排查步骤:先看地址对不对,再看CRC对不对,最后看从机是不是死机了。别一上来就怀疑协议栈。
四、功能码分类:Modbus的"指令集"
功能码就是Modbus的指令。主机发一个功能码,从机就知道要干什么。我把它分成三大类:
4.1 位操作类(读写开关量)
这类功能码操作的是单个bit。说白了就是控制继电器、读取按钮状态。
| 功能码 | 名称 | 操作 |
|---|---|---|
| 01 | 读线圈 | 读取DO(数字输出)状态 |
| 02 | 读离散输入 | 读取DI(数字输入)状态 |
| 05 | 写单个线圈 | 控制一个DO输出 |
| 15 | 写多个线圈 | 批量控制DO输出 |
4.2 寄存器操作类(读写模拟量)
这类操作的是16位寄存器。模拟量输入、设定值、累计值都用它。
| 功能码 | 名称 | 操作 |
|---|---|---|
| 03 | 读保持寄存器 | 读取AO或参数值 |
| 04 | 读输入寄存器 | 读取AI(模拟输入)值 |
| 06 | 写单个寄存器 | 设置一个参数 |
| 16 | 写多个寄存器 | 批量设置参数 |
4.3 诊断与特殊类
这类功能码不常用,但关键时刻能救命。
- 08(诊断):回环测试,检查通信链路是否正常。我调试时必用这个功能码。
- 07(读异常状态):读取从机的异常信息。
- 11(读事件计数):统计通信事件次数。
实战经验:我建议初学者先把01、02、03、04、05、06这六个功能码吃透。它们覆盖了90%以上的应用场景。剩下的功能码,用到再查手册就行。
五、知识体系总览
下面这张图是我自己画的Modbus协议知识体系。你可以把它当成学习路线图。
这张图把Modbus协议拆成了五个层次。从起源开始,到传输模式、架构、功能码,最后落到实际应用。我个人觉得,学习任何协议都应该这样——先搭框架,再填细节。
学习建议:别一上来就啃协议文档。先理解这张图,搞清楚每个层次是干什么的。然后动手抓几个报文看看,比读十遍手册都管用。
公众号:蓝海资料掘金营,微信deep3321