4. 安全状态管理与系统响应
在AURIX Safety OS与故障监控体系中,故障被检测出来只是第一步。真正决定系统是否安全的是:检测到故障之后,系统能否在确定的时间内进入一个可预期的安全状态,并让所有受影响的执行器、通信端口和外部设备都处于受控状态。安全状态管理就是围绕这一目标建立的一套状态定义、切换条件、关断路径与协调机制。
安全状态的定义与分层
安全状态(Safe State)不是单一状态,而是一组按严重程度和可用性划分的状态集合。在AURIX工程实践中,通常将其划分为以下层级:
- 正常运行态(Normal):所有监控项在阈值内,系统全功能运行。
- 降级运行态(Degraded):检测到非致命故障,系统关闭部分非关键功能,保留核心控制能力。例如关闭冗余通道中的一路,或降低PWM输出上限。
- 安全关断态(Safe Stop):检测到影响功能安全的故障,系统在确定时间内将执行器驱动、功率输出和通信端口切换到安全电平或高阻态。
- 紧急关断态(Emergency Off):检测到可能造成人身伤害或不可逆损坏的故障,立即切断功率级供电,进入不可自动恢复的锁定状态。
每个状态必须明确定义:进入条件、退出条件、允许的操作、禁止的操作、以及在该状态下各端口和执行器的目标电平。这些定义通常以状态表的形式固化在安全概念文档中,并由Safety OS的状态管理器统一执行。
安全状态切换条件
切换条件来自故障监控层的判定结果。AURIX的SMU(Safety Management Unit)将各监控源(如锁步核比较错误、ECC错误、时钟监控、电压监控、看门狗超时等)的报警信号汇聚,并按严重等级映射到不同的安全状态请求。切换条件的设计需要遵循以下原则:
- 确定性:从故障确认到进入安全状态的时间必须是可计算、可验证的,通常以FTTI(Fault Tolerant Time Interval)为约束。
- 不可屏蔽性:安全关断路径不能被普通软件任务屏蔽或延迟,必须由硬件或最高优先级的安全任务直接触发。
- 可区分性:不同严重等级的故障应触发不同的安全状态,避免“一刀切”导致可用性损失。
- 可恢复性约束:降级态允许在故障消失后恢复;安全关断态通常需要复位或重新初始化;紧急关断态一般需要外部干预。
端口与执行器安全关断
安全状态的最终体现是物理端口和执行器的状态。AURIX的端口模块(Port)支持在安全关断时自动切换到预设的安全电平,这一过程不依赖CPU干预。关键配置包括:
- 安全电平定义:每个输出引脚在安全关断时的目标电平(高、低或高阻)必须根据被驱动对象的安全需求确定。例如,驱动电机H桥的PWM引脚在安全关断时应输出低电平,使电机自由停车或制动。
- 关断路径:从SMU报警到端口电平切换的路径应尽可能短。AURIX支持通过SMU直接触发端口紧急停止(Emergency Stop)功能,绕过软件层。
- 执行器关断顺序:对于多执行器系统,关断顺序可能影响机械安全。例如,先关闭功率输出,再关闭使能信号,最后切断供电。
- 状态反馈:关断后应通过端口回读或外部诊断确认实际电平与预期一致,否则需要触发二次故障处理。
以下SVG展示了从故障检测到端口安全关断的完整信号链与状态切换关系:
系统级安全状态协调
在分布式系统中,单个ECU进入安全状态并不等于系统安全。例如,一辆车的制动ECU进入安全关断态,但整车控制器仍在发送加速请求,就可能产生新的危险。因此,系统级安全状态协调需要解决以下问题:
- 状态广播与同步:各ECU通过CAN、FlexRay或以太网广播自身安全状态,使系统内所有节点对当前安全等级有一致认知。
- 主从协调:指定一个安全主节点(Safety Master)负责汇总各节点状态并决策系统级安全状态,从节点执行主节点的关断指令。
- 关断顺序协调:系统级关断需要按依赖关系排序。例如,先让执行器进入安全位置,再切断通信,最后关闭电源。
- 故障隔离:当某个节点故障时,应将其隔离,避免故障扩散到整个系统。AURIX的SMU支持将故障限制在本地,同时通过安全状态广播通知其他节点。
工程实现要点与示例参数
以下以一个电机控制ECU为例,说明安全状态管理的典型配置参数。假设该ECU使用AURIX TC3xx,驱动三相电机,FTTI要求为10ms。
| 参数项 | 示例值 | 说明 |
|---|---|---|
| SMU报警响应时间 | ≤ 2ms | 从故障确认到SMU输出报警 |
| 端口关断时间 | ≤ 1ms | SMU触发到端口电平切换 |
| PWM安全电平 | 低电平 | 三相下桥臂关断,电机自由停车 |
| 使能信号安全电平 | 低电平 | 驱动芯片使能无效 |
| 通信安全状态 | 发送安全状态帧 | CAN ID 0x7FF,周期10ms |
| 降级态恢复条件 | 故障消失持续100ms | 需连续确认,避免抖动 |
| 紧急关断锁定 | 需外部复位 | 不可自动恢复 |
在代码层面,安全状态管理通常由一个高优先级安全任务实现,该任务周期性地读取SMU状态寄存器、端口回读寄存器和通信状态,并根据预设的状态表执行切换。以下是一个简化的状态判断逻辑示例:
/* 安全状态管理任务,周期 1ms,最高优先级 */
void SafetyStateTask(void)
{
uint32 smuStatus = SMU_GetAlarmStatus();
uint32 portStatus = PORT_GetSafetyFeedback();
if (smuStatus & SMU_ALARM_CRITICAL) {
/* 紧急关断:直接触发端口紧急停止,不等待软件 */
PORT_EmergencyStop();
SafetyState = STATE_EMERGENCY_OFF;
SafetyState_Lock();
}
else if (smuStatus & SMU_ALARM_SAFETY) {
/* 安全关断:关闭PWM,拉低使能,发送安全状态帧 */
PWM_SetSafeLevel();
DRV_SetEnable(false);
CAN_SendSafetyFrame(STATE_SAFE_STOP);
SafetyState = STATE_SAFE_STOP;
}
else if (smuStatus & SMU_ALARM_DEGRADED) {
/* 降级运行:限制输出,记录故障 */
PWM_SetLimit(50);
SafetyState = STATE_DEGRADED;
}
else {
SafetyState = STATE_NORMAL;
}
/* 端口回读校验 */
if (SafetyState >= STATE_SAFE_STOP) {
if (portStatus != PORT_EXPECTED_SAFE) {
/* 关断失败,触发二次故障处理 */
SafetyState_SecondaryFault();
}
}
}
这段代码的关键在于:紧急关断路径不依赖软件判断,而是由SMU硬件直接触发端口紧急停止;软件任务负责状态记录、通信广播和回读校验。这种“硬件快速关断 + 软件协调管理”的分工是AURIX安全状态管理的典型模式。
状态切换的验证与确认
安全状态管理设计完成后,必须通过故障注入测试验证其有效性。常用的验证方法包括:
- SMU报警注入:通过软件触发SMU报警,观察端口电平是否在FTTI内切换到安全电平。
- 端口回读测试:强制端口输出错误电平,验证回读校验能否检测到并触发二次故障处理。
- 通信超时测试:模拟安全主节点失效,验证从节点是否在超时后自动进入安全关断态。
- 关断顺序测试:用示波器同时捕获PWM、使能和供电信号,确认关断顺序符合设计。
验证结果应记录实际关断时间、端口电平、通信帧内容和状态切换日志,并与安全概念文档中的FTTI和状态表进行比对。任何超出约束的偏差都必须分析原因并修正设计。