4、ATO接口协议:ATO驾驶模式、牵引/制动指令接口、速度曲线计算接口
好,我们接着聊ATO接口协议。这部分内容,说白了就是ATO系统怎么跟列车“对话”的。你想想看,ATO要控制列车跑,它得知道现在该用哪种模式开车,怎么发牵引和刹车指令,以及怎么算出那条最优的速度曲线。这三个接口,是ATO最核心的“手脚”和“大脑”。
4.1 ATO驾驶模式接口
ATO的驾驶模式,不是一成不变的。我个人习惯把模式分为几个等级,就像开车有手动挡、自动挡一样。在轨道交通里,我们通常用模式码来标识。
常见的ATO驾驶模式包括:
- AM模式(自动驾驶模式):全自动,ATO全权负责牵引、制动、开关门。这是最理想的状态。
- AR模式(自动折返模式):用于终点站自动换端、折返。我记得在早期项目中,这个模式的接口逻辑特别容易出问题,因为涉及司机室激活权的切换。
- SM模式(监督模式):司机操作,但ATO会监督,超速就报警或干预。说白了就是“半自动”。
- RM模式(限制模式):限速运行,通常用于车辆段或故障场景。
这些模式通过一个模式码字(通常是一个字节或两个字节)在ATO与VCU(车辆控制单元)之间传递。接口定义大致如下:
// 伪代码示例:ATO模式码定义
#define ATO_MODE_AM 0x01 // 自动驾驶模式
#define ATO_MODE_AR 0x02 // 自动折返模式
#define ATO_MODE_SM 0x03 // 监督模式
#define ATO_MODE_RM 0x04 // 限制模式
// 接口数据结构
typedef struct {
uint8_t mode_code; // 当前模式码
uint8_t mode_valid; // 模式有效标志
uint16_t mode_quality; // 模式质量(用于故障诊断)
} ATO_Mode_Interface_t;
4.2 牵引/制动指令接口
这个接口,是ATO直接“踩油门”和“踩刹车”的地方。ATO计算出需要多大的牵引力或制动力,然后通过这个接口告诉列车。
接口通常包含以下信息:
- 指令类型:牵引、制动、惰行(滑行)。
- 指令等级:0%到100%的百分比,或者用档位表示(比如1级牵引、7级制动)。
- 指令速率:加速度变化率,防止冲击率过大让乘客不舒服。
我建议在设计这个接口时,一定要考虑安全完整性等级(SIL)。牵引和制动指令直接关系到行车安全,所以接口通常采用“双通道”或“交叉对比”的方式。比如:
// 伪代码示例:牵引/制动指令接口(双通道)
typedef struct {
uint8_t cmd_type_ch1; // 通道1:指令类型
uint8_t cmd_level_ch1; // 通道1:指令等级
uint8_t cmd_type_ch2; // 通道2:指令类型(应与通道1一致)
uint8_t cmd_level_ch2; // 通道2:指令等级(应与通道1一致)
uint16_t crc; // 循环冗余校验
} ATO_TractionBrake_Cmd_t;
关键点:ATO发出的牵引指令和制动指令不能同时有效。这是最基本的“互斥”原则。如果同时收到牵引和制动,列车应该执行紧急制动。我在调试时遇到过这种“打架”的情况,查了半天发现是接口协议里一个位定义反了。
另外,接口里还会包含一个“紧急制动”的独立指令。这个指令优先级最高,不受任何模式限制。说白了,就是“一键急停”。
4.3 速度曲线计算接口
这个接口,是ATO的“大脑”输出。ATO根据线路数据、限速、信号机状态等,实时计算出一条目标速度曲线。然后通过这个接口,把曲线上的关键点告诉列车。
速度曲线接口通常包含:
- 目标速度:当前应该达到的速度值。
- 目标距离:到下一个限速点或停车点的距离。
- 曲线类型:比如巡航、惰行、制动曲线等。
我个人习惯把速度曲线接口设计成一个“点序列”。就是每隔一定距离(比如10米),给出一个速度值。这样列车可以插值计算。但要注意,点不能太多,否则通信负担重;也不能太少,否则曲线不平滑。
// 伪代码示例:速度曲线点
typedef struct {
uint16_t distance; // 距离起点(单位:米)
uint16_t target_speed; // 目标速度(单位:0.1 km/h)
uint8_t curve_type; // 曲线类型:0-巡航,1-惰行,2-制动
} Speed_Profile_Point_t;
// 接口数据结构(最多支持64个点)
typedef struct {
uint8_t point_count; // 有效点数
Speed_Profile_Point_t points[64]; // 曲线点序列
uint16_t profile_crc; // 曲线校验
} ATO_Speed_Profile_Interface_t;
避坑指南:我曾经遇到过一个情况,ATO算出的速度曲线在停车点前突然“跳变”,导致列车停车位置不准。后来发现是曲线点序列里最后一个点的距离值比实际停车点少了1米。嗯,这种边界条件一定要仔细检查。
速度曲线计算接口还有一个重要参数——“允许速度”。这是ATP(自动列车保护)系统给出的硬限速,ATO计算的速度曲线绝对不能超过这个值。说白了,ATO是在ATP划定的“框框”里跳舞。
接口数据流大致如下:
| 接口方向 | 数据内容 | 更新频率 |
|---|---|---|
| ATO → VCU | 驾驶模式码、牵引/制动指令、速度曲线点 | 100ms - 200ms |
| VCU → ATO | 实际速度、实际加速度、列车状态 | 50ms - 100ms |
| ATP → ATO | 允许速度、移动授权、限速信息 | 200ms - 500ms |
最后说一句,这三个接口不是孤立的。驾驶模式决定了牵引/制动指令的生效范围,而速度曲线又依赖于牵引/制动指令的执行精度。你想想看,如果牵引指令响应慢了半拍,ATO算出的速度曲线就全偏了。所以,接口的实时性和可靠性,是ATO系统设计的生命线。