1. 故障树基本结构构建

故障树基本结构构建 学习卡片

任务说明

以离心泵“意外停机”为顶事件,构建一个三层故障树基本结构:顶事件→中间事件→底事件,并为每个中间事件明确逻辑门类型(与门/或门)。本案例聚焦故障树的结构搭建与逻辑门定义,不涉及定量计算。

故障树结构

顶事件:离心泵意外停机 或门 中间事件M1:机械故障 中间事件M2:电气/控制故障 或门 X1:轴承 磨损卡死 X2:叶轮 断裂 X3:机械 密封泄漏 或门 X4:电机 过载烧毁 X5:控制 回路断线 X6:变频器 故障 顶事件 中间事件 底事件 逻辑门

逻辑门定义

门位置门类型输入事件输出事件逻辑含义
G0(顶层)或门M1, M2顶事件TM1或M2任一发生,顶事件即发生
G1(M1下方)或门X1, X2, X3M1任一底事件发生,M1即发生
G2(M2下方)或门X4, X5, X6M2任一底事件发生,M2即发生

Python代码实现

from dataclasses import dataclass
from typing import List, Dict

@dataclass
class Event:
    """故障树事件节点"""
    id: str
    name: str
    event_type: str  # 'top' / 'intermediate' / 'basic'
    gate: str = None  # 'OR' / 'AND' / None(底事件无门)
    children: List[str] = None

    def __post_init__(self):
        if self.children is None:
            self.children = []

class FaultTree:
    """故障树基本结构"""
    def __init__(self):
        self.events: Dict[str, Event] = {}

    def add_event(self, event: Event):
        self.events[event.id] = event

    def build_pump_tree(self):
        """构建离心泵意外停机故障树"""
        # 顶事件
        self.add_event(Event('T', '离心泵意外停机', 'top', gate='OR',
                             children=['M1', 'M2']))
        # 中间事件
        self.add_event(Event('M1', '机械故障', 'intermediate', gate='OR',
                             children=['X1', 'X2', 'X3']))
        self.add_event(Event('M2', '电气/控制故障', 'intermediate', gate='OR',
                             children=['X4', 'X5', 'X6']))
        # 底事件
        self.add_event(Event('X1', '轴承磨损卡死', 'basic'))
        self.add_event(Event('X2', '叶轮断裂', 'basic'))
        self.add_event(Event('X3', '机械密封泄漏', 'basic'))
        self.add_event(Event('X4', '电机过载烧毁', 'basic'))
        self.add_event(Event('X5', '控制回路断线', 'basic'))
        self.add_event(Event('X6', '变频器故障', 'basic'))

    def display_structure(self):
        """打印故障树结构"""
        print("=" * 50)
        print("故障树结构(离心泵意外停机)")
        print("=" * 50)
        for e in self.events.values():
            if e.event_type == 'top':
                print(f"[顶事件] {e.id}: {e.name} (门: {e.gate})")
                for cid in e.children:
                    child = self.events[cid]
                    print(f"  ├─ [中间事件] {child.id}: {child.name} (门: {child.gate})")
                    for gid in child.children:
                        gc = self.events[gid]
                        print(f"  │    ├─ [底事件] {gc.id}: {gc.name}")
            print()

    def get_min_cut_sets(self):
        """获取最小割集(全部为或门时,每个底事件即一个最小割集)"""
        cuts = []
        for e in self.events.values():
            if e.event_type == 'intermediate':
                for cid in e.children:
                    cuts.append([cid])
        return cuts

if __name__ == "__main__":
    ft = FaultTree()
    ft.build_pump_tree()
    ft.display_structure()
    print("最小割集(或门结构下):")
    for i, cut in enumerate(ft.get_min_cut_sets(), 1):
        print(f"  {{{', '.join(cut)}}}")

运行与验证

运行方式:将上述代码保存为 fault_tree.py,在Python 3.8+环境中执行 python fault_tree.py。

预期输出:程序会打印完整的故障树层级结构,显示顶事件T通过或门连接M1、M2,M1通过或门连接X1~X3,M2通过或门连接X4~X6;随后输出6个最小割集:{X1}、{X2}、{X3}、{X4}、{X5}、{X6}。

判定标准:输出结构与上方SVG图一致,且最小割集数量为6(每个底事件单独构成一个割集),即说明故障树基本结构构建正确。由于本案例全部采用或门,任一底事件发生即可导致顶事件,符合“意外停机”的失效逻辑。