# 创建父状态与子状态
# 引言
在 Stateflow 状态图中,可以通过将状态放置在现有状态的边框内部来创建嵌套的操作模式。该现有状态称为父状态,其包含的状态称为子状态。
父状态内部的内容运作方式类似于一个较小的独立状态图。与状态图类似,父状态包含一个默认转移。当父状态被激活时,连接到该默认转移的子状态也会随之激活。随后,状态图便在各个子状态之间进行转换。当父状态解除激活时,其包含的所有子状态也会同时解除激活。
此示例展示了如何在 Sysblock 中使用父/子状态构建一个可充电电池的控制逻辑:通过定义 Charge 与 Discharge 两个父状态及其子状态(FastCharge、SlowCharge、Full、Powered、Empty),演示状态间的转换、动作与条件设置。
单击右侧打开示例按钮,在 Sysplorer 中打开所需文件。
# 模型搭建
该模型表示可充电电池系统的控制逻辑,双击打开 Battery 子系统块进入电池图表。 Charge 充电与 Discharge 放电状态表示电池系统的运行模式。激活哪个状态由输入数据 isCharging 决定。其输出数据 sentPower 和局部数据 charge 分别表示电池的输出功率和当前电量。

将子状态添加到模型层次结构,目前,电池系统充满时继续充电,空时放电。为了表示完全充电、空充电和中间充电模式,电池系统需要额外的操作模式,如下表。
父模式 子模式 行动 退出条件 Charge FastCharge 激活时,以 4% 的速度增加充能水平 当充电水平大于 80% 时,移动到SlowCharge Charge SlowCharge 激活时,以 1% 的速度增加充电水平 当充能水平等于 100% 时,移动到Full Charge Full 无 无 Discharge Powered 激活时,以 3% 的速度降低充能水平 当电量小于或等于 3% 时,移动到Empty Discharge Empty 激活时,将输出瓦数设置为 0 无 首先添加表示快速充电的状态,在 Charge 充电和 Discharge 放电状态中,删除动作
du:charge := charge + 4;和du:charge := charge - 3;。单击其任意一角并向外拖动,扩展 Charge 充电和 Discharge 放电状态,使其最多可包含三个子状态。
在 Charge 充电状态中,添加一个名为 FastCharge 快速充电的子状态,位于库浏览器.Sysblock.StateMachine(状态机模型库).State(状态)。子状态必须完全包含在父状态内部并且子状态和父状态的边框不能重叠。在 FastCharge 快速充电状态中,输入动作
du:charge := charge + 4;,该动作会将 charge 数据增加 4。
在 Charge 状态内,添加一个名为 SlowCharge 慢速充电的子状态,并输入动作
du:charge := charge + 1;。将鼠标放置 FastCharge 子状态边框,待显示出红色 FastCharge 子状态名称后,单击并长按左键拖拽出信号线连接至 SlowCharge 子状态,双击该信号线将执行条件设置为[charge>80]。

在 Charge 状态内,再添加一个名为 Full 充满的子状态。将鼠标放置 SlowCharge 子状态边框,待显示出红色 SlowCharge 子状态名称后,单击并长按左键拖拽出信号线连接至 Full 子状态,双击该信号线将执行条件设置为
[charge==100]。
在 Discharge 状态中,添加一个名为 Powered 的子状态。在此状态中输入动作
du:charge := charge - 3;,使 charge 电量每次减少 3。
添加另一个名为 Empty 的子状态。在此状态中输入动作
en:sentPower := 0;,将 sentPower 输出功率设置为 0。将鼠标放置 Powered 子状态边框,待显示出红色 Powered 子状态名称后,单击并长按左键拖拽出信号线连接至 Empty 子状态,双击该信号线将执行条件设置为[charge<=3]。
单击键盘上 backspace 返回主系统。
# 仿真设置
在进行仿真之前需要进行仿真设置,在软件上方功能区,单击主页 > 仿真设置按钮,打开仿真设置界面。在该界面设置开始时间 0,终止时间 10,输出区间步长 auto。积分算法的类型设置为定步长,算法为 Euler (Runge-Kutta,1 阶,非刚性),容差 0.0001,初始积分步长 1,单击确定并保存到模型。
# 仿真运行
您可使用上述步骤中搭建的模型进行仿真操作。如未通过上述步骤搭建完整模型,也可单击右侧打开示例按钮,使用提供的模型进行仿真。
双击 ManualSwitch 模块可在 0 和 1 之间切换, 当 ManualSwitch 模块切换到 1 的时候,此时表示充电状态。单击主页 > 仿真,等待仿真运行结束。双击 Scope 模块查看仿真运行结果。可看到再充电状态下放电功率为 0。

当 ManualSwitch 模块切换到 0 的时候,此时表示放电状态。单击仿真,等待仿真运行结束。双击 Scope 模块查看仿真运行结果。可看到在放电状态下放电功率为 3.5,在一段时间后电量耗尽,放电功率变为 0。

提示
目前本设计仍然存在一些问题,例如连接的设备所需功率低于 3.5 瓦,电池的输出并不会随之改变。在本教程的下一步中,您将创建一个流程图,根据连接设备的需求来改变电池系统的功率输出。