在Stateflow模型中,将包含有状态的Stateflow框图称为状态图,而将不包含任何状态的Stateflow框图称为流程图,状态图是Stateflow最常用的一种形式。
1.Stateflow对象的分类
Stateflow的对象分为图形对象和非图形对象。其中,图形对象包括前面介绍的可以通过Stateflow图形工具面板添加的内容以及状态和转移。非图形对象,如事件、数据对象等。
创建Stateflow框图时,首先需要向框图中插入必要的图形对象,陆续记录创建状态、转移、节点和默认转移的方法。

状态是系统模式的描述,在 Stateflow中,将每一种操作模式表示为一种状态,状态有两种行为,激活(active)和非激活(inactive)。图表的状态为激活或非激活是基于事件和条件动态改变的,事件的发生使状态激活或非激活,从而驱动Stateflow图表的执行。一旦状态被激活,则这个状态一直处于激活状态,直到退出为止,状态在连续两次触发之间挂起而不会成为非活动状态。
2.创建状态
状态是Stateflow状态图中最重要的元素之一,在有限状态机里,状态描述的是系统的一种模式。例如,房间里的电灯只有两种工作模式,一种是点亮(On),另一种就是熄灭(Off)。如果使用Stateflow状态图来描述电灯的工作模式,则需要使用两个状态。
状态具有布尔行为,可以把状态看做高级编程语言中的布尔类型变量,任何给定的时刻,状态要么是活动要么是非活动的,不可能出现第三种情况。
状态在系统中被看做记忆元件,它本身能够保持系统的当前模式,一旦被激活,状态就保持活动的模式,直到系统改变其模式,状态才变为非活动的。同理,如果状态是非活动的,则状态就会一直保持非活动的状态,直到系统改变其工作模式为止。
和Simulink的模型类似,Stateflow的框图也可以具有层次,在同一层次里,所有的状态要么是互斥(OR)的,要么是并行(AND)的。所谓状态之间是互斥的,是指任何给定的时刻只有一个状态是活动的,不可能同时出现两个状态同时活动;所谓状态之间是并行的,是指在同一时刻该层次的所有状态都是活动的。在同一级里面不可能有既是互斥的又是并行的状态存在,即状态要么是互斥的要么是并行的。
Stateflow图表可以具有层次,即允许有子状态,同样的就会有超状态,这种层次关系可在Model Explorer中查看。只有子状态的上层即父状态(超状态)被激活后,下层的子状态才有可能被激活。如果某一状态既非超状态亦非子状态,则它的父状态就是Stateflow状态图本身。而在同一层次里,所有的状态之间的关系只有两种,互斥(OR)或并行(AND)。
(1)互斥状态
互斥状态(OR)即两种状态不能同时被激活,也不能同时执行,用实线框表示。如图所示的状态图,状态A与状态B是互斥的,它们只能有一个处于激活状态。

(2)并行状态
并行状态(AND)即状态的执行是独立的,同级的两个或多个并行的状态可以同时被激活,用虚线框表示。如图所示的状态图,当状态A被激活时,其子状态A1与A2可以同时处于激活状态。
当状态为并行时,它们并不是同时被激活,而是按一定的顺序激活并执行的。在创建并行状态时,并行的状态右上角有数字编号,这个数字编号就是状态的激活顺序。根据状态在图形编辑器中的位置来进行编号,基本原则是:位置较高的状态具有较高的执行次序编号;同一水平位置时,左边的状态具有较高的执行次序编号。用户也可以自己修改执行次序编号。
如图所示,添加两个状态:

添加的状态的左上角通过“?”来表示目前状态还没有具体的定义,状态需要具体的命名,这样才能在执行状态机的时候具有唯一的布尔行为。为状态命名添加状态标签的方法如下:
单击问号,在光标处插入文本,如图所示。要结束标签的创建只需要在Stateflow编辑器内部任意单击鼠标即可。注意当鼠标光标接近状态的问号时它所发送的变化。如果需要编辑状态的标签,则用左键单击标签可以再次进入文本编辑模式,直接修改标签文本即可。
状态名要以字符开始,后续可以使用字符、数字、下划线命名状态。状态名中间不能由空格,但是可以写成多行。


状态的标签一般可以由三部分组成:状态名称、注释和相应的状态动作。

状态动作的关键字主要有三种,分别为:
entry:当状态被激活时执行相应的动作。(可省略成en)
exit:当状态退出活动状态时执行相应的动作。(可省略成ex)
during:当状态保持器活动状态时执行相应的动作。
on Event:处于活动状态,有驱动事件发生—关键字为On Event。
bind:处于活动状态或其子状态处于活动状态—关键字为bind。
而动作一般可以为数据对象进行赋值或者进行数据对象的运算,也可以通过状态动作进行事件广播以触发其他系统的变化。
例如在进入Off状态执行相应的动作,即当Off状态被激活时赋值flag = 0,则对应的标签应该写为:

创建状态之后,也可以通过查看其属性来修改相应的设置。在状态上单击鼠标右键,在快捷菜单中选择Properties命令,可以通过状态的属性对话框进一步定义状态,如图所示。



Name属性:状态的名称。
Sate Otput属性:决定是否将状态的活动情况输出,以驱动或者触发
其他子系统的运动。
Test Point属性:设置状态为系统调试监测点。设置该属性可确保状态的活动
情况能够在Simulink的观测模块(例如悬浮示波器)中被观察。如果取消
Stateflow Coder 的属性Enable debugging/animation的设置,则只有
设置了状态的Test Point属性才能够在相应的观测模块中查看状态的活动情况。
Description属性:Stateflow允许用户为定义的图形或者非图形对象增加
必要的描述文本,就好比编写c语言程序时,为程序增加必要的注释一样。可以
在这里添加需要解释的文本说明,并且在代码生成时,Desceiption属性的文本
内容可以显示在代码相应的位置。
Document Link属性:Document Link属性允许用户为相应的图形或非图形对
象增加必要的超链接。该属性的内容即可以是MATLAB的表达式,也可以是本机
的超文本链接,还可以是因特网的网址。当用户查看相应对象的属性时,只要
单击Document Link,就可以在相应的编辑器或者浏览器中查看到具体的超链接
信息。如果该属性的内容为空,则单击Document Link时,Stateflow将给出
该属性的填写示例。

3.参考文献
[1] 刘杰.基于模型的设计及其嵌入式实现[M].北京:北京航空航天大学出版社,2010.
[2] 张威.Stateflow逻辑系统建模[M].西安:西安电子科技大写出版社,2007.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙编 辑 | 郭志龙校 对 | 郭志龙