4. 软件架构安全分析(FTA)

任务定义

在ISO 26262功能安全开发中,系统级安全需求(Safety Requirements)确定后,需将其分解为面向软件架构设计的技术安全需求(Technical Safety Requirements, TSR)。本案例目标:针对一个电机转速控制单元,将系统级安全需求“防止电机超速”分解为可验证的软件技术安全需求,并建立需求与ASIL等级的追溯关系。

输入:系统级安全需求

系统安全需求SSR-001:当电机转速超过额定值3500 RPM时,系统必须在100 ms内将电机转矩降至0,且不发生硬件损坏。ASIL等级:ASIL C。

技术安全需求分解

软件无法直接“降低转矩”,但可通过监控转速、控制逆变器输出、执行故障响应来实现。分解后的TSR如下表所示,每个TSR均包含可验证的触发条件、响应动作和时间约束。

TSR ID需求内容ASIL关联SSR
TSR-001软件每10 ms采样一次电机转速,转速值来自速度传感器接口。CSSR-001
TSR-002当检测到转速≥3500 RPM时,在10 ms内将目标转矩指令置为0。CSSR-001
TSR-003转速≥3500 RPM状态持续超过50 ms时,触发故障标志位并锁定转矩输出为0,直到收到复位命令。CSSR-001
TSR-004转速传感器信号无效(超范围或通信超时)时,按TSR-003的锁定逻辑处理。CSSR-001

软件实现(C代码)

以下代码实现TSR-001至TSR-004的核心监控与响应逻辑。代码包含转速采样、超速判断、故障锁定与复位功能,可直接编译运行于PC环境进行逻辑验证。


#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

#define SPEED_THRESHOLD_RPM   3500
#define SAMPLE_PERIOD_MS      10
#define FAULT_LOCK_MS         50
#define SPEED_SENSOR_MAX_RPM  5000
#define SPEED_SENSOR_MIN_RPM  0

/* 模拟转速传感器读取 */
static uint16_t mock_speed_rpm = 0;
static bool mock_sensor_valid = true;

/* 软件状态 */
static uint16_t current_speed_rpm = 0;
static bool target_torque_zero = false;
static bool fault_locked = false;
static uint16_t overspeed_count_ms = 0;

/* 传感器接口:返回当前转速和有效性 */
static void read_speed_sensor(uint16_t *speed_rpm, bool *valid) {
    *speed_rpm = mock_speed_rpm;
    *valid = mock_sensor_valid;
}

/* 10ms周期任务:TSR-001采样 + TSR-002/003/004响应 */
void speed_monitor_10ms_task(void) {
    bool sensor_valid = false;
    uint16_t raw_speed = 0;

    /* TSR-001: 采样转速 */
    read_speed_sensor(&raw_speed, &sensor_valid);

    /* TSR-004: 传感器无效处理 */
    if (!sensor_valid || raw_speed > SPEED_SENSOR_MAX_RPM || raw_speed < SPEED_SENSOR_MIN_RPM) {
        fault_locked = true;
        target_torque_zero = true;
        overspeed_count_ms = 0;
        current_speed_rpm = 0;
        return;
    }

    current_speed_rpm = raw_speed;

    /* TSR-002: 超速立即清零转矩 */
    if (current_speed_rpm >= SPEED_THRESHOLD_RPM) {
        target_torque_zero = true;
        overspeed_count_ms += SAMPLE_PERIOD_MS;
    } else {
        /* 未超速时,若未锁定则恢复转矩控制 */
        if (!fault_locked) {
            target_torque_zero = false;
        }
        overspeed_count_ms = 0;
    }

    /* TSR-003: 超速持续50ms进入锁定 */
    if (overspeed_count_ms >= FAULT_LOCK_MS) {
        fault_locked = true;
        target_torque_zero = true;
    }
}

/* 复位命令:解除锁定 */
void reset_fault(void) {
    fault_locked = false;
    target_torque_zero = false;
    overspeed_count_ms = 0;
}

/* 获取当前转矩指令状态(0=允许输出,1=强制为0) */
bool is_torque_zero(void) {
    return target_torque_zero;
}

bool is_fault_locked(void) {
    return fault_locked;
}

/* 测试用例 */
int main(void) {
    printf("=== TSR 验证开始 ===\n");

    /* 场景1: 正常转速 2000 RPM */
    mock_speed_rpm = 2000;
    mock_sensor_valid = true;
    speed_monitor_10ms_task();
    printf("场景1(2000RPM): torque_zero=%d, locked=%d (期望0,0)\n",
           is_torque_zero(), is_fault_locked());

    /* 场景2: 超速 3600 RPM 第一次采样 */
    mock_speed_rpm = 3600;
    speed_monitor_10ms_task();
    printf("场景2(3600RPM第1次): torque_zero=%d, locked=%d (期望1,0)\n",
           is_torque_zero(), is_fault_locked());

    /* 场景3: 持续超速 50ms后(第5次调用) */
    for (int i = 0; i < 4; i++) {
        speed_monitor_10ms_task();
    }
    printf("场景3(3600RPM持续50ms): torque_zero=%d, locked=%d (期望1,1)\n",
           is_torque_zero(), is_fault_locked());

    /* 场景4: 复位后转速恢复正常 */
    reset_fault();
    mock_speed_rpm = 2000;
    speed_monitor_10ms_task();
    printf("场景4(复位后2000RPM): torque_zero=%d, locked=%d (期望0,0)\n",
           is_torque_zero(), is_fault_locked());

    /* 场景5: 传感器无效 */
    mock_sensor_valid = false;
    speed_monitor_10ms_task();
    printf("场景5(传感器无效): torque_zero=%d, locked=%d (期望1,1)\n",
           is_torque_zero(), is_fault_locked());

    return 0;
}

SVG:TSR状态机与响应时序

正常运行 转矩正常输出 超速响应 转矩=0 (TSR-002) 故障锁定 锁定 (TSR-003/004) 转速≥3500 立即触发 持续≥50ms TSR-003 复位命令 (reset_fault) 转速<3500 且未锁定 传感器无效/超范围 (TSR-004) 验证观测点 正常→超速:torque_zero=1, locked=0 超速→锁定:torque_zero=1, locked=1 复位后:torque_zero=0, locked=0

编译与验证方法

编译:使用gcc编译并运行:gcc -o tsr_test tsr_test.c && ./tsr_test

判定标准:程序输出与各场景括号中的期望值一致,即:场景1输出(0,0),场景2输出(1,0),场景3输出(1,1),场景4输出(0,0),场景5输出(1,1)。满足上述条件则判定TSR-001至TSR-004逻辑实现正确。

ASIL追溯:每个TSR均标注ASIL C,与SSR-001保持一致。代码中通过fault_locked实现故障锁定,满足TSR-003/004的“锁定直到复位”要求。