所定义的事件和转移进行操作。转移表示状态机如何对事件进行响应(控制流程)。它有明确的输入和输出的个数,可以明确地配置所有的模式或状态。它也定义了导致系统从一个状态转换到另一个状态的逻辑或事件。
状态(States)
在有限状态机里,状态描述的是系统的一种模式。状态具有布尔行为,也就是说在任何给定的时刻它或者是活动的或者是非活动的。
状态在系统中被看作为记忆元件。它保持系统的当前模式,一旦被激活,状态就保持活动的模式,直到系统改变模式,状态才变为非活动的。
在层次的同一级里,所有的状态要么是互斥(OR)的要么是并行(AND)的。如果状态之间是互斥的,那么在任何给定的时刻只有一个状态是活动的,如果状态之间是并行的,在同一时刻所有的状态都是活动的。在同一级里面不可能有既是互斥的又是并行的状态存在。它们必须是或者互斥或者并行。
转移(Transitions)
转移描述的是有限状态系统内的逻辑流。转移管理了当系统从当前状态改变时,这个系统可能发生的模式改变。当转移发生时,源状态变为非活动的,目标状态变为活动的。
事件(Events)
事件控制有限状态系统的执行。只有某个事件发生后系统才能从一个状态改变到另一个状态。事件是非图形对象——每个事件都被定义成一个独立的名字。如果一个转移用一个事件名做为标签,仅当那个事件发生时,转移才有效。如果转移没用事件名作为标签,只要有事件发生转移就有效。
条件(Conditions)
条件是有限状态系统中的有效流,条件必须定义在[]括号中。当一个事件发生时,只有当[]括号中的语句为真或非零时,带有条件标签的转移才有效。转移可以同时拥有事件和条件;条件要放在事件名之后。当转移标签既有事件又有条件时,只有当指定的事件发生并且条件为真时转移才有效
动作(Actions)
转移动作是当一个转移发生时要执行的命令。转移动作定义在―/‖之后,动作能影响系统本身,并且(或者)影响到与有限状态系统相关的一些外部元素。动作能够处理数据,调用函数,发生触发事件。
如果把动作和转移相关联,动作语句要放在事件标签和条件语句的后面。
数据对象(Data Objects)
数据对象存储了关于条件和动作的一些必要的信息。数据对象是非图形对象– 每一个数据对象都被指定成一个独立的名字。
连接节点(Connective Junction)
连接节点作为转移通路的判决点或汇合点。它不是记忆元件。因此,转移的执行不能停留在节点上,必须到达某个状态时,转移才能停止。
连接节点可以作为一个决策点。由于连接节点不是记忆元件,转移必须到达某个状态时,执行才能结束。因此,可以利用这个特点来简化模型。
缺省转移(Default Transitions)
缺省转移确定当有限状态机或者父状态处于活动状态的时候,在所有的子状态中第一个被激活的状态。图中当有限状态机变为活动的时候,它首先尝试激活带有缺省转移的子状态,同时可以在缺省转移的标签上加上事件和条件来进行限制,也可以将动作和缺省转移相关联。
注意: 缺省转移并不意味着停止状态在最初就是活动的,它仅仅标志着当DVD播放机系统变为活动的时候这个状态是活动的
状态转移
Stateflow状态图被称为―状态转移图‖,这些状态图中包含了所谓的状态、状态转移管理和维护当前内存中活动的状态
一旦包含了状态转移的状态图处于活动的状态,则状态图将一直处于这种活动状态,直到整个模型仿真计算结束。
当在某一个制定的时间步长内完成了必要的工作后,状态图简单地进入到一种暂时挂起的状态,而不是非活动状态。也就是说,在连续两次触发事件之间,状态图是一直处于活动状态的。
具有状态转移的Stateflow状态图相当于一种包含了离散系统模块的触发子系统。这种子系统在内存中保持自己的状态,在有触发时更新自己的输出,而在两个连续的触发之间保持自己的状态。
当一个状态转移图处于活动状态时,这个状态转移图首先尝试激活相应的状态,以及邻近的状态。如果,状态机处于第一层,则执行的第一个元素是系统的默认转移。由于状态机在模型运行结束之前一直处于活动状态,默认转移仅仅有效一次,即在状态机被激活的首次有效,这一点必须注意。如果状态的第一层仅有一个状态,则可以不使用默认的转移。一旦进入一个状态,这个状态就一直处于活动状态,直到退出为止。与状态机类似,状态也在连续两次触发之间挂起而不会成为不活动状态。
注意 StateFlow 同层次的图执行顺序是从上到下,从左到右的优先级原则,during和on
事件的执行顺序由他们在状态图中的位置决定,先写的先执行
事件驱动
所谓事件是指触发的发生。一个触发可以是隐含存在的,按照预先的配置自动的发生。同样,触发也可以显性的定义,在一个具有过零特性的信号发生,或者被函数调用时,触发发生,也就是发出了事件。由于这种触发而引起的相应的动作执行,被称之为事件驱动!
在Stateflow中,所有的状态图的运行都是依靠事件驱动。换句话说,状态图是依赖于事件而活动的。事件同样驱动状态的变化。
每次触发一次,状态图就重新进行判断一次。
过零触发
过零触发事件具有三种形式:
? 上升沿触发—— 当过零信号由负值变为正值,或者由负值变为0,或者由0变为正 ? 下降沿触发——当过零信号由正值变为负值,或者由正值变为0,或者由0变为负值 ? 双边沿触发—— 上述两种触发机制的结合
例如图中显示的信号中具有四个过零,分别是两次上升沿和两次下降沿。如果,模型中的状态机使用了双边沿触发,则状态机将执行四次。
利用下列的模块可以在Simulink中产生相应的过零信号: ? 震荡函数 ? 脉冲发生器
? 阶跃信号(每个阶跃信号仅能产生一个事件) ? 双端输入开关 ? 静态模块
可以使用手动开关以及使用图形界面控制事件的发生。
输入事件的定义和使用
使用事件驱动具体的转移时,需要在相应的转移上标注事件的名称。然而,所有Stateflow状态机使用的事件都必须在数据字典中明确定义。
定义一个从Simulink输入事件的过程比较简单,选择Add菜单下Event命令,接着选择Input From Simulink命令。在弹出的对话框中写入需要定义事件的名称,这个名称
必须与状态转移标签上标注的名称一致。同样,需要选择触发的类型,这里需要注意的是在对话框Scope字段一定要设置为Input from Simulink.当单击OK或Apply按钮后,Stateflow块上将出现一个输入端口。同时,也显示了具有输入事件类型的标志。
定义多个输入事件
每个Stateflow块有且仅有一个事件输入端口。所以,在使用多个驱动事件输入时,必须通过Mux块将不同的事件整合为一个向量。这时,每一个输入事件的索引同Stateflow定义事件的顺序一一对应。需要注意的一点,Mux块的信号索引是由上至下(Mux块垂直放置)或者由左至右的(Mux块水平放置)。
使用默认转移注意事项
? 当其父状态被激活的时候,默认转移仅仅执行一次。那么当父状态再次从非活动状态进入到活动状态,默认转移将再次执行。
? 当默认转移在状态图的第一层的时候,需要小心。如果第一次触发事件发生时默认转移无效,系统将发出一个二义性警告,这个警告错误一般在父状态被激活,而父状态下的子状态不能确认具体哪一个被激活时发出。这时候,状态图被激活了,但是没有一个确定的状态被激活。
注意: 如果在Stateflow调试器中从错误检测选项字段中去除State Inconsistency,则上述
的二义性错误警告不会发出。
? 一定要牢记一点,一旦Stateflow状态图被激活,则状态图会一直处于激活状态直到系统仿真的结束。由于默认转移的执行需要依赖父状态的再次激活,则这里的默认转移将不再有机会执行了。
? 若需要通过事件来控制状态的执行,则可以建立一个哑元状态,或者将状态图置于使能子系统中,将相应的触发事件设置为Reset.
?????????????????????怎么建立哑元状态
使用数据对象
数据对象主要是用在条件和动作语句中。可以根据需要在Stateflow图表中限制数据对象的使用,也可以使用数据对象作为chart和外部环境的接口,这里所说的外部环境即Simulink模型中的其他模块。
定义数据对象
所有可用的数据对象都被定义在数据字典中。定义数据对象时,使用Add菜单下的Data子菜单中相应的命令即可,这些菜单命令决定了数据对象作用的范围:
? Local – 数据对象仅在该Stateflow图表中有效
? Input from Simulink –数据对象是从Simulink中某个模块的信号输入到Stateflow图表中 ? Output to Simulink – 数据对象作为Stateflow块的输出到Simulink模型的其他模块 下图中是添加新数据对象时调用的对话框,可以在数据对象属性对话框中设置数据对象的属性,例如在Name字段中可以编辑数据对象的名字,数据对象的名字作为Stateflow图表中的标签,标识数据对象。与输入的事件不同,Stateflow块的输入或输出数据对象分别有各自的输入输出端口。
在数据对象属性对话框中设置数据对象的属性。 Scope 字段中表示了数据对象的作用范围: ? Input from Simulink – 从外部模块输入信号 ? Output to Simulink – 信号输出到外部模块 ? Local – 仅在该图表中有效
? Constant – 作为一个常量存在,数值不可改变 ? Temporary – 当图表活动时数据对象才有效
在Stateflow图表中,数据对象的类型不一定必须为双精度类型,可以在Type字段中设置数据对象的数据类型,其中包括:double, single, int32, int16, int8,uint32, uint16, uint8, boolean等。
每一个输入或输出数据对象都有相应的索引值,可以在Port字段中设置索引值,如果Stateflow图表具有多个输入输出数据,可以在这里修改其索引值,这样就改变了数据对象的端口顺序。
在Limit Range面板的Min和Max字段中可以设置数据对象的最大值和最小值,以限制数据对象值域。
使用数据对象的Stateflow图表,可以使用下列方法设置数据对象的初值: ? 数据字典,可以在对话框中设置数据对象的初始数值 ? MATLAB 工作空间,可以为数据对象直接赋初值
在仿真结束时,也可以强制设置数据对象终值保存到MATLAB的工作空间,选择Save final value to baseworkspace 选项,在工作空间中就会存在同样名字的数据。
Stateflow浏览器
使用Stateflow浏览器可以查看所有定义的事件和数据对象。执行Stateflow浏览器,选择Tool菜单下的Explorer命令,同样,在Stafeflow编辑环境的工具栏上也有相应的命令按钮。
Stateflow浏览器分为左右两栏,左边是状态的层次树,右边是相应状态图中定义的数据或事件对象。
需要查看数据或者事件对象时,只要用鼠标单击状态图的根目录,就可以查看、修改相应的事件或数据对象。
在浏览器中,不仅可以查看数据和事件,也可以修改这些数据或者事件的属性, ? 双击事件或者数据对象的图标( 或)可以打开相应的属性设置对话框 ? 双击事件或者数据对象的名字可以修改事件或数据对象的命名 ? 左键单击事件或是数据对象的属性,可以修改或定义相应的属性如果选择了其中某一个对象,可以:
? 右键拖放,可以复制数据对象或者事件 ? 按Delete 键可以从数据字典中删除对象
如果需要选择多个事件或数据对象,可以在选取对象的时候按下Shift键。
浏览器的Add菜单可以给选择的状态图添加事件或数据对象。这时,可以将数据对象或者事件限制在某个局部的范围内,而且,在添加数据或者事件之后可以改变不同的属性,任意的修改作用范围等等。
使用条件
条件表达式包括:
? 使用布尔运算符比较两个数据对象 ? 以布尔变量作为返回值的函数 注意:
? 条件表达式不能通过调用函数而更改数据对象或影响改变图表中的状态 ? 赋值表达式不能作为条件表达式
? 使用―与‖操作符―&&‖完成条件表达式的与操作 ? 使用―或‖操作符―| |‖完成调价表达式的或操作 这里的与操作和或操作都使用了C语言的语法,也可以使用MATLAB的& 和| 运算符完成同样的工作,不过需要注意C语言中的位操作语法这里是无效的。不过如果需要使用这种C语言语法的位操作符,可以在Chart Properties对话框中选择Use C-like BitOperation选项。
下列是Stateflow支持的布尔运算符 ? > < >= <= == ~= != < > ? & | && ||
转移动作
下图表示的转移动作标签主要由四个部分组成: · 事件名称
· 条件( “[]”之间的表达式) · 条件动作(“{}” 之间的表达式) · 转移动作(“/”之后的表达式)
在转移动作标签中不一定需要包含所有的上述部分,但是必须按照图中所示的顺序书写转移动作标签。