FS-A4 — 安全机制分类学:检测 / 反应 / 容错三类为何如此切分,以及它们的适用边界

本质与导读

专家养成 · 模块一(功能安全)· A 阶第 4 讲。上一讲 FS-A3 把 FTTI 拆成 两段,并反推到采样率。但我们一直把"安全机制(SM)"当黑盒——只知道它要"检出+反应",没想清楚:检测段和反应段到底是不是同一种东西?为什么 ISO 26262 把 SM 切成检测 / 反应 / 容错三类而不是两类或五类?今天补这块地基。把这三类的本质差异钉死,你做架构时就不会再犯那个最贵的错:把一个只会"举手"的检测 SM,在 FMEDA 里当成"能让系统变安全"的机制来 claim。

开篇:硬约束——"检出故障"和"系统安全"是两件事,混为一谈会污染整条 Safety Case

先立一个反直觉的事实:一个诊断覆盖率 99% 的检测机制,本身对系统安全的贡献可以是零。它只产出一个信息——"这里有故障",一面举起来的旗子。旗子举起来之后系统该怎么活下去,是另一个机制的事。如果没有那个机制,旗子举得再准,器件该炸还是炸。

为什么这一点必须在碰任何具体 SM(Lockstep / Watchdog / DESAT)之前先想清楚?因为 SM 的"角色"不是命名问题,是会进 FMEDA 算式的结构问题。FMEDA 给每个故障分配诊断覆盖率 DC,这个 DC 只能由检测类 SM 提供;而"故障被检出后系统真的进了安全态"是反应类SM 的职责,它不进 DC、进的是 FRTI 时序论证。工程师最常见、也最贵的错,是把这两个角色在脑子里粘成一个"安全机制",于是 FMEDA 里给某条故障 claim 了 90% DC,却从没人论证检出之后那条反应链是否存在、是否在 FRTI 内完成——一个静默的假证据,直到 Fault Injection 才暴露(正是 FS-A1 说的链断在接口)。

所以这一讲的硬约束是:每个安全机制在"故障 → 危害"这条链上只占一个角色,角色决定它进哪个度量、补哪一段时间预算、有什么失效模式。分类不是记忆题,是不让 FMEDA 算式里混入角色错位的伪证据。 下面从第一性原理推:为什么角色恰好是三个。


中段一:第一性原理——三类不是约定,是"故障传播链"上两种哲学逼出来的

回到失效的物理传播:故障(fault)→ 误差(error)→ 失效(failure)→ 危害(hazard)。一个安全机制要做的,本质是在这条链的某一点切断它,阻止它走到 hazard。能切的点不是任意多,数学上只有两种根本不同的哲学:

哲学一:屏蔽(mask)。 在"误差 → 失效"这一步之前就把误差纠正/掩盖掉,让失效根本不到达 item 边界,输出始终正确。代价:需要冗余(多一份正确的东西来覆盖坏的那份)。收益:功能不中断,用户侧没有 FTTI 倒计时——因为对外可见的输出从未出错。这就是容错类(fault-tolerant) SM。

哲学二:跳闸(trip)。 不纠正,而是放弃功能、把系统拽进一个预先设计好的安全态,在"失效 → 危害"这一步之前完成。代价:功能中断(扭矩归零 / 进降级 / 停机)。收益:不需要冗余,便宜。

关键的第二步推理:跳闸这条哲学,在因果上必然再分成两个角色。因为从"故障已发生"到"系统已在安全态",中间恰好跨两次状态转移(这正是 FS-A3 推 的同一个结构):先得知道有故障,再据此动作进安全态。前者是**检测类(detection)SM——产出一面旗子,吃 FDTI;后者是反应类(reaction)**SM——产出一次状态转移,吃 FRTI。

于是三类的来历清清楚楚:容错 = 屏蔽哲学;检测 + 反应 = 跳闸哲学被两次状态转移劈成的两半。 不是两类(漏了屏蔽这条独立哲学),不是五类(跳闸只有两次转移,凑不出第三段)。三,是被故障传播链 + 状态机结构定死的。


安全机制三类 — 故障→误差→失效→危害链上,屏蔽哲学(误差→失效前纠正=容错,需冗余≥3辨真)与跳闸哲学(失效→危害前=检测产flag吃FDTI + 反应产状态转移吃FRTI);检测≠安全,冗余=2仅检测、≥3才容错

