3. 制定功能安全概念

制定功能安全概念 学习卡片

任务定义

本案例针对一个已定义系统边界和功能的车辆电子控制单元(ECU),完成ISO 26262第3部分要求的功能安全概念(Functional Safety Concept, FSC)制定。输入为:系统已确定安全目标“防止非预期加速”(ASIL C),以及系统架构中与加速控制相关的功能模块清单。任务输出为:安全状态定义、安全机制分配、功能安全需求(FSR)规格及其ASIL等级与安全目标之间的追溯关系。

系统上下文与输入

目标系统为纯电动车辆的加速踏板信号处理与扭矩控制单元。相关功能模块包括:加速踏板位置传感器(APS)、整车控制器(VCU)中的扭矩计算模块、电机控制器(MCU)接口。已知安全目标SG-01:防止非预期加速,ASIL C。系统运行模式包括正常驾驶模式和跛行模式。

功能安全概念设计

基于安全目标SG-01,定义以下安全状态与安全机制:

  • SS-01:安全状态为“切断驱动扭矩”,即VCU向MCU发送零扭矩指令并保持,直至驾驶员重新上电。
  • SM-01:APS信号合理性监控——对两路APS信号进行交叉比较,偏差超过阈值(如5%满量程)持续10ms,判定为传感器故障。
  • SM-02:扭矩指令自检——VCU内部扭矩计算模块输出值超出由APS信号和当前车速推导的物理允许范围时,判定为计算错误。
  • SM-03:故障响应路径——当SM-01或SM-02检测到故障时,VCU在20ms内切换至安全状态SS-01,并置位故障标志。

上述安全机制共同覆盖SG-01的失效场景:传感器卡滞/漂移、扭矩计算逻辑错误。跛行模式下,若SM-01检测到单路APS失效,允许以剩余一路信号限功率运行(扭矩限制为最大扭矩的30%),但SM-02仍持续监控。

功能安全需求规格

根据上述概念,导出以下功能安全需求(FSR),每个需求均追溯到安全目标:

FSR编号需求描述ASIL追溯
FSR-01系统须在检测到APS两路信号偏差≥5%满量程且持续10ms时,判定为传感器故障CSG-01 / SM-01
FSR-02系统须在扭矩计算模块输出超出物理允许范围时,判定为计算错误CSG-01 / SM-02
FSR-03系统须在判定故障后20ms内输出零扭矩指令至MCUCSG-01 / SS-01
FSR-04跛行模式下,系统须将最大输出扭矩限制为正常模式的30%CSG-01 / SM-01
FSR-05系统须在进入安全状态后置位故障标志,并保持至下次上电CSG-01 / SS-01

功能安全概念验证实现

以下代码实现FSC的核心监控逻辑,用于验证FSR-01至FSR-05的可执行性。该实现为算法级验证模型,不包含具体硬件驱动。


// fsc_monitor.c — 功能安全概念验证实现
#include <stdint.h>
#include <stdbool.h>

#define APS_THRESHOLD_PERCENT   5   // FSR-01: 5%满量程偏差阈值
#define APS_FAULT_DURATION_MS   10  // FSR-01: 持续10ms
#define TORQUE_LIMIT_NORMAL     200 // 正常模式最大扭矩(Nm)
#define TORQUE_LIMIT_LIMP       60  // FSR-04: 跛行模式30%限扭
#define FAULT_RESPONSE_TIME_MS  20  // FSR-03: 20ms响应

typedef struct {
    uint16_t aps1_raw;      // APS1原始值 0-1000
    uint16_t aps2_raw;      // APS2原始值 0-1000
    uint16_t torque_cmd;    // 扭矩计算模块输出(Nm)
    uint16_t vehicle_speed; // 车速(km/h)
    bool limp_mode;         // 跛行模式标志
} SystemInputs;

typedef struct {
    bool sensor_fault;      // SM-01检测结果
    bool calc_fault;        // SM-02检测结果
    bool torque_cutoff;     // SS-01安全状态激活
    uint8_t fault_flag;     // FSR-05故障标志
    uint16_t torque_output; // 最终输出扭矩
} SystemOutputs;

static uint16_t fault_counter = 0;

// 物理允许范围推导函数(简化模型)
static bool is_torque_physically_valid(uint16_t torque, uint16_t aps, uint16_t speed) {
    // 根据APS和车速推导最大允许扭矩(简化查表逻辑)
    uint16_t max_allowed = (aps * 2) + (speed / 10);
    if (max_allowed > TORQUE_LIMIT_NORMAL) max_allowed = TORQUE_LIMIT_NORMAL;
    return (torque <= max_allowed);
}

