4. 并行状态与互斥状态设计

在Stateflow中,一个父状态内部可以包含多个子状态,而这些子状态之间究竟是“同时都在跑”还是“同一时刻只能有一个在跑”,取决于父状态被定义为AND分解还是OR分解。这是并行与互斥设计的根本分水岭,也是多任务并发控制逻辑能否被正确建模的前提。理解这一点,比记住任何菜单操作都重要。

一、OR分解:互斥状态的本质

OR分解(OR Decomposition)意味着父状态在同一时刻至多只有一个子状态处于激活状态。这是Stateflow的默认分解方式,也是绝大多数控制逻辑的自然形态。例如一个电机控制状态机,父状态“电机控制”下包含“停止”“启动”“运行”“故障”四个子状态,任意时刻电机只能处于其中一种工况,这就是典型的互斥关系。

OR分解的关键机制是默认转移(Default Transition)。当父状态被激活时,必须有一条默认转移指向某个子状态,否则模型在仿真时会报“无默认转移”错误。默认转移决定了父状态首次进入时从哪个子状态开始。此外,OR分解下的子状态之间通过转移箭头互相切换,转移条件一旦满足,源状态退出、目标状态进入,二者不会同时激活。

需要特别注意的是互斥状态的退出语义:当从子状态A转移到子状态B时,A的exit动作先执行,随后B的entry动作执行。如果A和B都需要操作同一个输出变量,必须保证退出动作不会破坏B的进入动作所依赖的前置条件,否则会出现难以定位的时序缺陷。

二、AND分解:并行状态的同步执行

AND分解(AND Decomposition)让父状态下的多个子状态同时激活、同步执行。在Stateflow图形上,AND分解的父状态边框为虚线,子状态之间用虚线分隔,表示这些区域并行运行。例如一个“整车控制”父状态,可以并行包含“动力管理”“热管理”“通信管理”三个子区域,三者同时工作、互不阻塞。

并行状态的核心特征是同步执行语义:在每个仿真步长内,所有激活的并行子状态都会被执行一次,它们的转移判断、动作执行在同一时刻发生。这意味着并行区域之间不存在执行顺序的天然保证,如果两个并行区域同时修改同一个变量,结果将取决于Stateflow内部的执行顺序,这是工程上必须规避的隐患。

并行状态的进入与退出遵循“整体进入、整体退出”原则:父状态被激活时,所有并行子区域同时进入各自的默认子状态;父状态退出时,所有并行子区域同时退出。因此并行区域适合表达“必须同时存在、缺一不可”的功能集合,而不适合表达“可选执行”的逻辑。

OR分解(互斥)与 AND分解(并行)对比 OR 分解 · 互斥状态 同一时刻至多一个子状态激活 父状态:电机控制 默认转移 → 停止 停止 启动 运行 故障 转移条件满足时:源状态 exit → 目标状态 entry 任意时刻仅一个状态处于激活 ⚠ 必须配置默认转移,否则报错 AND 分解 · 并行状态 所有子区域同时激活、同步执行 父状态:整车控制 虚线边框 = AND 分解 动力 管理 扭矩分配 转速控制 热 管理 水泵控制 风扇调速 通信 管理 CAN收发 故障上报 每个仿真步长内所有区域各执行一次 区域间无天然执行顺序保证 ⚠ 共享变量需做互斥保护

三、状态冲突与优先级

当并行区域之间存在资源竞争或逻辑耦合时,冲突就出现了。常见的冲突有三类:共享变量写冲突、转移条件互斥冲突和事件响应顺序冲突。

Stateflow对并行状态的执行顺序有明确的规则:按图形上从左到右、从上到下的顺序执行。这个顺序是确定的,但不应被依赖为业务逻辑的一部分,因为一旦图形布局调整,顺序就可能改变。正确的做法是:如果两个并行区域确实需要严格的先后关系,就不应该用AND分解,而应该用OR分解或显式的顺序控制。

对于共享变量的保护,工程上通常采用三种策略:一是职责分离,让每个并行区域只写自己的专属变量,通过父状态的during动作统一汇总;二是优先级仲裁,在父状态中设置优先级标志,高优先级区域先执行并置位标志,低优先级区域检测到标志后跳过写操作;三是事件驱动,用send和receive机制让并行区域通过事件通信,而不是直接读写共享变量。

四、多任务并发控制逻辑的建模方法

以一个“电池管理系统(BMS)”为例,说明并行与互斥的混合建模。BMS需要同时完成电压采集、温度采集、SOC估算、均衡控制、故障诊断五项任务,其中前四项可以并行执行,故障诊断则需要与它们互斥——因为故障发生时必须暂停其他任务并进入安全状态。

建模结构如下:顶层父状态“BMS运行”采用AND分解,包含“采集与估算”和“故障诊断”两个并行区域。其中“采集与估算”区域内部再采用OR分解,包含“正常采集”“均衡中”“降功率”三个互斥子状态;“故障诊断”区域内部采用OR分解,包含“无故障”“一级故障”“二级故障”三个互斥子状态。当“故障诊断”进入“二级故障”时,通过send(EVENT_FAULT)向“采集与估算”区域发送事件,后者接收到事件后从当前状态转移到“降功率”状态。

关键参数示例(合理假设):电压采集周期10ms,温度采集周期100ms,SOC估算周期50ms,均衡控制周期200ms,故障诊断周期20ms。这些周期通过并行区域内的after时序逻辑实现,例如after(10, msec)触发电压采集转移。由于各区域周期不同,它们在同一仿真步长内可能只有部分区域发生转移,这正是并行状态“同步执行、异步转移”的典型表现。

建模检查要点:① OR分解的父状态是否配置了默认转移;② AND分解的并行区域是否真的需要同时存在;③ 并行区域之间是否存在共享变量写操作;④ 并行区域的执行顺序是否被业务逻辑隐式依赖;⑤ 跨区域通信是否使用了事件机制而非直接变量读写。

五、常见错误与排障

最常见的错误是把本该互斥的状态画成了并行。例如“前进”和“后退”两个状态,如果误用AND分解,电机会同时收到正转和反转指令,导致堵转或驱动器报警。判断方法很简单:问自己“这两个状态能否同时为真”,如果答案是否定的,就必须用OR分解。

第二个常见错误是并行区域中使用了相同的输出变量。例如两个并行区域都写motor_cmd,仿真结果会随执行顺序变化而抖动。解决方法是在父状态的during动作中做仲裁,或者为每个区域分配独立的中间变量,最后统一映射到输出。

第三个错误是默认转移缺失或指向错误。OR分解的父状态如果没有默认转移,模型无法初始化;如果默认转移指向了错误的状态,系统上电后会进入非预期的初始工况。建议在每次修改OR分解结构后,都重新检查默认转移的指向。

掌握AND/OR分解的选择、并行同步执行的语义、冲突仲裁策略和混合建模方法,是从“能画状态机”走向“能设计可靠并发控制逻辑”的关键一步。在实际工程中,建议先用纸面画出状态层次和并行/互斥关系,再进入Stateflow绘制,可以显著减少返工。