4、诊断覆盖率计算方法:故障注入法、FMEDA分析法、经验公式法
诊断覆盖率怎么算?这个问题,我几乎每次评审都会被问到。说实话,刚入行那会儿我也挺头疼的——不同项目、不同阶段,用的方法完全不一样。今天咱们就把三种主流方法掰开揉碎了讲清楚。
我个人习惯把诊断覆盖率计算分成三类:故障注入法、FMEDA分析法、经验公式法。它们各有各的适用场景,也各有各的坑。
核心观点:没有一种方法能包打天下。成熟项目用FMEDA,验证阶段用故障注入,早期估算用经验公式。关键是要知道什么时候该用哪个。
4.1 故障注入法——最实在,但也最费劲
故障注入法,说白了就是故意把故障塞进系统,看诊断机制能不能抓到。我在一个安全气囊控制器项目里用过这招,当时为了覆盖一个SPI通信故障,整整折腾了两周。
基本流程是这样的:
- 确定故障模型——比如 stuck-at-0、stuck-at-1、位翻转、开路、短路
- 选择注入点——芯片引脚、内部寄存器、总线信号、存储器单元
- 执行注入——通过JTAG、探针台或软件模拟方式注入
- 观察响应——看诊断机制是否触发、触发时间、是否误报
- 计算覆盖率——DC = (检测到的故障数 / 注入的总故障数) × 100%
我的经验:故障注入不是越多越好。我曾经一次性注入了5000个故障,结果大部分是冗余的。关键是要覆盖所有失效模式,而不是追求数量。建议按功能模块分层抽样,每个模块至少选10-20个代表性故障。
这里有个常见的坑——故障注入的深度问题。你想想看,如果只在芯片引脚上注入故障,内部逻辑的诊断覆盖率根本测不到。我见过一个团队,报告说诊断覆盖率95%,结果现场出问题了,一查是内部RAM的故障根本没注入过。
警告:故障注入法测出来的覆盖率,只代表你注入的那些故障。如果故障模型不完整,覆盖率就是虚的。务必对照FMEDA的失效模式清单来设计注入用例。
4.2 FMEDA分析法——系统化,可追溯
FMEDA(Failure Modes, Effects and Diagnostic Analysis)是我个人最推荐的方法。它不像故障注入那样需要实际硬件,而是通过分析每个元器件的失效模式,逐一评估诊断措施的有效性。
核心步骤:
- 第一步:列出所有元器件及其失效模式(比如电阻开路、电容短路)
- 第二步:给每个失效模式分配失效率λ(从SN 29500或IEC 62380查)
- 第三步:判断每个失效模式是否能被诊断机制检测到
- 第四步:计算:DC = (Σλdetected / Σλtotal) × 100%
举个例子,一个简单的电源监控电路:
| 元器件 | 失效模式 | 失效率 (FIT) | 可诊断? | 说明 |
|---|---|---|---|---|
| 电压基准 | 输出漂移 | 50 | 是 | 看门狗定时器检测 |
| 电压基准 | 输出卡死 | 20 | 是 | 比较器检测 |
| 分压电阻 | 开路 | 10 | 是 | 电压超出范围 |
| 分压电阻 | 短路 | 5 | 否 | 无法区分正常值 |
| 比较器 | 输出卡死 | 30 | 否 | 无自检功能 |
算一下:总失效率 = 50+20+10+5+30 = 115 FIT,可诊断的 = 50+20+10 = 80 FIT。DC = 80/115 ≈ 69.6%。
注意:FMEDA的精度取决于失效率数据的准确性。我习惯用IEC 62380的数据,但不同标准差异挺大的。同一个电阻,SN 29500和MIL-HDBK-217给出的FIT值可能差两倍。所以,一定要注明数据来源。
4.3 经验公式法——快,但别太当真
经验公式法,说白了就是拍脑袋——当然,是有依据地拍。在项目早期,连原理图都没画完的时候,客户就问你要诊断覆盖率指标,这时候经验公式就派上用场了。
最常用的公式来自IEC 61508:
DC = 1 - (λ_DU / λ_total)
其中:
λ_DU = 危险未检测失效率
λ_total = 总失效率
对于简单系统,可以近似:
DC ≈ 1 - (1 - DC_sensor) × (1 - DC_logic) × (1 - DC_actuator)
这个公式的假设是各部分的诊断相互独立。但实际项目中,哪有那么独立?我曾经在一个液压系统中发现,传感器和执行器的诊断共用了同一个ADC通道,结果一个故障把两个诊断全干掉了。
避坑指南:经验公式只适用于概念设计阶段。一旦进入详细设计,必须用FMEDA或故障注入来验证。我见过有人拿着经验公式算出来的98%覆盖率去交差,结果审核专家直接问:“你的共因失效怎么考虑的?”当场哑口无言。
4.4 三种方法的对比与选择
我把三种方法的差异整理了一下,方便你对照:
| 维度 | 故障注入法 | FMEDA分析法 | 经验公式法 |
|---|---|---|---|
| 精度 | 高(实测数据) | 中高(依赖数据质量) | 低(估算值) |
| 成本 | 高(需要硬件平台) | 中(需要分析工具) | 低(Excel就能算) |
| 适用阶段 | 详细设计/验证 | 系统设计/认证 | 概念设计/投标 |
| 可追溯性 | 强(有测试记录) | 强(有分析文档) | 弱(缺乏细节) |
| 覆盖范围 | 受限于注入点 | 全元器件覆盖 | 系统级粗略估算 |
我个人习惯的做法是:先用经验公式快速估算,再用FMEDA做系统分析,最后用故障注入抽样验证关键路径。这样既保证了效率,又不会漏掉重要故障。
最后提醒一句:不管你用哪种方法,诊断覆盖率永远是一个统计值。它不代表你的系统一定安全,只代表在已知故障模型中,诊断机制能抓到多少。真正的安全,靠的是严谨的设计和充分的验证,而不是一个漂亮的百分比。