// FSC核心监控函数 — 每个周期(1ms)调用一次
void fsc_monitor(SystemInputs *in, SystemOutputs *out) {
    // 初始化输出
    out->sensor_fault = false;
    out->calc_fault = false;
    out->torque_cutoff = false;

    // SM-01: APS交叉比较 (FSR-01)
    uint16_t aps_diff = (in->aps1_raw > in->aps2_raw) ?
                        (in->aps1_raw - in->aps2_raw) :
                        (in->aps2_raw - in->aps1_raw);
    uint16_t aps_threshold = (1000 * APS_THRESHOLD_PERCENT) / 100;

    if (aps_diff >= aps_threshold) {
        fault_counter++;
        if (fault_counter >= APS_FAULT_DURATION_MS) {
            out->sensor_fault = true;
        }
    } else {
        fault_counter = 0;
    }

    // SM-02: 扭矩计算合理性检查 (FSR-02)
    if (!is_torque_physically_valid(in->torque_cmd, in->aps1_raw, in->vehicle_speed)) {
        out->calc_fault = true;
    }

    // 故障响应与安全状态 (FSR-03, FSR-05)
    if (out->sensor_fault || out->calc_fault) {
        out->torque_cutoff = true;
        out->fault_flag = 0xA5;  // 置位故障标志
        out->torque_output = 0;  // 零扭矩指令
    } else {
        // 跛行模式限扭 (FSR-04)
        if (in->limp_mode) {
            out->torque_output = (in->torque_cmd > TORQUE_LIMIT_LIMP) ?
                                 TORQUE_LIMIT_LIMP : in->torque_cmd;
        } else {
            out->torque_output = in->torque_cmd;
        }
        out->fault_flag = 0x00;
    }
}

测试驱动与验证方法

为验证上述实现,编写以下测试用例并编译运行:


// test_fsc.c — 功能安全概念验证测试
#include <stdio.h>
#include <assert.h>
#include "fsc_monitor.c"

void test_sensor_fault_detection(void) {
    SystemInputs in = {.aps1_raw=500, .aps2_raw=560, .torque_cmd=100,
                       .vehicle_speed=50, .limp_mode=false};
    SystemOutputs out;
    // 模拟持续11ms的传感器偏差
    for (int i = 0; i < 11; i++) {
        fsc_monitor(&in, &out);
    }
    assert(out.sensor_fault == true);
    assert(out.torque_cutoff == true);
    assert(out.torque_output == 0);
    printf("TC1 传感器故障检测: PASS\n");
}

void test_calc_fault_detection(void) {
    SystemInputs in = {.aps1_raw=100, .aps2_raw=100, .torque_cmd=250,
                       .vehicle_speed=20, .limp_mode=false};
    SystemOutputs out;
    fsc_monitor(&in, &out);
    assert(out.calc_fault == true);
    assert(out.torque_cutoff == true);
    printf("TC2 计算错误检测: PASS\n");
}

void test_limp_mode_torque_limit(void) {
    SystemInputs in = {.aps1_raw=800, .aps2_raw=800, .torque_cmd=180,
                       .vehicle_speed=60, .limp_mode=true};
    SystemOutputs out;
    fsc_monitor(&in, &out);
    assert(out.torque_cutoff == false);
    assert(out.torque_output == TORQUE_LIMIT_LIMP);
    printf("TC3 跛行模式限扭: PASS\n");
}

int main(void) {
    test_sensor_fault_detection();
    test_calc_fault_detection();
    test_limp_mode_torque_limit();
    printf("全部功能安全概念验证测试通过\n");
    return 0;
}

编译与运行


gcc -o test_fsc test_fsc.c -Wall
./test_fsc

判定标准

执行上述测试程序,观察输出。若三个测试用例均打印“PASS”且最终显示“全部功能安全概念验证测试通过”,则判定功能安全概念实现满足FSR-01至FSR-05的验证要求。测试用例TC1验证传感器偏差持续10ms后触发安全状态;TC2验证扭矩超出物理范围立即触发安全状态;TC3验证跛行模式下扭矩被限制在30%以内且不触发安全状态。

功能安全概念 — 安全机制与状态转换 APS传感器 (两路信号) 扭矩计算模块 (VCU内部) 安全监控 SM-01: APS交叉比较 SM-02: 扭矩合理性 FSR-01/02检测 FSR-03 20ms响应 SS-01 安全状态 零扭矩输出 跛行模式 30%限扭 (FSR-04) 故障标志置位 (FSR-05) 故障 无故障+跛行 故障 最终输出扭矩 = 安全状态判定结果 → 发送至MCU 时间约束 传感器偏差持续 ≥10ms → 判定故障 (FSR-01) 故障确认后 ≤20ms → 进入安全状态 (FSR-03) 跛行模式扭矩限制 = 30% × 正常最大扭矩 (FSR-04)

验证结果判定

运行测试程序后,若三个测试用例均输出“PASS”,则证明:传感器偏差检测逻辑(FSR-01)、扭矩合理性检查(FSR-02)、安全状态响应(FSR-03)、跛行限扭(FSR-04)和故障标志置位(FSR-05)均已正确实现。该验证确认功能安全概念可执行且满足SG-01的ASIL C要求。测试用例TC1和TC2验证了故障路径,TC3验证了跛行模式非故障路径,覆盖了所有定义的安全机制。