一、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)。主机主动发请求,从机只能被动响应。

为什么这样设计?因为工业现场需要确定性。如果两个设备同时发数据,总线就冲突了。主从架构避免了这个问题——主机控制节奏,从机排队回答。

我在一个项目中见过有人想用两个主机。结果呢?数据乱飞,两个主机都在抢总线。最后老老实实改回单主机,加了个轮询调度,问题就解决了。

主从通信流程:

  1. 主机发送请求帧(包含从机地址、功能码、数据)
  2. 所有从机收到帧,检查地址是否匹配
  3. 匹配的从机执行操作,返回响应帧
  4. 不匹配的从机直接丢弃,不回复
  5. 主机收到响应,处理数据,然后发下一帧

避坑指南:我曾经遇到过从机不回复的情况。排查步骤:先看地址对不对,再看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协议知识体系 Modbus起源(1979年,Modicon公司) 传输模式:RTU(二进制) vs ASCII(文本) 主从架构:1个Master + N个Slave 功能码分类:位操作 | 寄存器操作 | 诊断特殊 应用场景:PLC通信 | 传感器采集 | 设备控制 从底层到应用,层层递进

这张图把Modbus协议拆成了五个层次。从起源开始,到传输模式、架构、功能码,最后落到实际应用。我个人觉得,学习任何协议都应该这样——先搭框架,再填细节。

学习建议:别一上来就啃协议文档。先理解这张图,搞清楚每个层次是干什么的。然后动手抓几个报文看看,比读十遍手册都管用。


公众号:蓝海资料掘金营,微信deep3321