2. Stateflow建模核心机制
Stateflow 的本质不是“画流程图”,而是用可执行的有限状态机语义描述控制逻辑。要真正读懂和写好 Stateflow,必须把四个核心概念放在同一张语义网里理解:状态(State)定义系统“处于什么情形”,转移(Transition)定义情形之间“如何切换”,条件(Condition)决定切换“是否允许”,动作(Action)规定切换前后“做什么”。四者缺一不可,且执行顺序有严格规定。
一、状态:活动与层次
状态是 Stateflow 的基本执行单元。一个状态被激活(active)时,其内部逻辑才参与求值。状态可以包含 entry、during、exit 三类动作:entry 在进入该状态的瞬间执行一次,during 在该状态保持活动且没有发生转移的每个仿真步执行,exit 在离开该状态时执行一次。这三类动作的时序语义是 Stateflow 区别于普通流程图的关键。
状态可以嵌套,形成层次化状态(Hierarchical State)。父状态激活时,其内部默认转移会选择一个子状态进入。层次化的工程价值在于:把公共的 entry/exit 动作放在父状态,子状态只关注差异化逻辑,从而避免重复代码。例如一个“电机控制”父状态负责使能 PWM 输出,其子状态“加速”“匀速”“减速”只描述转速目标的变化。
二、转移、条件与动作语义
转移是从源状态到目标状态的有向连接,其完整语法为:
源状态 → [条件]{条件动作}/转移动作 目标状态
其中方括号内是条件表达式,花括号内是条件动作(condition action),斜杠后是转移动作(transition action)。执行顺序为:先求值条件,条件为真时执行条件动作,然后执行转移动作,最后退出源状态并进入目标状态。条件动作与转移动作的区别在于:条件动作在源状态仍处于活动状态时执行,转移动作在源状态退出之后、目标状态进入之前执行。这一区别在涉及共享变量读写时非常关键。
转移的默认执行规则是:同一仿真步内,Stateflow 会按从外到内、从上到下的优先级顺序扫描转移。若多个转移条件同时为真,只有优先级最高的那条被执行。因此,在绘制多条并行转移时,必须显式考虑它们的相对位置,否则会出现“条件都满足但只走了一条”的意外行为。
三、默认转移与历史节点
当父状态被激活时,需要决定进入哪个子状态。这由默认转移(Default Transition)完成。默认转移没有源状态,只有目标状态,通常带有一个条件,用于在多个子状态之间做初始选择。若没有默认转移,父状态激活后其子状态均不激活,逻辑将无法继续。
历史节点(History Junction)解决的是“重新进入父状态时回到哪里”的问题。普通默认转移每次进入父状态都从固定子状态开始;而历史节点会记住上一次退出父状态时最后活动的子状态,重新进入时直接恢复到该子状态。历史节点分为浅历史(Shallow History)和深历史(Deep History):浅历史只恢复父状态直接子层的活动状态,深历史则递归恢复到最深层子状态。在工程中,历史节点常用于“暂停—恢复”类逻辑,例如模式切换后回到之前的运行档位。
四、并行状态
并行状态(Parallel State)用虚线边框表示,其内部多个子状态同时处于活动状态,而不是互斥选择。并行状态适合描述“同时成立的多条独立逻辑”,例如一个控制器同时运行“温度监控”和“压力监控”两条并行分支。并行分支之间通过共享变量或事件交互,但各自独立求值。需要注意的是,并行状态内部的转移仍然遵循各自的层次和优先级规则,不能假设并行分支之间存在隐式同步。
五、工程含义与常见陷阱
理解上述机制后,可以归纳出几条工程实践要点。第一,层次化状态不是装饰:父状态的 entry/exit 动作只在进入和离开父状态时执行一次,而不是每次子状态切换都执行。若把“使能输出”放在父状态 entry,把“关闭输出”放在父状态 exit,就能保证子状态切换过程中输出始终使能,避免抖动。
第二,默认转移必须显式设计。很多模型在父状态激活后没有任何子状态活动,导致输出保持上一次值,仿真结果看似“卡住”。检查方法是在 Stateflow 中查看父状态激活时是否有默认转移指向某个子状态。
第三,历史节点与默认转移不能混用在同一层级。若父状态同时存在默认转移和历史节点,Stateflow 会优先使用历史节点恢复上次状态;只有在没有历史记录时(首次进入)才使用默认转移。这一行为在“首次上电”和“故障恢复”场景中需要特别验证。
第四,并行状态的执行顺序。并行分支在同一个仿真步内按从上到下的顺序求值,但每个分支内部的转移是独立判断的。若两个并行分支都写同一个变量,后执行的分支会覆盖先执行的分支。因此,并行状态之间应尽量通过明确的共享变量或事件交互,而不是依赖隐式顺序。
最后需要强调:Stateflow 的语义是确定性的,但确定性不等于直观。同一张图,转移的绘制顺序、默认转移的有无、历史节点的深浅,都会改变实际执行路径。工程中应把“状态—转移—条件—动作”四要素作为审查清单,逐条确认其语义是否符合设计意图,而不是仅凭图形外观判断逻辑正确性。