Stateflow基础(1)
一、简介及Stateflow的特点
1.简介
Stateflow是有限状态机(Finite State Machine,FSM)的图形实现工具,它可以用于解决事件驱动系统中复杂的逻辑问题。Stateflow 通过开发 FSM 和流程图的设计环境扩展Simulink的功能,在系统中可以用图形化的工具来实现各个状态之间的迁移。
Stateflow 图表采用图形建模的方式构建层次化的、并行工作的状态和它们之间由事件驱动的逻辑迁移关系。Stateflow 在传统状态图的基础上扩展了控制流、MATLAB 函数、图形函数、真值表、临时运算符、直接事件广播,并可以集成用户自编 C 代码,而且通过Stateflow Coder 可以为 Stateflow 状态图模型自动生成C代码。
2.特点
Stateflow的主要特点如下:
(1)提供层次化、可并行的、具有明确执行语义的建模语言元素,并以自然易懂的形式来描述复杂逻辑系统。
(2)使用流程图定义图形化函数,使用 MATLAB 函数进行编程操作,使用真值表完成表格形式的处理。
(3)采用临时逻辑调度状态迁移与事件
(4)支持Mealy和Moore有限状态机。
(5)可集成用户自定义输人输出变量的C代码
(6)支持向量、矩阵、总线信号和定点数据类型。
(7)可进行静态模型检查,包括病态定义的真值表。
(8)可动态检测迁移冲突、死循环、状态不一致、数据范围错误和溢出问题 (9)仿真进行中以动画显示状态图的运行并记录数据,以便于对系统的理解和调试。
(10)集成了一个调试器,采用图形化断点进行单步调试,在调试时浏览其中的数据
二、构造并运行Stateflow图(设计过零比较器)
1.打开 Stateflow 编辑器
Stateflow 编辑器是一个图形环境,用于设计状态转移图、流程图、状态转移表和真值表。
要建立周期性或连续时间 Simulink 算法的条件、基于事件和基于时间的逻辑模型,请使用 [sfnew] 函数创建一个可在 Simulink 模型中作为模块进行仿真的 Stateflow 图。在 MATLAB 命令提示符处,输入:
1
sfnew rectify % 在simulink中创建一个仿真图表
Simulink 创建一个名为
rectify
的模型,其中包含一个空的 Stateflow Chart 模块。要打开 Stateflow 编辑器,请双击图模块。要为 MATLAB 应用程序设计可重用的状态机和时序逻辑,请使用
edit
函数创建可作为 MATLAB 对象执行的独立 Stateflow 图。在 MATLAB 命令提示符处,输入:1
edit rectify.sfx % 创建图表执行作为Matlab对象
如果文件
rectify.sfx
不存在,Stateflow 编辑器将创建名为rectify
的空图。
Stateflow 编辑器的主要组件是图画布、对象选项板和符号窗格。
- 图画布是一个绘图区域,可以在其中通过组合状态、转移和其他图形元素来创建图。
- 在画布的左侧有一个对象选项板,其中显示了一组可向图中添加图形元素的工具。
- 在画布的右侧有一个符号窗格,您可以用它向图添加新的数据、事件和消息并解析任何未定义或未使用的符号。
PS:在构造 Stateflow 图后,您可以将其内容复制到另一个具有不同执行模式的图中。例如,您可以构造在 MATLAB 中执行的图,并将其内容复制到在 Simulink 中进行仿真的图中。
2.添加状态和转移
在对象选项板中,点击状态图标并将指针移至图画布。将出现具有默认转移的状态。要放置该状态,请点击画布上的某个位置。在文本提示中,输入状态名称
On
和状态动作y = x
。添加另一个状态。右键点击并拖动
On
状态。蓝色图形提示可以帮助您水平或垂直对齐状态。新状态的名称变为Off
。双击该状态并将状态动作修改为y = 0
。重新对齐两个状态并在两个状态之间的空白处停留片刻出现蓝色转移提示指示进行连接。
双击每个转移并输入适当的转移条件
x<t0
或x>=t0
。条件出现在方括号内。(选择添加转移表达式)5.结果如下图:
3.解析未定义的符号
在执行图之前,必须定义图中使用的每个符号并指定其作用域(例如,输入数据、输出数据或局部数据)。
(1)打开符号窗格。
(2)在符号窗格中,点击解析未定义的符号
(3)由于阈值 t0
在仿真过程中不会更改,因此将其作用域更改为常量数据。在类型列中,点击 t0
旁边的数据类型图标,然后选择常量数据。
(4)设置阈值 t0
的值。在值列中,点击 t0
旁边的空白输入框,并输入值 0。
(5)保存Stateflow 图。
4.进行仿真
(1)要返回到 Simulink 编辑器,请在画布顶部的浏览器栏中点击 Simulink 模型的名称:rectify。如果浏览器栏不可见,请点击对象选项板顶部的隐藏/显示资源管理器栏图标
。
(2)执行以下操作以将信源添加到模型中:
- 从 Simulink Sources 库中,添加一个 Sine Wave (Simulink) 模块。
- 双击 Sine Wave 模块并将采样时间设置为 0.2。
- 将 Sine Wave 模块的输出连接到 Stateflow 图的输入。
- 将信号标记为
x
。
(3)添加一个示波器。
(4)保存 Simulink 模型。
(5)开始仿真。
可以看到此处小于0的数据被滤除了。