创建 Stateflow 图
在本教程中,您使用 Stateflow® 图对一个可充电电池系统的逻辑进行建模。
该电池系统有以下需求:
当连接到外部电源时,电池充电。否则,电池放电。
电池容量以总电量的 4% 的速率充电,以 3% 的速率放电。
充电时,电池不输出功率。放电时,电池输出 3.5 瓦的功率。

为了对这些需求进行建模,您构建一个包含两个状态 Charge 和 Discharge 的图,这两个状态表示电池系统的工作模式。
创建图
创建一个包含空 Chart 模块的新 Simulink® 模型。
启动 MATLAB®。在 MATLAB 工具条中的主页选项卡中,点击 Simulink。

在起始页上的 Stateflow 部分中,点击空白图模板。
Simulink 编辑器将打开,显示一个包含 Chart 模块的模型。

双击该 Chart 模块。Stateflow 编辑器将打开。
Stateflow 编辑器具有以下组件:
画布 - 您在其中放置状态和转移的图形环境。画布默认具有奶油色背景。
资源管理器栏 - 位于画布上方的矩形区域,显示打开的图或图形元素的路径。您可以通过点击箭头按钮或模型元素在 Stateflow 编辑器和 Simulink 编辑器之间移动。
选项板 - 位于画布左侧的菜单,可从中向画布添加对象。它包含状态图标
和其他图元素的图标。要显示对象名称,请右键点击选项板并点击显示名称。要隐藏名称,请右键点击选项板并选择隐藏名称。
符号窗格 - 默认位于画布右侧的窗格,您可以在其中创建和管理数据、事件和消息,使图能够与 Simulink 模型的其余部分通信。
要打开或关闭符号窗格,请在建模选项卡中,点击符号窗格。

添加状态
电池系统需要两个状态,一个表示充电,一个表示放电。使用选项板将两个状态添加到画布。
在选项板中,点击状态图标
。要放置状态,请指向画布的空白部分并点击。
当您放置状态时,编辑器会提示您在状态的左上角输入状态名称。输入
Charge。要最终确定状态名称,请点击画布的空白部分。要编辑现有状态名称,请点击状态内的文本。
注意
状态名称不能包含空格或以数字开头。每个状态名称必须唯一。
添加第二个状态并将其命名为
Discharge。
注意
状态边框不能重叠。

连接状态
转移确定图如何以及何时在状态之间移动。
使用默认转移指示第一个激活状态
蓝色圆圈
表示默认转移,它确定仿真开始时哪个状态被激活。
图在您添加到画布的第一个状态上放置默认转移。在此示例中,默认转移连接到 Charge 状态。您可以通过点击默认转移图标
并点击状态的边缘,从选项板添加其他默认转移。
由于需求规定电池必须从充电模式开始,您不需要移动该默认转移。
添加状态之间的转移
状态之间的转移允许图从一个状态移至另一个状态。
要创建第一个转移,请指向
Charge状态的边缘,直到光标变为加号。点击并拖到Discharge状态的边缘。
提示
要移动现有转移,请点击箭尖并拖动。
创建一个从
Discharge到Charge的转移。
对模型进行仿真。在仿真选项卡中,点击运行。
当一个状态被激活时,图会突出显示该状态的边框。当图沿一个转移移动时,它会短暂突出显示该转移。在仿真期间,图在每个时间步都会在
Charge和Discharge状态之间切换。

提示
要更改动画速度,请在调试选项卡中,点击动画速度下拉菜单并选择某个选项。
添加转移标签
要更改转移的行为,您可以添加转移标签。转移标签有三个可选组件:
事件触发器或消息触发器,用于防止图沿转移移动,直到转移收到从图或模型中其他对象广播的事件或消息。
条件,必须满足该条件,图才能沿转移移动。要指定条件,请使用方括号。
动作,它在图沿转移移动时执行。要指定动作,请使用花括号。

当您首次创建一个转移时,编辑器会提示您输入标签。您也可以通过双击转移来添加转移标签。
向状态之间的转移添加条件。
要仅当模型未充电时从
Charge转移到Discharge,请双击转移并输入标签[~isCharging]。要最终确定标签,请点击画布。要移动标签,请点击并拖动标签。