中段二:三类的本质差异——产出物、度量、失效模式各不相同

三类的根本区别,一句话:它们产出的东西类型不同,而产出物类型决定了用什么度量、有什么失效模式。

检测类产出的是信息(一个 flag)。它不改变系统的能量或状态,只把"未知有故障"变成"已知有故障"。因此它被诊断覆盖率 DC 度量(测得到的故障占比),被 FDTI 计时。它有两个对称的失效模式:漏检(DC 不足,故障溜过去)和误检(false positive,把合法工况误判成故障)。第二个常被忽视却同样致命——误检会触发一次不必要的安全态转移,而"无故障却进安全态"本身可能是另一类危害(高速误触发主动短路)。典型:DESAT 比较器、ADC 合理性/范围检查、CRC、ECC 的校验位、看门狗、Lockstep 比较器。

反应类产出的是一次状态转移(搬运能量)。它把"已知有故障"变成"已在安全态"。它不进 DC,被 FRTI + 安全态正确性度量。失效模式:太慢(吃光 FTTI)、动作错(进了一个其实不安全的"安全态")、或根本没动(执行器卡死)。它有一个结构性依赖:反应类必须被检测类点火,自己不会启动。典型:STO/ASC 触发逻辑、软关断时序、扭矩切断路径、继电器断开、安全状态管理器

容错类产出的是持续正确的功能。它被的度量既不是 DC 也不只是 FRTI,而是冗余的独立性——也就是共因失效 CCF / 因子(后面 FS-B5 专讲)。它的失效模式很特别:不是"漏检"或"太慢",而是共因把多份冗余一起打掉(同一批次、同一电源、同一时钟的冗余其实不独立),以及冗余的静默耗尽——备份通道自己悄悄坏了没人知道,等主通道也坏时才发现无可顶替(这正是 FS-A3 那根 MPFDTI 潜伏轴要管的事)。典型:TMR 表决、ECC 纠错(注意:纠错才是容错,只校验是检测)、热备冗余通道、双电源 ORing。

把这三句话连起来看:检测产信息、反应产状态、容错产功能;分别被 DC、FRTI、独立性度量;分别死于漏检/误检、太慢/动作错、共因/静默耗尽。 度量错配是 FMEDA 出假证据的根源——拿 DC 去描述一个容错机制,或者忘了给容错机制立 MPFDTI 自检,都会让 SPFM/LFM 算出一个站不住的数。


中段三:最隐蔽的陷阱——"有冗余"不等于"能容错",分水岭是能否辨真

这是分类学里最容易翻车、面试和评审都爱考的一点:双重冗余给的是检测,三重冗余才给容错

为什么?从第一性原理看,屏蔽(容错)要求系统不仅知道"有人错了",还要能指认"谁是对的"——否则拿什么去覆盖坏值?两份冗余比对,只能得出"两者不一致"这个检测结论:你知道有一个坏了,但没有第三方裁决,无法判定哪一个坏,因此无法继续输出正确功能,只能跳闸进安全态。这就是为什么 Lockstep 双核 本质是检测类SM(比较器产出 flag),而非容错——它检出分歧后仍需一次反应进安全态。

要跨过"检测 → 容错"这道坎,数学上必须能多数表决辨真:冗余度 在 2-out-of-3 表决下,允许 1 份出错仍能由多数指认正确值。所以掩盖单点的最小冗余度是

其中 是要同时容忍的故障数。(容单点)逼出 ——TMR 的 3 不是工程惯例,是"辨真需要多数"的代数下限。这条也解释了 ECC 为什么能算容错:一个 Hamming/SECDED 码,校验位提供的冗余足以指认出错的那一位并翻转它(纠 1 位),于是检测+反应在数据通路里坍缩成一步原子操作,FRTI 、安全态 = 正确输出——这就是容错的另一副面孔:把检测和反应融进数据流、快到不需要退化安全态

一句话收束这个陷阱:冗余 ≥3(或有独立裁决)才能辨真 → 才能屏蔽 → 才是容错;冗余 =2 只能发现分歧 → 是检测,后面还得接反应。 把 Lockstep 在 FMEDA 里当容错 claim(以为双核就能容单点不停机),是 SPFM 虚高的经典来源。


