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;
注意:模式切换不是随意的。比如从AM切到RM,必须经过SM过渡。我曾经见过一个项目,因为模式切换逻辑没做互锁,导致列车在高速运行时直接切到了RM模式,触发了紧急制动。嗯,这个坑大家要记住。

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系统设计的生命线。