stateflow教程Stateflow概述:Stateflow是集成于Simulink中的图形化设计与开发工具,主要用于针对控制系统中的复杂控制逻辑进行建模与仿真,Stateflow适用于针对事件响应系统(ReactiveSystem)进行建模和仿真。与事件响应系统相对应的就是动态变换系统(DynamicTransformationalSystem)。动态变换系统通常可以利用数学表达式、方程等组成的输入/输出关系进行描述,像这样的系统利用Simulink进行建模是最为方便的。而事件响应系统通常利用一些自然语言或者逻辑表达式进行描述,这样的系统就需要利用Stateflow来进行建模。Stateflow与Simulink结合起来,可以创建确定性监管控制系统。利用Stateflow可视化的模型和直观的仿真能力,可以清晰、简洁地反映出复杂动态逻辑关系。Stateflow的基础是有限状态机理论,它通过对状态图、流程图的创建,对事件驱动系统进行建模和仿真。第一章创建状态图Stateflow编辑器创建和编辑状态图Stateflow编辑器创建Simulink模型1.直接在MATLAB命令行窗体中键入指令sfnew2.打开Simulink库浏览器,在库浏览器中找到Stateflow的模块库双击模型文件或者库文件中的Stateflow图块打开Stateflow编辑器执行Stateflow编辑器File菜单下的ChartProperties命令,打开属性框创建和编辑状态图插入图形对象1.创建状态在图形对象面板的状态图标上按下鼠标左键并保持,将状态Stateflow编辑器的空白区域中Keyword:StateActions就是状态动作。为数据对象进行赋值或者进行数据对象的运算也可以通过状态动作进行事件广播以触发其他系统的变化状态动作的关键字主要有三种:entry:当状态被激活时执行相应的动作。exit:当状态退出活动状态时执行相应的动作during:当状态保持其活动状态时执行相应的动作在状态上单击鼠标右键,在快捷菜单中选择Properties命令,可以通过状态的属性对话框进一步定义状态2.创建连接节点连接节点作为转移通路的判决点或汇合点,也是在状态图中常用的图形元素之一,特别是在流程图中,由于流程图不能包含任何状态,因此只有依靠连接节点完成通路的连接和判断分支,连接节点不是记忆元件。在图形对象面板的连接节点图标上按下鼠标左键并保持,将状态拖放到Stateflow编辑器的空白区域中。节点上单击鼠标右键,通过弹出的快捷菜单执行Properties命令,进入属性框3.创建转移转移是Stateflow框图中最常见的图形元素之一,无论是包含状态的状态图中还是没有状态的流程图中,几乎都存在转移。转移描述的是有限状态系统内的逻辑流。转移管理了当系统从当前状态改变时,这个系统可能发生的模式改变。当转移发生时,源状态变为非活动的状态,目标状态变为活动的状态。转移是带有箭头的线,这就使整个状态图或者流程图成为了“有向图”,状态或者流程之间的转换,将直接受到转移方向的约束。创建转移的具体步骤是:(1)当鼠标光标接近状态的边缘时,鼠标光标将变成十字形状。(2)按下鼠标左键并保持,将引出的转移线拖放到目标状态的边缘即可,给转移添加标签的方法:(1)左键单击选中相应的转移,此时转移将显示问号;(2)左键单击出现的问号,则进入文本编辑状态;(3)在光标处插入文本;(4)单击Stateflow编辑器中任意一处,结束标签的插入。组成转移标签的四个部分不一定完整地出现,但是不论出现哪几个部分,标签的内容必须按照上面指定的顺序书写。条件动作与转移动作两者之间的区别:条件动作在条件满足的情况下就能够执行,而转移动作需要在整个转移通路都有效的情况下,在执行转移的时候才执行。Stateflow中都可以使用三类语法元素作为动作:(1)数学运算表达式或者逻辑运算表达式。(2)调用函数。(3)事件广播。4.默认转移:默认转移是一类特殊的转移,可以把它看做是状态转移的特例。默认转移确定当有限状态机或者父层次状态处于活动状态的时候,在其所有的子状态中第一个被激活的状态。根据有限状态机的要求,当有限状态系统被激活时,必有相应的确定的某个状态被激活。而默认转移就定义了当状态机被激活或者层次模型中父层次状态被激活时,具体哪个子状态被激活。创建默认转移的方法如下:鼠标单击图形对象面板中的默认转移图标,然后将默认的转移(注意鼠标光标的变化)放置在状态或者连接节点的边缘,就可以完成默认转移的创建了说明:Stateflow的状态图中,同一层次上的状态只有两种工作模式,一种叫做异或(OR)模式,另一种叫做并行(AND)模式。在异或模式下,同一层次上的子状态必须有一个子状态具有默认的转移,同时该子状态被称为默认状态。由于Stateflow是一种事件驱动模型建模环境,不允许出现模型运行的二义性,因此,正确的使用默认转移就非常重要,因为默认转移就是用来改变状态机或者父层次状态被激活时,相应的子状态二义性的图形元素在默认转移上添加标签的方法和在一般的转移上添加标签的方法是一样的,可以在默认转移的标签上加上事件和条件来进行限制,也可以将动作和默认转移相关联。不过,一个有限状态系统必须确保能够正确地被激活,这一点在使用默认转移时非常重要,因为状态机的默认转移只有一次执行的机会。如果没有明确的子状态能够被激活,系统会报告二义性错误5.添加注释:如果需要在Stateflow的框图中使用LaTex字符集,则需要按照下列步骤完成:(1)在已经添加的文本上单击鼠标右键,这时将显示快捷菜单;(2)选择快捷菜单中TextFormat子菜单中的LaTexInstructions复选项;(3)用鼠标单击已经添加的文本注释,重新进入文本编辑模式;(4)添加LaTex字符,例如键入y={\itAe}^{\alphax}sin(\beta\itt);(5)在文本编辑区外单击鼠标完成注释的添加,此时的注释内容将变为y=Aeaxsin(bt),如图所示。编辑图形对象外观:改变尺寸和位置单击右键单击右键在注释上单击鼠标右键而出现的快捷菜单。在菜单中,共计有三个子菜单可以用来修改注释文本的外观,分别为:FontSize:设置注释文本的尺寸。TextFormat:设置注释文本的基本格式,包括粗体、斜体和LaTex字符支持。TextAlignment:设置注释文本的对齐方式,包括左对齐、居中和右对齐。第二章状态图的仿真状态图的基本概念事件数据对象状态图的更新模式stateflow模型查看器状态图的基本概念状态图管理和维护着当前模型中活动的状态。一旦包含了状态转移的状态图处于活动的状态,则状态图将一直处于这种活动状态,直到整个模型仿真计算结束。并且,只要状态图处于活动状态,则必定至少有一个状态处于激活状态。状态图从非活动状态到活动状态以及状态之间的切换,都要由事件触发,即在事件的驱动之下,状态图才能仿真运行。所谓Stateflow的事件触发,就是事件驱动的发生。触发可以由系统隐含发生,也可以按照要求显性地定义。在Simulink中,显性定义的事件就是某些过零信号的发生,也就是说,只有过零信号才能够触发状态转移的发生或者状态机的激活。由这种触发而引起的相应的动作执行,被称为事件驱动。事件:添加事件:执行Stateflow图形编辑器Add菜单下Event子菜单中的任何一个命令,例如执行Local命令,则Stateflow将弹出如图所示的对话框。Scope属性:该属性定义事件的作用类型。在Add菜单下的Event子菜单中具有三个菜单命令,分别为Local、InputfromSimulink和OutputtoSimulink,通过这三个菜单命令定义事件,得到的Scope属性不一致。具有Local属性的事件是在状态图内部发挥作用。具有InputfromSimulink属性的事件是从Simulink框图输入到Stateflow中的,也就是Stateflow框图的外部触发事件。具有OutputtoSimulink属性的事件是从Stateflow框图输出到Simulink中的,即利用Stateflow定义的事件驱动或者触发其他Stateflow框图或者子系统动作。如果用户设置事件的Scope属性为InputfromSimulink或者OutputtoSimulink,则添加事件的对话框会发生变化,Trigger属性:Trigger属性总共有四个可能值,分别为Either、Falling、Rising和FunctionCall。在Simulink条件执行子系统中,特别是在使能或者触发子系统中,触发子系统工作的触发源就具有不同属性。触发子系统的触发源与这里的Trigger属性的意义完全一样,分别为双边沿触发、下降沿触发、上升沿触发。FunctionCall(函数调用)是一类比较特殊的触发属性创建事件实例:运行过程中,单击ManualSwitch模块向Stateflow框图发出事件使用多个输入事件:同一个Stateflow的图块可以使用多个输入事件。但是,不论用户为Stateflow的图块定义了多少个输入事件,每个Stateflow的图块都只能具有一个事件输入端口。因此,在向Stateflow的图块增加不止一个输入事件时,需要将不同的事件通过Mux块组合成为输入事件向量,然后将组合后的输入事件向量连接到Stateflow图块上。数据对象:Stateflow使用数据对象来管理维护Stateflow框图内部的数据信息。在Stateflow中,数据对象主要用于动作或者条件中。用户既可以限制数据对象在相应的图形对象内部使用,也可以将数据对象作为Stateflow与Simulink模型之间的接口来使用。执行Stateflow图形编辑器的Add菜单中Data子菜单下的任何一个命令,例如Local,则Stateflow会打开如图所示的对话框。Scope属性:Local、Input、Output与事件相同Constant:所定义的数据对象在Stateflow模型中为常量即保持静态,数据对象在Simulink/Stateflow模型运行过程中其数值一般不发生变化,并且数据在模型中为只读,不可写的状态。Parameter:所定义的数据对象将通过Stateflow框图的上层Simulink子系统封装之后的参数获取初值。也就是说当Stateflow的框图位于某个封装子系统内部时,Stateflow的Parameter类型数据对象可以直接获取封装子系统设定的参数。具有Parameter属性的数据对象与具有Constant属性的数据对象类似,在整个仿真过程中,Stateflow不能修改其数值。DataStoreMemory:所定义的数据对象与Simulink数据空间共享,也就是说,该数据对象与Simulink工作空间中的某个数据对象相互绑定。此时该数据对象的名称必须与Simulink工作空间中数据对象的名称一致。数据类型模式(DataTypeMode)Inherited类型的数据对象一般为Stateflow的输入或者输出数据对象,它能够通过与Simulink模块相连接的信号线来判断具体的数据类型对象。Built-in类型是Stateflow数据对象默认的数据类型,通常情况下,都使用Simulink内建的数据类型作为数据对象的数据类型。Expression类型是指可以通过一个表达式来表示数据类型Fixedpoint类型用于模型的定点数据设置,若选择了该类型,则可以完成Stateflow模型数据的量化处理。状态图的更新模式不是所有的有限状态系统都具有外部事件的定义,有些模型就没有针对Stateflow模型定义任何输入事件,可是Stateflow的模型依然能够正常地运行。那么对于这种没有定义任何输入事件的系统,它是如何运行的呢?这就是状态图的更新模式所发挥的作用。Stateflow的框图有三种更新模式,分别为Inherited、Discrete和Conti