要仅当模型充电时从
Discharge转移到Charge,请输入标签[isCharging]。
添加可执行代码
您可以通过在状态标签中添加状态动作在激活状态中执行代码。状态动作包含关键字,后跟冒号和可执行代码块。
在此示例中,您使用三种类型的状态动作。
| 状态动作 | 行为 |
|---|---|
entry | 状态变为激活时执行。 |
during | 在处于激活状态的每个时间步都执行。不在状态变为激活或变为非激活的时间步执行。 |
exit | 状态变为非激活时执行。 |
添加根据工作模式更改电池输出和充电的状态动作。
在
Charge状态中,通过点击状态名称编辑状态标签。添加新行,然后输入以下文本。您可以通过按 Enter 键添加新行。entry:sentPower=0;during:charge=charge+4;entry动作将名为sentPower的变量设置为0。during动作将名为charge的变量递增4。提示
要手动调整状态大小,请点击并拖动任一角。要自动重新格式化画布上的每个对象,请通过点击画布的空白部分来取消选中任何对象。然后,按 Ctrl+Shift+A。

在
Discharge状态中,添加将sentPower设置为3.5的entry动作和将charge递减3的during动作。
定义图数据并与 Simulink 模型共享
当您在转移或状态中使用一个变量时,您必须将该变量定义为输入数据、输出数据或局部数据。在符号窗格中,警告标志
表示未定义的数据。
| 图标 | 类型 | 行为 |
|---|---|---|
![]() | 输入数据 | 在仿真期间,此数据接收输入信号的值。 定义输入数据会向 Simulink 中的 Chart 模块添加输入端口。您无法手动为输入数据赋值。 |
![]() | 输出数据 | 在仿真期间,图将此数据的值输出到 Simulink。 定义输出数据会向 Simulink 中的 Chart 模块添加输出端口。 |
![]() | 局部数据 | 在仿真期间,此数据存储仅可在图中访问的信息。 |
图根据上下文推断每个数据的类型。例如,图推断 isCharging 是输入数据,sentPower 是输出数据,charge 是局部数据。

定义图数据的类型和值。
要接受推断的数据类型,请在符号窗格中,点击“解析未定义的符号”按钮
。未定义数据旁边的警告标志消失。设置电池的初始电量。在符号窗格中,在
charge行中,点击值列并输入50。
注意
在仿真期间,具有未定义值的数据默认为
0。要返回到 Simulink 模型的顶层,请在资源管理器栏中,点击“向上到父级”按钮
。Chart 模块有输入端口和输出端口。要查看端口名称,请通过点击一个角并向外拖动来展开 Chart 模块。

将 Simulink 模块连接到图
要完成模型,请将信源模块和信宿模块连接到 Chart 模块的输入端口和输出端口。
要表示与外部电源连接或断开连接的电池系统,请向 Simulink 画布添加 Manual Switch 模块。将输出连接到 Chart 模块的输入。
添加值为
1的 Constant 模块。将输出连接到 Manual Switch 模块的第一个输入端口。添加值为
0的 Constant 模块。将输出连接到 Manual Switch 模块的第二个输入端口。添加 Scope 模块。将 Chart 模块的输出端口连接到 Scope 模块的输入端口。
将 Chart 模块命名为
Battery。
对模型进行仿真
对完成的模型进行仿真。
在仿真选项卡中,将停止时间设置为
Inf。双击以进入 Chart 模块。
要对模型进行仿真,请在建模选项卡中,点击运行。观察
Charge状态周围的蓝色突出显示。返回到 Simulink 编辑器。
要切换 Manual Switch 模块,请双击该模块。
打开 Stateflow 编辑器。观察
Discharge状态周围的蓝色突出显示。要结束仿真,请在建模选项卡中,点击停止。
将 Manual Switch 切换到
1。
在教程的下一步,您将使用激活状态输出、记录和断点来验证和调试电池模型。


