Stateflow 提供了一种图形语言,包括状态转移图、流程图、状态转移表和真值表。您可以使用 Stateflow 来说明 MATLAB 算法和 Simulink 模型如何响应输入信号、事件和基于时间的条件。
Stateflow 使您能够设计和开发监控、任务调度、故障管理、通信协议、用户界面和混合系统。
使用 Stateflow,您可以对组合和时序决策逻辑进行建模,使其可作为 Simulink 模型中的模块进行仿真,或作为 MATLAB 中的对象来执行。图形动画使您能够在执行逻辑时对其进行分析和调试。编辑时和运行时检查可确保在实现前具有设计一致性和完整性。
Stateflow快速入门系列(-):构造并运行 Stateflow 图
Stateflow 图是有限状态机的图形表示,由状态、转移和数据组成。您可以创建 Stateflow 图来定义 MATLAB 算法或 Simulink 模型如何响应外部输入信号、事件和基于时间的条件。
例如,下面的 Stateflow 图展示半波整流器的基础逻辑。该图包含两个标签为 On 和 Off 的状态。在 On 状态下,图输出信号 y 等于输入 x。在 Off 状态下,输出信号设置为零。当输入信号跨越某个阈值 t0 时,图在这些状态之间转移。各个状态下的动作在仿真的每一时间步都会更新 y 的值。

此示例说明如何创建这样的 Stateflow 图,以在 Simulink 中进行仿真和在 MATLAB 中执行。
构造 Stateflow 图
打开 Stateflow 编辑器,Stateflow 编辑器是一个图形环境,用于设计状态转移图、流程图、状态转移表和真值表。在打开 Stateflow 编辑器之前,需要先确定最能满足您需求的图执行模式。
sfnew rectify
Simulink 创建一个名为 rectify 的模型,其中包含一个空的 Stateflow Chart 模块。要打开 Stateflow 编辑器,请双击图模块。
edit rectify.sfx
如果文件 rectify.sfx 不存在,Stateflow 编辑器将创建名为 rectify 的空图。
Stateflow 编辑器的主要组件是图画布、对象选项板和符号窗格。

提示
在构造 Stateflow 图后,您可以将其内容复制到另一个具有不同执行模式的图中。例如,您可以构造在 MATLAB 中执行的图,并将其内容复制到在 Simulink 中进行仿真的图中。
添加状态和转移
(1)在对象选项板中,点击状态图标
并将指针移至图画布。将出现具有默认转移的状态。要放置该状态,请点击画布上的某个位置。在文本提示中,输入状态名称 On 和状态动作 y = x。

(2)添加另一个状态。右键点击并拖动 On 状态。蓝色图形提示可以帮助您水平或垂直对齐状态。新状态的名称变为 Off。双击该状态并将状态动作修改为 y = 0。

(3)重新对齐两个状态并在两个状态之间的空白处停留片刻。蓝色转移提示指示您可以连接状态的几种方式。要添加转移,请点击适当的提示。
或者,要绘制转移,请点击并从一个状态的边拖动到另一个状态的边。

(4)双击每个转移并输入适当的转移条件 x

(5)清理图:
解析未定义的符号
在执行图之前,必须定义图中使用的每个符号并指定其作用域(例如,输入数据、输出数据或局部数据)。在符号窗格中,未定义的符号用红色错误标记
进行标记。类型列根据每个未定义符号在图中的使用情况显示其建议作用域。
(1)打开符号窗格。
(2)在符号窗格中,点击解析未定义的符号
。

(3)由于阈值 t0 在仿真过程中不会更改,因此将其作用域更改为常量数据。在类型列中,点击 t0 旁边的数据类型图标,然后选择
“常量数据”。
(4)设置阈值 t0 的值。在值列中,点击 t0 旁边的空白输入框,并输入值 0。
(5)保存您的 Stateflow 图。
您的图现在即可在 Simulink 中进行仿真,或者在 MATLAB 中执行。
将图作为 Simulink 模块进行仿真
要在 Simulink 模型中对图进行仿真,请通过输入和输出端口将图模块连接到模型中的其他模块。
(1)要返回到 Simulink 编辑器,请在画布顶部的浏览器栏中点击 Simulink 模型的名称:
“rectify”。如果浏览器栏不可见,请点击对象选项板顶部的隐藏/显示资源管理器栏图标
。
(2)执行以下操作以将信源添加到模型中:
(3)向模型中添加一个信宿:
(4)保存 Simulink 模型。

(5)要仿真模型,请点击运行
。在仿真过程中,Stateflow 编辑器通过图动画突出显示激活状态和转移。
(6)对模型进行仿真后,双击 Scope 模块。示波器显示 Stateflow 图的输入信号和输出信号图。

仿真结果显示整流器滤除了负输入值。
将图作为 MATLAB 对象执行
要在 MATLAB 命令行窗口中执行图,请创建一个图对象,并调用其 step 函数。
(1)通过使用包含图定义作为函数的 sfx 文件的名称,创建一个图对象 r。将图数据 x 的初始值指定为名称-值对组。
r = rectify(x=0);
(2)初始化图执行的输入和输出数据。向量 X 包含来自正弦波的输入值。向量 Y 是一个空的累加器。
T = 0:0.2:10;
X = sin(T);
Y = [];
(3)通过多次调用 step 函数来执行图对象。将来自向量 X 的单个值作为图数据 x 传递。在向量 Y 中收集 y 的结果值。在执行过程中,Stateflow 编辑器通过图动画突出显示激活状态和转移。
for i = 1:51
step(r,x=X(i));
Y(i) = r.y;
end
(4)从 MATLAB 工作区中删除图对象 r。
delete(r)
(5)检查图执行的结果。例如,您可以调用 stairs 函数来创建一个阶梯图,用于比较 X 和 Y 的值。
ax1 = subplot(2,1,1);
stairs(ax1,T,X,color="#0072BD")
title(ax1,"x")
ax2 = subplot(2,1,2);
stairs(ax2,T,Y,color="#D95319")
title(ax2,"y")

执行结果显示整流器滤除了负输入值。