3. PIS核心协议概览

好,咱们进入正题。PIS系统说白了就是让乘客知道「车什么时候来、往哪开、下一站是哪」的那套系统。但要让显示屏、广播、车地通信这些设备协同工作,背后得有一套严谨的协议体系。今天我就带大家把PIS核心协议的骨架摸清楚。

3.1 协议分层模型

我个人习惯把PIS协议分成四层来看,这样思路最清晰。你想想看,从地面控制中心到车载终端,中间要经过多少环节?不分层的话,调试起来简直要命。

层级 名称 职责 典型协议
L4 应用层 定义业务逻辑,如到站信息、广播触发 PIS-APP, TIS-IP
L3 传输层 保证数据可靠到达,处理重传和排序 PIS-TP, 自定义可靠UDP
L2 网络层 路由寻址,跨网段通信 IP, PIS-NET
L1 链路层 物理介质访问,帧同步 Ethernet, CAN, RS-485

这里要注意,L1和L2其实更多是借用通用网络协议。真正体现PIS特色的,是L3和L4。我在项目中遇到过有人把TCP直接拿来传PIS数据,结果在隧道里频繁断连——嗯,这就是没理解分层的重要性。

3.2 协议栈结构

协议栈长什么样?我画个简化的结构给你看。从上往下,数据一路封装,到了物理层再发出去。反过来,收到数据后一层层解封装。

+-------------------------------+
|  应用层 (PIS-APP)              |  ← 原始数据:到站信息、广播指令
+-------------------------------+
|  传输层 (PIS-TP)               |  ← 加上序列号、校验码
+-------------------------------+
|  网络层 (PIS-NET / IP)         |  ← 加上源/目的地址
+-------------------------------+
|  链路层 (Ethernet / CAN)       |  ← 加上帧头帧尾、CRC
+-------------------------------+
|  物理层 (电信号 / 光信号)       |
+-------------------------------+

说白了,每一层只关心自己的事。应用层不管数据怎么传,链路层不管数据是什么内容。这种解耦设计,让PIS系统能灵活适配不同的硬件平台。我记得有一次在改造老旧线路时,只换了链路层驱动,上层协议完全没动——这就是分层的好处。

小技巧: 调试PIS协议时,我建议先从中间层(传输层)下手。因为应用层太复杂,链路层太底层。抓住传输层的序列号和重传机制,大部分问题都能定位。

3.3 协议数据单元(PDU)定义

PDU,说白了就是每一层的数据包格式。咱们重点看应用层PDU,因为这是PIS协议的核心。

一个典型的PIS应用层PDU长这样:

+--------+--------+--------+--------+--------+--------+
| 起始符 | 版本号 | 消息类型 | 数据长度 | 消息体 | 校验和 |
| (2B)   | (1B)   | (2B)    | (2B)    | (N B)  | (2B)   |
+--------+--------+--------+--------+--------+--------+

字段说明:

  • 起始符:固定为0xAA 0x55,用于帧同步。我曾经见过有人把起始符写反了,结果整个系统收不到数据——这种低级错误排查起来最费时间。
  • 版本号:当前版本0x01。升级协议时改这个字段,新旧设备就能兼容。
  • 消息类型:0x0001表示到站信息,0x0002表示广播指令,0x0003表示紧急信息。
  • 数据长度:消息体的字节数,最大1024字节。
  • 消息体:具体业务数据,格式由消息类型决定。
  • 校验和:从起始符到消息体的CRC16校验。
避坑指南: 我曾经在项目里遇到一个问题——校验和算对了,但设备就是不认。查了两天才发现,是字节序搞反了。PIS协议里统一用大端序(Big-Endian),但有些嵌入式平台默认是小端。记住:协议文档里怎么写,代码里就怎么实现,别自作聪明。

3.4 协议交互流程

光有数据格式还不够,得知道数据怎么流。PIS系统的典型交互流程,我总结为「一问一答」加「主动推送」两种模式。

3.4.1 一问一答模式

地面控制中心向车载终端查询状态时,用这种模式。流程如下:

地面控制中心                    车载终端
     |                              |
     |--- 查询请求 (MsgType=0x0010) -->|
     |                              |
     |<-- 状态响应 (MsgType=0x0011) ---|
     |                              |

这种模式简单可靠,但效率不高。你想想看,如果每站都要查询一次,列车高速运行时根本来不及。所以实际系统中,更多用的是第二种模式。

3.4.2 主动推送模式

车载终端主动上报信息,地面中心只管接收。比如列车到站信息:

车载终端                        地面控制中心
     |                              |
     |--- 到站通知 (MsgType=0x0020) -->|
     |                              |
     |--- 下一站预告 (MsgType=0x0021) ->|
     |                              |
     |--- 离站通知 (MsgType=0x0022) -->|
     |                              |

这种模式的好处是实时性强。但坏处是——如果网络丢包,地面中心就漏掉了信息。所以实际部署时,我建议关键信息(比如紧急广播)用一问一答模式,普通信息(比如到站通知)用主动推送模式。

核心要点: PIS协议的设计哲学是「可靠优先,兼顾效率」。在隧道、高架等恶劣环境下,宁可慢一点,也要保证数据不丢、不乱、不错。这是轨道交通系统的底线。

好了,协议概览就讲到这里。下一章咱们深入消息类型定义,看看每个PDU里到底装了什么数据。到时候我会拿一个真实项目的报文出来,手把手教你怎么解析。