1 引言
故障树是指将要诊断的设备故障事件作为第一级;将导致该故障发生的所有原因并列作为第二级;然后用适当的逻辑门把它们与设备故障事件连接起来;再将第二级各故障事件发生的原因分别并列在第二级故障事件下面作为第三级;按照此方法,一级级往下,直到把最基本的不能再分解的原因都分析出来,得到的这样一张逻辑图称为故障树。
故障树分析包括定性分析和定量分析。定性分折的主要目的是寻找导致与系统有关的不希望事件发生的原因和原因的组合,即寻找导致顶事件发生的所有故障模式。定量分析的主要目的是当给定所有底事件发生的概率时,求出顶事件发生的概率及其他定量指标。
2 定性分析算法的实现
图1为一个示例故障树,基本事件X1~X5别代表故障1~故障5。
图1 示例故障树
定性分析重点就是求出故障树的MCS ,得到导致顶层故障发生的各种故障模式。求MCS通常有:求割集有下行法、上行法和BDD法等。
下面采用MFC中的CList链表,结合环形数组来实现下行法。CList是MFC中一个链表类,链表节点可以存储各种数据结构,且具有丰富的链表操作函数,诸如本算法用到的GetAt()、RemoveAt()、InsertBefore()、FindIndex()、GetCount()和IsEmpty()等,使用非常方便,省去了自己定义链表以及链表操作函数的复杂过程。
首先定义个故障树节点结构体FtNode,包含了故障树节点的各种信息,该结构体代表各节点信息,并存储在CList链表中。
typedef struct FtNode
{
int GateType; //门类型
int ChildrenNum; //孩子节点数
double cf; //基本事件发生概率
CString NodeDescription; //故障事实描述,如下文
//的“X1故障”
……//包含其它的信息
}
定义一个存放按层次遍历得到的故障树各节点的CList链表:CList<FtNode, FtNode&> FtList,存储形式如图2所示。
图2 节点在CList中的存储
接着以数组形式定义200个CList链表(可按实际故障树大小来调整改大小):
CList<FtNode, FtNode&> CutSet[200]
求解过程的基本思路是:首先FtList中的T节点添加到CutSet[0],用counter计数当前已经使用过的数组数量,用i,j,l控制三层for循环,外层循环i