3、通信协议入门:RS232/RS485串口通信、Modbus RTU协议、Modbus TCP协议、协议转换器应用

好,咱们进入第三讲。这一讲,说白了就是聊「设备之间怎么说话」。

做PIS系统,最头疼的往往不是上层软件怎么写,而是底层那些传感器、控制器、显示屏,怎么把数据老老实实传上来。我刚开始搞这个的时候,就吃过不少亏——线接对了,协议不对;协议对了,波特率又没对上。折腾一整天,最后发现是地线没接好。

嗯,咱们今天就把这些坑一个个填上。

3.1 RS232与RS485:串口通信的两大元老

先说说物理层的事。RS232和RS485,都是串口通信的标准。但它们的脾气完全不同。

RS232:点对点的老大哥

RS232出现得最早,PC机后面的DB9串口就是它。特点很简单:

  • 一对一通信:一个发,一个收,不能多接设备
  • 传输距离短:15米左右,再远信号就飘了
  • 速率不高:常用9600、19200、115200bps
  • 信号电平是±12V:抗干扰还行,但和TTL电平不兼容

我在项目里见过有人拿RS232去接几十米外的设备,结果数据全是乱码。嗯,这活它真干不了。

注意:RS232的DB9接口,不同设备引脚定义可能不同。我曾经遇到过一台设备用2脚发、3脚收,另一台反过来。接上去没反应,查了半天才发现是交叉线的问题。

RS485:远距离、多节点的实干家

RS485就不一样了。它用差分信号传输,两根线(A和B)就能搞定。优点很明显:

  • 支持多节点:一条总线上可以挂32个设备(甚至更多)
  • 传输距离远:1200米没问题,加中继还能更远
  • 抗干扰强:差分信号,共模噪声被抵消了
  • 半双工:同一时刻只能发或收,需要软件控制方向

说白了,PIS系统里那些分布在站台、车厢里的设备,用RS485连起来最合适。我做过一个项目,一条485总线挂了18个LED信息屏,跑了两年没出过问题。

小技巧:RS485总线两端一定要加120欧姆终端电阻。不加的话,信号反射会导致数据错乱。我刚开始不知道,调试时总丢包,加上电阻就好了。

3.2 Modbus RTU:工业界的通用语言

物理层搞定了,接下来就是「说哪种语言」的问题。Modbus RTU,就是工业自动化领域最通用的语言之一。

它运行在RS232或RS485之上,采用主从模式。一个主机(通常是PLC或工控机),多个从机(传感器、执行器)。主机问,从机答。

Modbus RTU的数据帧结构

Modbus RTU的报文很简单,就四个部分:

地址码 功能码 数据区 CRC校验
1字节 1字节 N字节 2字节

举个例子,我要读取1号从机的3个寄存器,从地址0开始:

主机发送:01 03 00 00 00 03 05 CB
解析:
  01    → 从机地址
  03    → 功能码(读保持寄存器)
  00 00 → 起始地址
  00 03 → 读取数量
  05 CB → CRC校验

从机回复:

从机回复:01 03 06 00 01 00 02 00 03 4A 3B
解析:
  01    → 从机地址
  03    → 功能码
  06    → 数据字节数(3个寄存器×2字节)
  00 01 → 寄存器0的值
  00 02 → 寄存器1的值
  00 03 → 寄存器2的值
  4A 3B → CRC校验

你看,就这么简单。我当年第一次用Modbus RTU时,拿着串口助手一条条发指令,看着返回的数据,感觉就像在跟设备对话一样。

常用功能码

功能码 含义 用途
01 读线圈状态 读取开关量输出
02 读离散输入 读取开关量输入
03 读保持寄存器 读取模拟量输出/参数
04 读输入寄存器 读取模拟量输入
05 写单个线圈 控制开关量输出
06 写单个寄存器 设置参数
15 写多个线圈 批量控制
16 写多个寄存器 批量设置
重点:Modbus RTU的报文之间必须有3.5个字符时间的间隔。如果间隔太短,从机可能把两条报文当成一条处理。我调试时遇到过这个问题,后来在发送前加了延时就好了。

