1. Modbus协议基础:Modbus起源、协议栈架构、物理层与传输模式(RTU/ASCII/TCP)

各位工程师朋友,咱们今天聊聊Modbus。说实话,这玩意儿在工业现场摸爬滚打这么多年,我几乎天天跟它打交道。你想想看,一个1979年诞生的协议,到现在四十多年了,还在智能工厂里活得好好的,这本身就说明问题。

1.1 Modbus的起源:一个老协议为何至今不衰?

Modbus是Modicon公司(现在叫施耐德电气)在1979年搞出来的。那时候PLC刚兴起,设备之间要通信,但各家各搞一套,乱得很。Modicon干脆把自家PLC的通信协议公开了——嗯,这招挺高明。

我记得刚入行那会儿,师傅跟我说:“小伙子,搞工业通信,先把Modbus吃透。”我当时还不服气,觉得这协议太老了。后来在项目里碰了一鼻子灰,才明白师傅的话。

核心要点:Modbus之所以长寿,说白了就三个原因:

  • 开放免费——谁都能用,不用交钱
  • 简单可靠——报文结构清晰,调试方便
  • 硬件门槛低——串口、网口都能跑

1.2 协议栈架构:从物理层到应用层

Modbus的协议栈其实很薄。跟OSI七层模型比起来,它只占了下面几层。我习惯把它分成三块来看:

OSI层 Modbus对应 说明
应用层 Modbus应用协议 功能码、数据模型
传输层 TCP/UDP(Modbus TCP) 端口502
网络层 IP(Modbus TCP) 标准IP网络
数据链路层 串行链路(RTU/ASCII) 主从模式
物理层 RS-232/RS-485/以太网 电气特性

这里有个坑,我提醒一下:很多人以为Modbus TCP就是Modbus RTU加了个TCP头,其实没那么简单。TCP版本去掉了CRC校验,因为TCP/IP协议栈自己会做校验。我曾经在项目里把RTU报文直接塞进TCP包,结果调试了一整天...

1.3 物理层:RS-232 vs RS-485 vs 以太网

物理层这块,我建议你重点搞清楚RS-485。为什么?因为智能工厂里90%的串口Modbus都在用RS-485。

我的经验:RS-485用双绞线,最远能到1200米。但实际项目中,超过800米我就建议加中继器了。另外,终端电阻一定要接,不接的话信号反射会让你怀疑人生。

三种物理层的对比:

特性 RS-232 RS-485 以太网
传输距离 15米 1200米 100米(交换机级联可延长)
节点数 1对1 最多32个(标准) 理论上无限制
抗干扰 好(差分信号) 好(变压器隔离)
典型场景 短距离调试 现场总线 工厂网络

1.4 传输模式:RTU、ASCII、TCP

三种模式,我一个个说。

1.4.1 Modbus RTU

这是最常用的模式。数据用二进制传输,效率高。报文格式很简单:地址码 + 功能码 + 数据 + CRC校验。

举个例子,读取从站地址1的保持寄存器(功能码03),起始地址0,读2个寄存器:

请求报文:01 03 00 00 00 02 C4 0B
响应报文:01 03 04 00 0A 00 14 3A 86

你看,请求里01是从站地址,03是功能码,0000是起始地址,0002是寄存器数量,C40B是CRC校验。响应里04表示数据长度4字节,000A和0014就是读回来的两个寄存器值(10和20)。

避坑指南:我曾经在一条生产线上遇到RTU通信间歇性失败。查了两天,最后发现是报文间隔时间太短。RTU要求报文间至少3.5个字符时间的静默期,这个细节很多人会忽略。

1.4.2 Modbus ASCII

这个模式现在用得少了。它把每个字节拆成两个ASCII字符发送,报文用冒号开头、回车换行结尾。优点是肉眼可读,缺点是效率低——同样的数据,ASCII报文比RTU长一倍。

同样的读取操作,ASCII报文长这样:

:010300000002F2\n

注意看,01变成了“01”两个字符,03变成了“03”... 而且校验方式也变了,用的是LRC(纵向冗余校验),不是CRC。

我个人建议:除非设备只支持ASCII,否则别用。我在一个老旧的水处理项目里被迫用过一次,那感觉就像开手动挡车进城——能走,但累得慌。

1.4.3 Modbus TCP

这是现代智能工厂的主流。它把Modbus报文封装在TCP包里,端口固定502。去掉了CRC校验(TCP/IP自己会做),加了一个MBAP报文头(7字节)。

TCP报文结构:

MBAP头(7字节) + 功能码 + 数据
MBAP头 = 事务标识符(2字节) + 协议标识符(2字节,固定0) + 长度(2字节) + 单元标识符(1字节)

你想想看,TCP模式的好处是什么?

  • 不用管波特率、校验位这些串口参数
  • 可以跨交换机、路由器
  • 一个服务器可以同时服务多个客户端

但要注意,TCP模式没有主从概念了,改叫客户端/服务器。不过很多人还是习惯叫主站/从站,这个无伤大雅。

1.5 三种模式的选择建议

说了这么多,到底怎么选?我根据项目经验给个参考:

  • 新项目、有网络条件:无脑选Modbus TCP。调试方便,扩展性好。
  • 现场总线、距离远:选Modbus RTU over RS-485。成本低,抗干扰。
  • 老旧设备改造:看设备支持什么。如果只支持ASCII,那就忍着吧。
  • 无线传输:建议用RTU。ASCII效率太低,无线带宽本来就有限。

一句话总结:Modbus能活四十多年,靠的就是简单。你只要搞懂了地址、功能码、数据、校验这四个要素,剩下的就是多练。我在调试现场经常跟年轻工程师说:“别把Modbus想复杂了,它就是设备之间说‘你给个数’、‘我回个数’这么简单。”

好了,这一章就到这里。下一章咱们聊聊Modbus的数据模型和功能码,这可是实际编程的核心。到时候我会拿几个真实项目的代码出来讲讲。