2、通讯协议基础:RS485、Modbus RTU、Modbus TCP协议详解

各位同学,咱们今天聊点实在的。

做自动化这么多年,我见过太多人一上来就写代码,结果通讯死活调不通。为什么?说白了,就是没搞懂底层那点事儿。通讯协议这东西,就像两个人说话,你得先定好用什么语言、什么语速、怎么握手,不然就是鸡同鸭讲。

今天咱们就把RS485、Modbus RTU和Modbus TCP这三个老伙计彻底讲透。嗯,这里我习惯把它们分成两层来看:物理层和协议层。

2.1 RS485:物理层的“老黄牛”

先说说RS485。它不算是完整的通讯协议,它只是定义了电气特性——也就是信号怎么在线上跑。

我记得刚入行那会儿,有个项目在化工厂,距离远、干扰大。RS232根本扛不住,换了RS485,问题立马解决。为什么?因为RS485用的是差分信号传输。

核心要点:RS485是差分信号,抗干扰能力强,传输距离可达1200米。

说白了,就是两根线(A和B)互相比较电压差。干扰来了,两根线一起变,差值不变,信号就保住了。你想想看,这在工厂那种电机嗡嗡响的环境里,有多重要。

RS485的几个关键参数,我列个表,大家记一下:

参数 典型值 说明
传输距离 1200米 超过这个距离要加中继器
节点数量 32个(标准) 现在很多芯片支持256个
信号方式 差分(半双工) 同一时刻只能收或发
终端电阻 120Ω 长线必须加,防止信号反射

避坑指南:我曾经在一个项目中,RS485通讯时好时坏,查了两天。最后发现是终端电阻没加,信号反射导致数据错位。记住,超过100米,一定要在总线两端各加一个120Ω电阻。

2.2 Modbus RTU:工业界的“普通话”

好,物理层搞定了,接下来咱们聊聊协议层。Modbus RTU是目前工业上用得最广的协议之一。为什么?因为它简单、可靠、占用资源少。

Modbus RTU的数据格式,我习惯叫它“一帧一帧地说话”。每一帧包含:地址、功能码、数据、CRC校验。

举个例子,你要读取一个远程IO模块的输入状态:

请求帧(主机 -> 从机):
地址:0x01      // 从机地址
功能码:0x02    // 读取离散输入
起始地址:0x0000 // 从第0位开始
数量:0x0008    // 读取8位
CRC校验:0x79CB // 循环冗余校验

响应帧(从机 -> 主机):
地址:0x01
功能码:0x02
字节数:0x01
数据:0xA5      // 10100101,8个输入的状态
CRC校验:0x3A5C

看到没?就这么简单。主机问,从机答。一问一答,干净利落。

我个人习惯把Modbus RTU的常用功能码记在脑子里,因为调试的时候太常用了:

  • 0x01:读取线圈状态(DO输出)
  • 0x02:读取离散输入(DI输入)
  • 0x03:读取保持寄存器(AI/AO数据)
  • 0x04:读取输入寄存器(只读数据)
  • 0x05:写单个线圈
  • 0x06:写单个寄存器
  • 0x0F:写多个线圈
  • 0x10:写多个寄存器

小技巧:调试时如果通讯不通,先检查CRC校验。我遇到过很多次,代码里CRC算错了,数据发出去对方根本不认。用Modbus调试工具(比如ModScan)先验证一下,能省不少时间。

2.3 Modbus TCP:走上网络的Modbus

Modbus TCP,说白了就是把Modbus RTU的数据包,装进TCP/IP的壳子里。它去掉了CRC校验(因为TCP本身有校验),加了一个MBAP报文头。

为什么要这么做?因为现在工厂越来越讲究信息化,数据要上云、要进MES系统。RS485串口的速度和距离已经不够用了。以太网,才是未来的方向。

Modbus TCP的帧结构,我给大家拆解一下:

MBAP报文头(7字节):
- 事务处理标识:2字节(用于匹配请求和响应)
- 协议标识:2字节(固定为0x0000)
- 长度:2字节(后续数据的字节数)
- 单元标识:1字节(相当于RTU的从机地址)

PDU(协议数据单元):
- 功能码:1字节
- 数据:N字节

你看,结构上跟RTU很像,只是多了个MBAP头。所以,如果你已经懂了Modbus RTU,学Modbus TCP就是分分钟的事。

我建议初学者这样理解:

  • Modbus RTU:走串口,一对一或一对多,适合短距离、低成本
  • Modbus TCP:走以太网,一对多,适合长距离、高速率、网络化

实战经验:我在一个智能工厂项目中,用了Modbus TCP连接了50多个远程IO模块。每个模块分配一个IP地址,通过交换机汇聚到上位机。调试时用Wireshark抓包,一眼就能看出哪个模块没响应。这种可视化调试,比RS485方便太多了。

2.4 三种协议的对比与选择

好了,三种协议都讲完了。最后咱们做个对比,方便你以后选型:

特性 RS485(物理层) Modbus RTU Modbus TCP
传输介质 双绞线 RS485总线 以太网(RJ45)
传输距离 1200米 取决于RS485 100米(交换机可扩展)
传输速率 最高10Mbps 通常9600-115200bps 10/100/1000Mbps
节点数量 32-256个 32-256个 理论上无限制
校验方式 CRC16 TCP校验和
应用场景 工业现场总线 PLC、IO模块、仪表 上位机、SCADA、物联网

我个人建议:

  • 如果只是几个IO模块,距离不远,用Modbus RTU,成本低、稳定
  • 如果要做系统集成、数据上云,直接上Modbus TCP,省心
  • 如果现场干扰大、距离远,RS485+Modbus RTU是黄金组合

重要提醒:千万不要把Modbus RTU和Modbus TCP混在一起用。我见过有人用网关转换,结果波特率不匹配、超时设置不对,通讯乱成一锅粥。如果非要转换,买成熟的协议网关,别自己写代码硬转。

好了,这一章的内容就到这儿。下一章咱们开始实战——用Python写一个Modbus RTU的主站程序,真正跟远程IO模块对上话。到时候你就知道,今天讲的这些基础有多重要了。