并行执行状态
您可以通过在父图或父状态中启用并行分解,将 Stateflow® 图设置为在同一时间步激活层次结构的某级别中的所有状态。
当使用并行分解的图或状态被激活时,该图或状态的每个直接子级也被激活。这些子状态称为并行状态,在画布上以虚线边框显示。
例如,在下图中,状态 ParentA 和 ParentB 使用并行分解。当每个父状态都被激活时,两个子状态也被激活。

在每个时间步,图按顺序(由每个状态右上角的数字指示)为层次结构的某级别中的每个并行状态执行动作和计算转移。例如,当 ParentB 被激活时,图同时进入 ChildC 和 ChildD。由于 ChildC 的执行顺序为 1,它将 y 设置为 3。然后,在同一时间步,ChildD 将 y 覆盖为 4。
您可以通过右键点击状态,再点击执行顺序,然后选择新顺序来更改执行顺序。
在此示例中,您使用并行状态来完成一个不完整的电池系统模型。该电池系统包含两个独立组件:
可充电主电池
不可充电应急电池,它在主电池电量为空时维持基本功能
打开模型
sfGetStartedParallel 模型表示可充电电池系统的控制逻辑。要构建该模型,请按照教程前述步骤的说明进行操作。

双击 Chart 模块以进入电池图。

图包含两个非并行状态,表示主电池和应急电池。每个电池都包含表示充电、放电或待机工作模式的嵌套子状态。此外,电池使用输入、输出和局部数据:
isCharging:表示电池系统是否连接到电源的输入数据。它确定主电池的激活状态。deviceDemand:表示所连接设备的功率需求的输入数据。maxWatts:表示主电池的最大功率输出的局部数据。sentPower:表示主电池的输出瓦数的局部数据。如果deviceDemand小于maxWatts,则它等于deviceDemand。否则,它等于maxWatts。mainCharge和emergencyCharge:将每个电池电量表示为百分比的局部数据。
有关主电池工作的详细信息,请参阅教程的前述步骤。
启用并行分解
您可以通过右键点击父组件并选择分解 > 并行为子状态启用并行执行。
由于 MainBattery 和 EmergencyBattery 状态没有父状态,图被视为父级。通过右键点击画布的空白部分并选择分解 > 并行来启用图的并行分解。两个图的边框变为虚线,表示它们是并行状态。

广播和接收事件
在 Stateflow® 图中,您可以通过广播事件使组件能够触发图或模型中其他组件的行为。例如,在一个具有两个并行状态的图中,您可以在一个状态中广播事件,以在另一个状态中引发转移。
要从状态或转移广播事件,请使用 send 运算符,格式如下:
send(event_name,receiving_state)
要在转移中接收事件广播,请在转移标签中输入事件的名称。事件不需要方括号或花括号。转移必须为接收状态的直接或间接子级。

电池系统的原始项目要求规定,当主电池电量为空时,应急电池应放电,当主电池开始充电时,应急电池应移至待机状态。通过从主电池广播事件来切换应急电池的工作模式。
1.在状态 MainBattery 中,在子状态 Empty 的 entry 动作中,将名为 toggleOn 的事件广播到状态 EmergencyBattery:
entry: sentPower=0; send(toggleOn,EmergencyBattery);
2.在状态 MainBattery 中,在子状态 Charge 的 entry 动作中,将名为 toggleOff 的事件广播到状态 EmergencyBattery:
entry: sentPower=3.5; send(toggleOff,EmergencyBattery);
3.在状态 EmergencyBattery 中,双击从 Standby 到 Discharge 的转移并输入标签 toggleOn。
4.双击从 Discharge 到 Standby 的转移并输入标签 toggleOff。
5.在符号窗格中,点击解析未定义的符号按钮以将 toggleOn 和 toggleOff 定义为局部事件。在 entry 动作和转移中,toggleOn 和 toggleOff 变为橙色,表示事件。

对模型进行仿真
模型将两个值记录到仿真数据检查器:
MainBattery中Empty状态的活动,其中1表示被激活,而0表示未激活。EmergencyBattery的激活子状态的名称。
对模型进行仿真并观察这些值。
返回到顶层 Simulink 模型。Manual Switch 模块更改主电池的工作模式。当值为
1时,电池充电。当值为0时,电池放电。要对模型进行仿真,请在仿真选项卡中点击运行。Chart 模块显示图的执行。
双击 Manual Switch 模块以对电池放电。在几秒后,当主电池转移到
Empty时,双击 Manual Switch 模块以对电池充电。将此过程重复几次。要停止仿真,请在仿真选项卡中,点击停止。
要打开仿真数据检查器,请在仿真选项卡中,点击数据检查器。
要显示
Empty状态的活动,请在检查选项卡中,点击MainBattery.Discharge.Empty:IsActive。要显示
EmergencyBattery状态的激活子状态,请在检查选项卡中,点击EmergencyBattery:ActiveChild。
当主电池电量为空时,应急电池放电。当主电池离开 Empty 状态并开始充电时,应急电池移至待机状态。