3.3 Modbus TCP:走上网络的高速公路

Modbus RTU虽然好用,但只能跑在串口上。现在PIS系统都走以太网了,怎么办?Modbus TCP就是答案。

说白了,Modbus TCP就是把Modbus RTU的报文,直接封装到TCP/IP包里。去掉了CRC校验(TCP本身有校验),加了一个MBAP报文头。

Modbus TCP报文结构

MBAP头(7字节) 功能码 数据区
事务ID(2) + 协议ID(2) + 长度(2) + 单元ID(1) 1字节 N字节

同样的例子,读取1号从机的3个寄存器:

发送:00 01 00 00 00 06 01 03 00 00 00 03
解析:
  00 01 → 事务ID(随便编,用来匹配请求和响应)
  00 00 → 协议ID(固定为0)
  00 06 → 后面数据的长度(6字节)
  01    → 单元ID(相当于RTU里的从机地址)
  03    → 功能码
  00 00 → 起始地址
  00 03 → 读取数量

你看,核心数据跟RTU一模一样。所以很多设备都支持「协议自适应」——你发RTU它就回RTU,你发TCP它就回TCP。

经验之谈:Modbus TCP默认端口是502。有些IT管理员会封掉这个端口,记得提前沟通。我有个项目部署时,现场网络策略把502封了,折腾了半天才找到原因。

3.4 协议转换器:让新老设备和平共处

现实中的PIS系统,往往是新老设备混着用。老的传感器是RS485+Modbus RTU,新的控制器是以太网+Modbus TCP。怎么让它们通信?

协议转换器就是干这个的。它一边接串口,一边接网口,在中间做「翻译」。

常见的协议转换场景

  • RS232/485转以太网:把串口设备接到局域网里
  • Modbus RTU转Modbus TCP:让老设备能被新系统访问
  • 多路串口转以太网:把多个串口设备集中管理

我常用的方案是:用一台串口服务器,把站台里所有LED屏的RS485接口转成以太网,然后通过交换机统一接到控制室。这样布线简单,维护也方便。

配置协议转换器的要点

参数 说明 建议值
串口波特率 必须与设备一致 9600或115200
数据位 通常8位 8
停止位 1位或2位 1
校验位 无、奇校验、偶校验 无(最常用)
工作模式 TCP Server或TCP Client Server(等待连接)
IP地址 必须与网络规划一致 静态IP
避坑指南:我曾经遇到过一台协议转换器,配置好后能ping通,但就是收不到数据。查了半天,发现是串口线序搞错了——转换器的TXD要接设备的RXD,RXD接TXD,GND接GND。这个交叉关系,很多人第一次都会搞反。

3.5 实战:一个典型的PIS数据采集链路

说了这么多,咱们串起来看一个实际例子。

假设一个站台有8块LED信息屏,每块屏通过RS485总线连接,使用Modbus RTU协议。控制室有一台工控机,需要实时读取每块屏的状态(温度、亮度、故障码等)。

链路是这样的:

  1. 物理层:8块屏挂在同一条RS485总线上,总线两端加120Ω终端电阻
  2. 协议层:每块屏分配一个Modbus地址(1~8),工控机作为主机轮询
  3. 转换层:在站台机柜里放一台RS485转以太网的协议转换器
  4. 网络层:转换器通过网线接到交换机,工控机通过局域网访问
  5. 应用层:工控机上的PIS软件,通过Modbus TCP读取每块屏的数据

你看,从最底层的RS485,到上层的Modbus TCP,中间只隔了一个协议转换器。这就是典型的PIS数据采集架构。

总结一下:
  • RS232适合短距离、一对一
  • RS485适合远距离、多节点
  • Modbus RTU是串口上的工业标准
  • Modbus TCP是以太网上的Modbus
  • 协议转换器是连接新老系统的桥梁

嗯,这一讲就到这里。下一讲咱们聊聊数据采集的时序设计和轮询策略——说白了,就是怎么让这么多设备有序地说话,不打架、不丢数据。