2. Stateflow核心建模元素回顾

在故障管理与安全状态机设计中,Stateflow 的价值并不只是“画状态图”,而是把故障的判定、确认、降级、恢复与锁定等逻辑,用可执行、可验证的语义精确表达出来。要写出可靠的安全状态机,必须先回到 Stateflow 的核心建模元素,理解每个元素在故障语境下究竟承担什么职责。本节围绕状态、转移、条件、动作、默认转移、历史节点、并行状态与层次化状态机展开,重点说明它们如何组合成故障管理逻辑。

状态:故障语义的载体

状态(State)是 Stateflow 中最基本的语义单元,表示系统在某一时刻所处的模式或条件。在故障管理中,状态通常不是随意命名的“模式”,而是带有明确工程含义的故障阶段。例如,一个电机控制器的故障管理可以划分为 Normal、FaultDetected、FaultConfirmed、SafeStop、FaultLatched 等状态。每个状态内部可以包含 entry、during、exit 动作,分别表示进入该状态时执行一次、处于该状态期间持续执行、离开该状态时执行一次。故障确认状态往往在 entry 中记录故障码和时间戳,在 during 中维持降级输出,在 exit 中清除临时标志。状态还可以设置 on 事件动作,用于响应特定事件而不改变状态。

状态分为互斥(OR)和并行(AND)两种。互斥状态同一层级只能激活一个,适合表达故障等级或运行模式;并行状态在同一父状态下可同时激活多个,适合表达“故障监控”与“输出控制”同时运行。理解这一点,是设计层次化故障管理的前提。

转移、条件与动作:故障判定的执行路径

转移(Transition)描述状态之间的迁移关系,由源状态、目标状态、条件(Condition)和动作(Action)组成。条件写在方括号中,例如 [faultCounter >= 3];动作写在斜杠之后,例如 {faultCode = 0x21;}。在故障管理中,转移条件通常来自故障检测结果、去抖计数、时间窗口或外部事件。例如,从 Normal 到 FaultDetected 的条件可以是 [sensorValid == 0],而从 FaultDetected 到 FaultConfirmed 的条件可以是 [faultCounter >= 3],表示连续三个采样周期检测到异常才确认故障。

转移动作适合执行“一次性”的副作用,例如置位故障标志、记录故障码、触发报警。需要特别注意的是,条件判断和动作执行有明确的顺序语义:先判断条件,条件为真才执行动作并完成迁移。若同一状态有多条转移,Stateflow 按从上到下的顺序评估,因此故障优先级高的转移应放在前面。这一点在安全状态机中非常关键,例如“紧急停止”转移必须优先于“正常恢复”转移。

默认转移:确定初始故障状态

默认转移(Default Transition)用于指定进入某个父状态或层次结构时首先激活哪个子状态。在故障管理中,默认转移决定了系统上电或复位后的初始状态。例如,一个故障管理超级状态 FaultManager 的默认转移应指向 Monitoring 子状态,而不是直接进入 SafeStop。默认转移还可以带条件,例如根据 powerOnSelfTest 的结果选择进入 Normal 或 FaultLatched。如果缺少默认转移,Stateflow 在进入该层级时无法确定初始状态,可能导致仿真报错或行为不确定。因此,每个层次化状态的入口都应有明确的默认转移。

历史节点:故障恢复与断点续行

历史节点(History Junction)用于记住上一次离开父状态时所处的子状态。在故障管理中,历史节点常用于“故障恢复后回到原状态”的场景。例如,系统从 Normal 进入 FaultConfirmed 后,经过处理又回到 Normal 超级状态,如果使用历史节点,就能恢复到故障前所处的具体子状态(如 Run 或 Idle),而不是重新从默认状态开始。历史节点分为浅历史(Shallow History)和深历史(Deep History):浅历史只记住直接子状态,深历史记住整个层次路径。对于多级故障管理,深历史更常用,但也要注意它可能恢复到一个已经不再安全的状态,因此通常需要配合恢复条件使用。

并行状态与层次化状态机:故障管理的结构骨架

并行状态允许同一父状态下多个子状态同时激活,非常适合表达“故障检测”和“故障响应”并行运行。例如,父状态 System 下可以有两个并行区域:FaultDetection 和 OutputControl。前者负责监控传感器、计算故障计数,后者负责根据故障等级调整输出。两个区域通过共享数据或事件通信,而不是互相阻塞。层次化状态机则通过父状态嵌套子状态,把复杂故障逻辑分解为多个层级。父状态可以定义公共的 entry/exit 动作,子状态只关注自身差异。这样既减少了重复,又让故障优先级和状态迁移更清晰。

下面用一个简化的故障管理状态机示意,展示正常、检测、确认、安全停止与锁定之间的迁移关系,以及并行监控区域和历史节点的位置。

故障管理状态机核心元素示意 并行区域(AND):FaultDetection 与 OutputControl 同时运行 FaultDetection(故障检测) Normal entry: faultCounter=0 FaultDetected during: counter++ FaultConfirmed entry: set DTC FaultLatched entry: latch=true H 历史节点 默认转移 [sensorValid==0] [counter>=3] [faultSevere] [recovered] OutputControl(输出控制) NormalOutput during: PWM=100% DegradedOutput during: PWM=50% SafeStop entry: PWM=0 LatchedOutput entry: disable [faultDetected] [faultConfirmed] [faultSevere] 事件/数据 正常状态 检测/降级 确认/安全停止 锁定状态 历史节点 H

故障管理中的组合表达方式

把上述元素组合起来,可以形成一套清晰的故障管理表达模式。第一,用层次化父状态划分故障管理阶段,例如 FaultManager 下包含 Monitoring、Handling、Recovery 三个子状态,每个子状态再细分。第二,用并行区域让检测与控制同时运行,检测区域负责去抖和确认,控制区域负责输出降级。第三,用条件转移表达故障判定阈值,例如连续三次采样异常才确认,避免误报。第四,用转移动作记录故障码和触发报警。第五,用默认转移确定上电初始状态,用历史节点支持恢复后回到原状态。第六,用 entry/during/exit 动作管理故障标志和输出。

需要强调的是,安全状态机的设计必须考虑故障优先级和状态可达性。高优先级故障转移应放在同一状态转移列表的上方,确保紧急停止优先于普通恢复。锁定状态应设计为只能通过特定复位事件退出,避免故障自动清除。历史节点虽然方便恢复,但在安全相关场景中要谨慎使用,必要时用条件限制恢复路径。只有把这些核心元素与故障语义一一对应,Stateflow 模型才能真正成为可执行、可验证的安全状态机,而不是一张仅供阅读的示意图。