Stateflow系统建模技术2010年7月5日内容提要•Stateflow入门介绍及基本概念•创建状态图•状态转移•流程图建模•状态图的层次•并行机制Stateflow入门介绍•Stateflow是一个交互式设计工具,用来对复杂的事件驱动模型系统进行建模与仿真。通过紧密地与Simulink和MATLAB集成,Stateflow将复杂的控制和监督逻辑有效地结合到Simulink模型中,为Simulink用户提供了一个设计嵌入式系统的完美解决方案。Stateflow入门介绍Stateflow能够做:•基于有限状态机理论对复杂的响应型系统进行可视化建模与仿真•设计和开发复杂的监控逻辑•在同一个Stateflow框图中同时使用流程图和状态转移图表示法•自动地从模型中生成整数或浮点数代码•可随时方便修改设计,评估结果,验证系统性能stateflow基本概念动作数据对象连接节点缺省转移状态转移事件条件有限元状态机实例:DVD播放机8缺省转移1状态2转移3事件4条件5动作7连接节点6Counter数据对象一个状态机(也可以包含多个Chart)内容提要•Stateflow入门介绍及基本概念•创建状态图•状态转移•流程图建模•状态图的层次•并行机制创建状态图—插入图块Chart•在MATLAB命令窗口输入sfnew•直接从stateflow库中拖Chart块到模型中拖创建状态图—几个术语•每个Chart被称作一个stateflow图块,每个图块都有对应的stateflow框图,模型中所有的图块的集合叫做stateflow状态机,且一个模型中只有一个状态机图块框图双击图块包含的内容创建状态图—编辑器•可以用编辑器开发stateflow框图•仿真过程中可以用编辑器来显示状态图的执行过程创建状态图—编辑器•将框图锁定的方法:File→ChartProperties→Locked选项创建状态图—插入状态和节点•先左键单击选中对象按钮,然后在编辑区左键单击放下对象•要插入一个对象的多个拷贝,双击对象按钮,然后再编辑区左键单击添加,右键单击停止添加•要删除某个对象,选中后按Delete键删除创建状态图—框图的缩放•缩放范围20%至500%•左键单击zoom按钮上部放大,下部缩小•左键单击两个zoom按钮的中间调用下拉菜单来选择缩放的比例•移动鼠标到两个zoom按钮的中间空白处,左键保持在该处直到出现双箭头,向上向下拖拉进行缩放2个zoom按钮创建状态图—改变状态尺寸•左键保持状态的一个圆角拖拉即可,当移动鼠标到状态的圆角时,会出现一个双箭头,这是就可以左键保持这个圆角,然后拖拉直到满意的尺寸大小创建状态图—改变节点尺寸•右键单击节点,弹出一个快捷菜单,然后选择JunctionSize选项选择需要的大小尺寸创建状态图—移动和复制对象•左键保持并且拖拉对象,移动一个状态或节点•右键保持拖动对象,拷贝一个对象•如果想移动或拷贝一组对象,首先要框选所感兴趣的对象,然后按上面的方法操作•注:单击时必须点到对象的边缘里面创建状态图—状态的标签•每个状态都必须要有一个名字。标签一个状态时,左键单击问号,在光标处输入文本。注意鼠标点接近问号时它所发生的变化。状态名要以字符串开始,中间不能有空格,但可以写成多行。编辑状态标签时,左键单击标签进入文本编辑模式。创建状态图—创建转移•从源对象的边缘左键保持并且拖拉到目标对象边缘。转移只能开始或终止于状态的直线的边缘(不能是状态的圆角)。当鼠标点接近状态的直线边缘时光标变为十字花。•默认情况下,转移的精确行为是有效的,要想使他无效,可以在转移上右键单击,在快捷菜单上清掉Smart选项。创建状态图—创建缺省转移•左键单击图形编辑器左边的一列工具条上的第三个按钮,然后左键单击缺省状态的直线边缘。如果转移从状态或节点的边缘分离出来,它就会变成缺省转移。创建状态图—转移的变更•从一个状态的边缘到另一个状态的边缘,可以改变转移的任何一个末端(带箭头或不带箭头的):左键保持在想改变的转移的末端,然后拖拉它离开原来的边缘到达想要的目标的边缘时释放转移的末端,重新连接转移•要想改变转移的线路而不影响它的两端的连接时,左键保持在转移的两个末端之间的线上,拖拉即可改变创建状态图—转移标签及移动•给转移加标签:左键单击转移选中它,左键单击出现的问号,在光标处插入文本。左键单击文本进入文本编辑模式进行编辑转移的标签•移动转移标签:左键保持在标签位置,拖拉到想安放的位置,可以把转移标签移到框图内的任何位置创建状态图——添加注释•在框图中指定位置添加注释:右键单击框图中要加注释的位置,弹出快捷菜单选择快捷菜单中的AddNote选项在光标处插入文本•左键单击文本进入到编辑模式编辑文本注释创建状态图—定制对象属性•右键单击某一对象,弹出快捷菜单,选择Properties选项,就会出现关于这个对象的属性对话框。•不同对象,属性对话框有所差异转移属性对话框状态属性对话框创建状态图—设置字体大小•设置状态和转移的标签及注释信息的字体大小:左键单击选中对象选取Edit菜单下的SetFontSize选项选择合适的字体•也可以通过对象的快捷菜单进行设置:右键单击对象弹快捷菜单选取FontSize选项选择合适的尺寸创建状态图—设置箭头尺寸•修改转移箭头尺寸的方法:右键单击转移弹出快捷菜单,从ArrowheadSize子菜单中选取合适的尺寸。从状态的快捷菜单下对该选项进行设置,所有指向该状态的边缘的箭头尺寸都将改变创建状态图—图形显示配置•可以配置一个框图的图形风格。包括定制状态、转移、节点、标签和背景的颜色,状态和转移标签的字体。通过选取Edit菜单下的Style选项打开图形风格对话框来进行编辑。•对话框中:左键单击对象或标签,设置颜色右键单击标签,设置字体内容提要•Stateflow入门介绍及基本概念•创建状态图•状态转移•流程图建模•状态图的层次•并行机制状态转移—概念•Stateflow状态图被称为“状态转移图”,这些状态图中包含了所谓的状态、状态转移管理和维护当前内存中活动的状态•一旦包含了状态转移的状态图处于活动的状态,则状态图将一直处于这种活动状态,直到整个模型仿真计算结束。•当在某一个制定的时间步长内完成了必要的工作后,状态图简单地进入到一种暂时挂起的状态,而不是非活动状态。也就是说,在连续两次触发事件之间,状态图是一直处于活动状态的。状态转移—概念(续)•具有状态转移的Stateflow状态图相当于一种包含了离散系统模块的触发子系统。这种子系统在内存中保持自己的状态,在有触发时更新自己的输出,而在两个连续的触发之间保持自己的状态。状态转移—概念(续)•当一个状态转移图处于活动状态时,这个状态转移图首先尝试激活相应的状态,以及邻近的状态。如果,状态机处于第一层,则执行的第一个元素是系统的默认转移。由于状态机在模型运行结束之前一直处于活动状态,默认转移仅仅有效一次,即在状态机被激活的首次有效,这一点必须注意。如果状态的第一层仅有一个状态,则可以不使用默认的转移。一旦进入一个状态,这个状态就一直处于活动状态,直到退出为止。与状态机类似,状态也在连续两次触发之间挂起而不会成为不活动状态。状态转移—事件驱动•所谓事件是指触发的发生。一个触发可以是隐含存在的,按照预先的配置自动的发生。同样,触发也可以显性的定义,在一个具有过零特性的信号发生,或者被函数调用时,触发发生,也就是发出了事件。由于这种触发而引起的相应的动作执行,被称之为事件驱动•在Stateflow中,所有的状态图的运行都是依靠事件驱动。换句话说,状态图是依赖于事件而活动的。事件同样驱动状态的变化。•每次触发一次,状态图就重新进行判断一次。状态转移—过零触发•过零触发事件具有三种形式:1上升沿触发:当过零信号由负值变为正值,或者由负值变为0,或者由0变为正2下降沿触发:当过零信号由正值变为负值,或者由正值变为0,或者由0变为负值3双边沿触发:上述两种触发机制的结合下降沿上升沿状态转移—产生事件•利用下列的模块可以在Simulink中产生相应的过零信号:震荡函数脉冲发生器阶跃信号(每个阶跃信号仅能产生一个事件)双端输入开关静态模块状态转移—输入事件定义事件类型状态转移—定义多个输入事件状态转移—默认转移注意事项•当其父状态被激活的时候,默认转移仅仅执行一次。那么当父状态再次从非活动状态进入到活动状态,默认转移将再次执行•当默认转移在状态图的第一层的时候,需要小心。如果第一次触发事件发生时默认转移无效,系统将发出一个二义性警告,这个警告错误一般在父状态被激活,而父状态下的子状态不能确认具体哪一个被激活时发出。这时候,状态图被激活了,但是没有一个确定的状态被激活。•注:如果在Stateflow调试器中从错误检测选项字段中去除StateInconsistency,则上述的二义性错误警告不会发出。状态转移—默认转移注意事项(续)•一定要牢记一点,一旦Stateflow状态图被激活,则状态图会一直处于激活状态直到系统仿真的结束。由于默认转移的执行需要依赖父状态的再次激活,则这里的默认转移将不再有机会执行了。•若需要通过事件来控制状态的执行,则可以建立一个哑元状态,或者将状态图置于使能子系统中,将相应的触发事件设置为Reset•例子:exp01_1和exp01_2状态转移—使用数据对象•数据对象主要是用在条件和动作语句中。可以根据需要在Stateflow图表中限制数据对象的使用,也可以使用数据对象作为chart和外部环境的接口,这里所说的外部环境即Simulink模型中的其他模块。用在条件中用在动作中状态转移—定义数据对象添加数据数据名称数据对象范围数据类型状态转移—活动状态输出•可以将状态的活动状态作为Stateflow块的输出,在状态属性对话框中选中OutputStateActivity选项,stateflow块就创建了一个数据对象输出到模型,而数据对象名称和状态的名称一致,数值只能是1或0•例子exp02状态转移—浏览器•使用浏览器可以观察所定义的数据和事件•运行浏览器:使用Tool菜单下的Explorer命令•浏览器左边列显示了状态机包含的所有层次结构事件数据层次结构状态转移—浏览器(续)•在浏览器中可以定义事件和数据对象属性•用鼠标右键拖放事件或数据对象,可以完成复制操作•浏览器中的Add菜单可以对在层次树中选择的stateflow图表完成添加/定义数据和事件对象的操作状态转移—使用条件•条件表达式包括:使用布尔运算符比较两个数据对象以布尔变量作为返回值的函数•条件表达式不能通过调用函数而更改数据对象或影响改变图表中的状态•赋值表达式不能作为条件表达式•使用“与”操作符“&&”完成条件表达式的与操作•使用“或”操作符“||”完成条件表达式的或操作状态转移—转移动作•转移动作标签主要由四个部分组成•在转移动作标签中不一定需要包含所有的上述部分,但是必须按照图中所示的顺序书写转移动作标签。•条件动作和转移动作运行有所区别,条件动作在条件满足的时候就运行了,而转移动作需要在整个转移通路有效时才运行。见例子exp03事件条件条件动作转移动作状态转移—状态动作•在下列情况时,发生状态动作:初始为非活动状态,事件驱动使其激活—entry动作初始为活动状态,事件驱动使其进入非活动状态—exit动作初始为活动状态,事件没有改变其活动的状态—during动作或on动作•状态动作一般作为状态名称标签的一部分,可以紧跟在标签名称后面•可以使用一些关键字来标识动作的作用类型状态转移—状态动作(续)•有四种类型状态动作:entry/en在事件触发状态进入活动状态时执行exit/ex在事件触发状态退出活动状态时执行during/du在事件触发发生,状态保持原来活动状态时执行onevent_name当以event_name命名的事件发生时,状态保持原有的活动状态而执行相应的动作•系统默认的状态动作为entry状态转移—动作执行顺序•在有事件驱动且条件满足的时候