故障树是期望树的变种。故障树主要关注的是故障,也就是期望的反面,是“用户不期望发生什么”。如果一个被测对象不容易出故障,在可靠性方面的质量就比较好。所以,测试的一个重要任务,就是评估被测对象的故障发生概率。主要的手段,就是模拟被测对象的实际工作过程,在给定周期内统计故障出现的次数。
但是,有很多系统级的故障,测试起来是很难的。比如飞机刹车系统:
要想模拟飞机刹车系统的真实工作过程,而且要重复很多次,成本会非常高。怎么办呢?系统的思想告诉我们,被测对象一定具有多元性。飞机的刹车系统,也是由多个元素组成的,包括液压组件、控制组件、供电组件等等,刹车系统的故障,大概率是其中某个组件的故障导致的,而针对这些组件进行故障率的测试,相对来说是比较容易的。那么系统故障率和组件故障率之间,是一种什么关系呢?故障树分析,就是为了回答这个问题。
故障树的具体表示方法,比期望树要稍微复杂一些。我们来简单了解一下。
故障树中的节点有两类,“事件”和“门”。“事件”代表的就是故障,“门”代表的是故障之间的逻辑关系。“事件”又包括基本事件和中间事件两种,基本事件就是不用进一步分解的组件故障,用圆圈表示,是故障树的叶节点;中间事件就是需要进一步分解的故障,用矩形表示,除了根节点之外,一般不用画出来。
“门”也有很多种,包括与门、或门、k/N门、抑制门等等。这里,k/N门是一种特殊的或门,也叫投票门,有N个输入,只有当k个或k个以上输入事件发生的时候,输出事件才发生;抑制门的意思是,当输入事件发生,同时右侧标注的条件也满足的时候,输出事件才发生。相对的,在被测对象期望树里,父子期望之间的逻辑关系只有一种,就是“与”的关系。所有子期望都被满足的时候,父期望才有可能被满足。所以期望树里并不强调这些门。
我们以一个计算机系统为例,来看看故障树的图形化表示方法。
这个系统由总线、电源、中央处理器、内存等一些组件构成。假设我们关注的是“系统失败”这样一个系统级故障。针对它做故障树分析,得到的结果是这样。这里,B代表总线组件故障,C1/C2代表冗余CPU组件故障,M1/M2/M3代表冗余内存组件故障,PS代表电源组件故障。另外我们看到,这个故障树里还包括抑制门、或门、与门、投票门。针对这个故障树,我们来思考几个问题:
① 如果只有一个内存组件故障了,会导致系统失败吗?
② 如果两个内存组件故障了,会导致系统失败吗?
③ 如果电源故障了,会导致系统失败吗?
④ 如果只有一个CPU故障了,会导致系统失败吗?
⑤ 如果总线故障了,会导致系统失败吗?
故障树的构建过程,跟期望树的构建过程类似,也是一个自顶向下逐层分解的过程。我们来看一个例子。假设被测系统里有A、B、C、D四个组件,这是系统的结构框图:
整个系统的输入首先给到组件A,A的输出是组件B和C的输入,B和C的输出叠加作为组件D的输入,D的输出就是整个系统的输出。
我们关注的故障是“系统没有输出”。这是整个故障树的根节点。这个故障的直接原因只有一个,也就是故障①“组件D没有输出”。
继续对故障①进行分解:如果D没有输出,要么是因为没有输入给到D,要么是因为D本身故障了,有输入但是没输出。所以故障①可以分解成②“有输入给到D,但是D没有输出”、③“没有输入给到D”这两个故障,①和②、③之间的逻辑关系,用或门表示。假设我们的故障树分解只到组件本身故障这个级别,那么故障②就是一个叶节点了。
接下来我们对故障③进行分解:如果没有输入给到D,说明B和C都没有输出。所以故障③可以分解成④“B无输出”、⑤“C无输出”这两个故障,逻辑关系用与门表示。
然后对故障④进行分解:如果B没有输出,要么是因为没有输入给到B,要么是因为B本身故障了,有输入但是没输出。所以故障④可以分解成⑥“有输入给到B,但是B没有输出”、⑦“没有输入给到B”这两个故障,逻辑关系用或门表示。故障⑤跟故障④类似,可以分解成⑨“有输入给到C,但是C没有输出”、⑩“没有输入给到C”,这两个故障,逻辑关系用或门表示。
最后,故障⑦和⑩的原因都只有一个,就是⑧“有输入给到A,但是A没有输出”。到这里,我们就完成了整个故障树的构建。
如果我们能通过测试得到A、B、C、D四个组件的故障发生概率,②⑥⑧⑨这四个基本事件的发生概率就有了,我们就可以根据故障树,计算出根节点故障的发生概率,这就是我们想要的质量评估结论。