中段四:适用边界——选哪一类,由"安全态是否存在且可达"一刀切开

三类不是越高级越好,选型由一个二元判据决定:该 item 是否存在一个能在 FTTI 内到达、且本身确实安全的退化/安全态?

答"是"——用检测 + 反应,别用容错。 大多数 EV 主驱属此类:扭矩归零 / 主动短路(ASC)是一个合法安全态,踏板失效让车失去动力虽不舒服但不致命。此时跳闸哲学最经济——一套诊断 + 一条反应链,不必养冗余通道。强行上容错是烧钱过度设计。检测+反应的工程范式就是经典的 E-Gas 三层监控:L1 功能、L2 监控(检测)、L3 控制器自监控,层层产 flag 再汇到反应。

答"否"——必须用容错,检测+反应不够。 线控转向 / 线控制动 / L3+ 自动驾驶:没有"停机"这个安全态——高速上方向盘失去助力、或自动驾驶突然交还一个没准备的驾驶员,跳闸本身就是危害。这类 fail-operational 系统单点失效后仍必须维持功能,只能靠容错(冗余通道热接管),代价是冗余度 套独立硬件 + 独立性论证(CCF)。这条边界正是 FS-D3 fail-operational 架构的入口。

中间还有一档降级运行(fail-degraded):存在一个"功能打折但仍可控"的态(如转矩限幅、跛行回家),它介于满功能容错与完全停机之间,用部分冗余 + 检测反应组合实现。判据始终是同一个:你能退到的那个态,到底安不安全、够不够用、来不来得及。 安全态决定哲学,哲学决定该养几类 SM——这就是分类学落到架构决策的那一刀。


落到工程结论:给每个 SM 定角色的流程 + 三条准则

拿到一个候选安全机制,按这个流程定它的类、避免 FMEDA 角色错位:

  1. 问产出物:它输出的是 flag(信息)、状态转移(能量),还是持续正确功能?——一步定检测 / 反应 / 容错。
  2. 配度量:检测 → 进 DC、立 FDTI;反应 → 进 FRTI、论证安全态正确性,并确认它被哪个检测 SM 点火;容错 → 立 CCF/ 独立性论证,并给它配 MPFDTI 自检防静默耗尽。
  3. 查配对:每个检测 SM 必须有下游反应 SM 接住,否则旗子无人响应;每个反应 SM 必须有上游检测点火。检测+反应必须成对进 FMEDA,缺一即假证据。
  4. 辨冗余真伪:遇到"冗余"先问冗余度——=2 是检测(归到检测类、后接反应), 或有独立裁决才是容错。别把 Lockstep 当容错。
  5. 回判边界:用"安全态是否存在且 FTTI 内可达"复核——若 item 是 fail-operational,检测+反应不够,必须升级到容错。

带走三条准则:

  1. 检测 ≠ 安全。 检测只产信息,系统变安全要靠反应或容错;DC 再高的检测 SM,没有配对的反应链,安全贡献为零。
  2. 角色决定度量,度量错配出假证据。 检测进 DC、反应进 FRTI、容错进 CCF;拿错尺子量,SPFM/LFM 必然虚高。
  3. 冗余度划开检测与容错。 =2 只能发现分歧(检测), 或有裁决才能辨真屏蔽(容错);安全态是否存在,则划开"跳闸"与"屏蔽"两条哲学。

承上启下:今天把安全机制劈成检测 /…

承上启下:今天把安全机制劈成检测 / 反应 / 容错三类,看清它们由故障传播链的两种哲学(屏蔽 vs 跳闸)+ 跳闸的两次状态转移(FDTI / FRTI)必然导出,各自产出物、度量、失效模式、适用边界都不同。但还有个问题悬着:这些 SM 是被谁、按什么规则"派活"的?它们的需求从 SG 一路 SG→FSR→TSR→HSI 细化下来,每一级凭什么"既不漏也不超"?下一讲 FS-A5 拆需求细化的"覆盖且不超出"数学约束,以及 traceability 为何必须双向——正是它保证今天每个 SM 都恰好落在某条 TSR 上、不多不少。预热可读 安全机制目录


延伸阅读