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去接几十米外的设备,结果数据全是乱码。嗯,这活它真干不了。
RS485:远距离、多节点的实干家
RS485就不一样了。它用差分信号传输,两根线(A和B)就能搞定。优点很明显:
- 支持多节点:一条总线上可以挂32个设备(甚至更多)
- 传输距离远:1200米没问题,加中继还能更远
- 抗干扰强:差分信号,共模噪声被抵消了
- 半双工:同一时刻只能发或收,需要软件控制方向
说白了,PIS系统里那些分布在站台、车厢里的设备,用RS485连起来最合适。我做过一个项目,一条485总线挂了18个LED信息屏,跑了两年没出过问题。
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 | 写多个寄存器 | 批量设置 |
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。
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 |
3.5 实战:一个典型的PIS数据采集链路
说了这么多,咱们串起来看一个实际例子。
假设一个站台有8块LED信息屏,每块屏通过RS485总线连接,使用Modbus RTU协议。控制室有一台工控机,需要实时读取每块屏的状态(温度、亮度、故障码等)。
链路是这样的:
- 物理层:8块屏挂在同一条RS485总线上,总线两端加120Ω终端电阻
- 协议层:每块屏分配一个Modbus地址(1~8),工控机作为主机轮询
- 转换层:在站台机柜里放一台RS485转以太网的协议转换器
- 网络层:转换器通过网线接到交换机,工控机通过局域网访问
- 应用层:工控机上的PIS软件,通过Modbus TCP读取每块屏的数据
你看,从最底层的RS485,到上层的Modbus TCP,中间只隔了一个协议转换器。这就是典型的PIS数据采集架构。
- RS232适合短距离、一对一
- RS485适合远距离、多节点
- Modbus RTU是串口上的工业标准
- Modbus TCP是以太网上的Modbus
- 协议转换器是连接新老系统的桥梁
嗯,这一讲就到这里。下一讲咱们聊聊数据采集的时序设计和轮询策略——说白了,就是怎么让这么多设备有序地说话,不打架、不丢数据。