Stateflow学习.docx

上传人:b****4 文档编号:5239845 上传时间:2022-12-14 格式:DOCX 页数:37 大小:2.23MB
下载 相关 举报
Stateflow学习.docx_第1页
第1页 / 共37页
Stateflow学习.docx_第2页
第2页 / 共37页
Stateflow学习.docx_第3页
第3页 / 共37页
Stateflow学习.docx_第4页
第4页 / 共37页
Stateflow学习.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

Stateflow学习.docx

《Stateflow学习.docx》由会员分享,可在线阅读,更多相关《Stateflow学习.docx(37页珍藏版)》请在冰豆网上搜索。

Stateflow学习.docx

Stateflow学习

Stateflow工作窗口介绍:

创建框图之后,可以将其锁定,具体做法是:

1.选择Edit菜单下的ChartProperties选项打开Chart属性对话框

2.在Editor域里面选择Locked选项。

在matlab窗口中输入sfnew,则出现了带chart的simulink工作界面

Inf代表无穷大

两个chart的并行状态的设置:

在Stateflow的空白处,右击鼠标,选择Decomposition-parallel(AND)此时两个状态的边框将变成虚线,并出现边框

状态(state):

双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):

 name/                        %此状态的名称

entry:

entryaction         %刚转换到此状态时执行entryaction

during:

duringaction  %在此状态之中时执行duringaction

exit:

exitaction                %退出此状态时执行exitaction(可以是事件触发)

注意StateFlow同层次的图执行顺序是从上到下,从左到右的优先级原则,during和on事件的执行顺序由他们在状态图中的位置决定,先写的先执行

onevent_name:

onevent_nameaction %当某事件发生时执行onevent_nameaction

历史节点(HistoryJunction):

一旦一个状态框中有这个历史节点,在退出这个状态时会将这个状态的一些信息保存下来,当下次再进入此状态时,此状态的初始状态就会是前面保存过的那些信息。

 默认转换(defaulttransition):

把他拖到一个状态的旁边,它就会指向一个状态,表示系统启动后将首先进入这个状态。

 节点(Junction):

它是方便画状态图的,当各个状态之间的转换很复杂时,可以设立中间节点,将一些相同的转换指向它,然后再由它指向各个状态(或另一个中间节点)

 转换线(transition):

将鼠标放在一个状态的旁边,当它变成+形状的时候,按下左键不动,就会拉出一条线来,当拉到另一个状态旁边时松开左键,这样就画出了一条由一个状态指向另一个状态的转换线,选中这条线,将鼠标停留在上面,鼠标会变成一个I的样子,这时按下鼠标,就可以在上面写语句,例:

switch(switch事件使状态转换)或[output>maxtime](当此条件满足时进行状态的转变)。

交汇连接点:

主要用于处理状态迁移过程中的迁移信号的分离和汇合,合理的使用可以实现if_else的功能

图形函数工具;格式:

返回形参=函数名(形参)

状态流的图形函数是使用交汇连接工具和状态转移工具绘制状态流图形,在调用函数时,函数必须执行完全,所以图形函数中不能含有状态。

一个最小的图形函数至少要包含一个缺省的迁移和一个终止的交汇连接工具

可以在状态流的状态动作好状态迁移中反复调用它,调用的格式与函数的格式完全相同,知识需要将形参换成实际使用的参数变量。

历史交汇工具的使用:

Stateflow图进入上层状态时,缺省状态迁移线连接的子系统首先被激活,单在某些情况下,希望在进入上层状态时首先激活以前的最后的状态,这样就要求在上层状态中引入历史交汇工具完成。

嵌入式MATLAB函数:

格式:

函数名(形参)

内嵌函数的调用类似于图形函数的调用方法,用户可以在状态的动作和迁移过程中对内嵌函数进行反复的调用。

函数的格式:

functionMaxMin(x)

len=length(x);

XMax=max(x);

XMin=min(x);

XMean=avg(x,len);

functionmean=avg(array,size)

mean=sum(array)/size;

真值表的决策和使用:

Stateflow使用函数在处理Stateflow图中反复处理的动作和判断。

在真值表中,用户可以使用条件、决策和动作来做逻辑判断,并执行相应的动作,对于纯粹的逻辑来讲,真值表还可以告诉用户是否对于指定的条件做出足够的或过多的决策。

Stateflow使用真值表函数实现逻辑决策及相应动作的执行。

Stateflow真值表含有条件、决策和动作。

Stateflow还允许真值表函数添加初始和终止动作。

初始动作指仁和决策判断前的动作。

终止动作指顶真值表函数即将退出最后执行的动作。

在动作编辑表中使用INIT和FINAL来为真值表函数指定初始和终止动作

为什么初始动作和结束动作不能用

决策列隐含着各个条件的“与”操作。

最后一个决策称为缺省策略。

可以很好的实现if_else的功能。

缺省策略怎么实现

Box工具整理状态流图:

状态图右击Type—Box,也可以直接创建Box,在里边创建其他的对象,创建好之后可以打包MakeContent—Group,Box中的对象就变成了子图。

对Box添加数据,可以是Box中的所有原始共享该数据。

多数情况下Boxes不改变Stateflow图的逻辑判断功能,但是存在并行状态时,她却影响着StateFlow图中的激活顺序。

在一个Box中,顺序是从上到下,Box之间是左到右

以上的共同点:

创建的时候参数需要在model中创建输入参数和输出的参数。

Stateflow中的动作:

触发时间[迁移条件关系式]{条件动作}/迁移动作。

任何Stateflow事件都(包括enter事件、exit事件、或change事件等隐含事件)都可以作为瞬时动作的基事件。

可以使用simulink的输入。

也可以使用隐含时间wakeup或(tick)来唤醒Stateflow图(不能用在缺省的途中。

常用的逻辑操作:

After(10,CLK)&&[temp==COLD]与CLK[after(10,CLK)&&temp==COLD]意义相同

下边是一个定时器的转换图:

说明:

格式触发事件[条件关系式]{条件动作}/迁移动作

触发事件表示只要迁移关系式是真,该触发事件可以引发状态的迁移,缺省触发事件时,任何事件均可以在条件关系式为真的情况下引发状态的迁移,在图12.7中,只有条件[off_count==0]为真,事件off_switch可以引发状态On致状态Off的迁移。

条件关系式一般为布尔关系式,写在方括号中,使得对于特定的信号有效,本例中,只有off_count==0为真时,发生事件off_switch才可以引发状态的迁移。

条件动作是指当条件关系式一旦成立(即为真时),就执行的动作,通常发生在迁移终点被确认有效之前。

如果没有规定条件关系式,则认为条件关系式为真,即刻执行条件动作。

条件动作必须写在花括号中。

在图12.7中,只要条件[off_count==0]为真,即刻执行条件动作off_count++。

迁移动作是指当迁移终点已经确定有效才执行的动作,如果迁移包含很多阶段,迁移动作只有在整个迁移通道到终点确认为有效厚方可执行。

迁移动作写在斜线”/”之后,在图12.7中的实例中,当条件[off_count==0]为真,发生了off_switch事件,迁移终点状态Off确认为有效,此时执行迁移动作LED_off。

教会连接if_else的实现和for循环功能

在simulink中,自己可以手动的调整开关,canstant中的数据可以修改,调试仿真。

自己生成的那个错误是什么原因在buhao.Mdl

运行中怎么有红圈和篮圈,分别带表什么?

能不能调用子状态

的作用是什么?

>>fin=[[0:

1/2000:

1-1/2000][1:

-1/500:

1/500]];

>>t=0:

4999;

>>value=[finfin];

jaws=[t'value'];

Data:

jaws

Sampletime:

1

Formoutputafterfinaldatavalueby:

SettingToZero.

>>t=0:

0.1:

10;%表示输入信号的时间范围

>>u=sin(t);%产生输入正弦信号

>>sim_input=[t',u'];%传递至Simulink系统模型的变量接下来,采用默认的系统仿真参数并运行系统仿真。

sim_input是在ConfigueationParameters里的dataimport/export里设置的输入。

最后使用MATLAB命令绘制出原始输入信号与系统运算结果,

>>plot(t,u,tout,yout,‘--’)%绘制系统输入信号与仿真结果,使用sim命令进行动态系统仿真

什么是有限元状态机?

有限元状态机是具有有限个状态的系统的理论表述。

它以某些缺省的状态为起点,根据所定义的事件和转移进行操作。

转移表示状态机如何对事件进行响应(控制流程)。

它有明确的输入和输出的个数,可以明确地配置所有的模式或状态。

它也定义了导致系统从一个状态转换到另一个状态的逻辑或事件。

状态(States)

在有限状态机里,状态描述的是系统的一种模式。

状态具有布尔行为,也就是说在任何给定的时刻它或者是活动的或者是非活动的。

状态在系统中被看作为记忆元件。

它保持系统的当前模式,一旦被激活,状态就保持活动的模式,直到系统改变模式,状态才变为非活动的。

在层次的同一级里,所有的状态要么是互斥(OR)的要么是并行(AND)的。

如果状态之间是互斥的,那么在任何给定的时刻只有一个状态是活动的,如果状态之间是并行的,在同一时刻所有的状态都是活动的。

在同一级里面不可能有既是互斥的又是并行的状态存在。

它们必须是或者互斥或者并行。

转移(Transitions)

转移描述的是有限状态系统内的逻辑流。

转移管理了当系统从当前状态改变时,这个系统可能发生的模式改变。

当转移发生时,源状态变为非活动的,目标状态变为活动的。

事件(Events)

事件控制有限状态系统的执行。

只有某个事件发生后系统才能从一个状态改变到另一个状态。

事件是非图形对象——每个事件都被定义成一个独立的名字。

如果一个转移用一个事件名做为标签,仅当那个事件发生时,转移才有效。

如果转移没用事件名作为标签,只要有事件发生转移就有效。

条件(Conditions)

条件是有限状态系统中的有效流,条件必须定义在[]括号中。

当一个事件发生时,只有当[]括号中的语句为真或非零时,带有条件标签的转移才有效。

转移可以同时拥有事件和条件;条件要放在事件名之后。

当转移标签既有事件又有条件时,只有当指定的事件发生并且条件为真时转移才有效

动作(Actions)

转移动作是当一个转移发生时要执行的命令。

转移动作定义在“/”之后,动作能影响系统本身,并且(或者)影响到与有限状态系统相关的一些外部元素。

动作能够处理数据,调用函数,发生触发事件。

如果把动作和转移相关联,动作语句要放在事件标签和条件语句的后面。

数据对象(DataObjects)

数据对象存储了关于条件和动作的一些必要的信息。

数据对象是非图形对象–每一个数据对象都被指定成一个独立的名字。

连接节点(ConnectiveJunction)

连接节点作为转移通路的判决点或汇合点。

它不是记忆元件。

因此,转移的执行不能停留在节点上,必须到达某个状态时,转移才能停止。

连接节点可以作为一个决策点。

由于连接节点不是记忆元件,转移必须到达某个状态时,执行才能结束。

因此,可以利用这个特点来简化模型。

缺省转移(DefaultTransitions)

缺省转移确定当有限状态机或者父状态处于活动状态的时候,在所有的子状态中第一个被激活的状态。

图中当有限状态机变为活动的时候,它首先尝试激活带有缺省转移的子状态,同时可以在缺省转移的标签上加上事件和条件来进行限制,也可以将动作和缺省转移相关联。

注意:

缺省转移并不意味着停止状态在最初就是活动的,它仅仅标志着当DVD播放机系统变为活动的时候这个状态是活动的

状态转移

Stateflow状态图被称为“状态转移图”,这些状态图中包含了所谓的状态、状态转移管理和维护当前内存中活动的状态

一旦包含了状态转移的状态图处于活动的状态,则状态图将一直处于这种活动状态,直到整个模型仿真计算结束。

当在某一个制定的时间步长内完成了必要的工作后,状态图简单地进入到一种暂时挂起的状态,而不是非活动状态。

也就是说,在连续两次触发事件之间,状态图是一直处于活动状态的。

具有状态转移的Stateflow状态图相当于一种包含了离散系统模块的触发子系统。

这种子系统在内存中保持自己的状态,在有触发时更新自己的输出,而在两个连续的触发之间保持自己的状态。

当一个状态转移图处于活动状态时,这个状态转移图首先尝试激活相应的状态,以及邻近的状态。

如果,状态机处于第一层,则执行的第一个元素是系统的默认转移。

由于状态机在模型运行结束之前一直处于活动状态,默认转移仅仅有效一次,即在状态机被激活的首次有效,这一点必须注意。

如果状态的第一层仅有一个状态,则可以不使用默认的转移。

一旦进入一个状态,这个状态就一直处于活动状态,直到退出为止。

与状态机类似,状态也在连续两次触发之间挂起而不会成为不活动状态。

注意StateFlow同层次的图执行顺序是从上到下,从左到右的优先级原则,during和on事件的执行顺序由他们在状态图中的位置决定,先写的先执行

事件驱动

所谓事件是指触发的发生。

一个触发可以是隐含存在的,按照预先的配置自动的发生。

同样,触发也可以显性的定义,在一个具有过零特性的信号发生,或者被函数调用时,触发发生,也就是发出了事件。

由于这种触发而引起的相应的动作执行,被称之为事件驱动!

在Stateflow中,所有的状态图的运行都是依靠事件驱动。

换句话说,状态图是依赖于事件而活动的。

事件同样驱动状态的变化。

每次触发一次,状态图就重新进行判断一次。

过零触发

过零触发事件具有三种形式:

•上升沿触发——当过零信号由负值变为正值,或者由负值变为0,或者由0变为正

•下降沿触发——当过零信号由正值变为负值,或者由正值变为0,或者由0变为负值

•双边沿触发——上述两种触发机制的结合

例如图中显示的信号中具有四个过零,分别是两次上升沿和两次下降沿。

如果,模型中的状态机使用了双边沿触发,则状态机将执行四次。

利用下列的模块可以在Simulink中产生相应的过零信号:

•震荡函数

•脉冲发生器

•阶跃信号(每个阶跃信号仅能产生一个事件)

•双端输入开关

•静态模块

可以使用手动开关以及使用图形界面控制事件的发生。

输入事件的定义和使用

使用事件驱动具体的转移时,需要在相应的转移上标注事件的名称。

然而,所有Stateflow状态机使用的事件都必须在数据字典中明确定义。

定义一个从Simulink输入事件的过程比较简单,选择Add菜单下Event命令,接着选择InputFromSimulink命令。

在弹出的对话框中写入需要定义事件的名称,这个名称

必须与状态转移标签上标注的名称一致。

同样,需要选择触发的类型,这里需要注意的是在对话框Scope字段一定要设置为InputfromSimulink.当单击OK或Apply按钮后,Stateflow块上将出现一个输入端口。

同时,也显示了具有输入事件类型的标志。

定义多个输入事件

每个Stateflow块有且仅有一个事件输入端口。

所以,在使用多个驱动事件输入时,必须通过Mux块将不同的事件整合为一个向量。

这时,每一个输入事件的索引同Stateflow定义事件的顺序一一对应。

需要注意的一点,Mux块的信号索引是由上至下(Mux块垂直放置)或者由左至右的(Mux块水平放置)。

使用默认转移注意事项

•当其父状态被激活的时候,默认转移仅仅执行一次。

那么当父状态再次从非活动状态进入到活动状态,默认转移将再次执行。

•当默认转移在状态图的第一层的时候,需要小心。

如果第一次触发事件发生时默认转移无效,系统将发出一个二义性警告,这个警告错误一般在父状态被激活,而父状态下的子状态不能确认具体哪一个被激活时发出。

这时候,状态图被激活了,但是没有一个确定的状态被激活。

注意:

如果在Stateflow调试器中从错误检测选项字段中去除StateInconsistency,则上述的二义性错误警告不会发出。

•一定要牢记一点,一旦Stateflow状态图被激活,则状态图会一直处于激活状态直到系统仿真的结束。

由于默认转移的执行需要依赖父状态的再次激活,则这里的默认转移将不再有机会执行了。

•若需要通过事件来控制状态的执行,则可以建立一个哑元状态,或者将状态图置于使能子系统中,将相应的触发事件设置为Reset.

怎么建立哑元状态

使用数据对象

数据对象主要是用在条件和动作语句中。

可以根据需要在Stateflow图表中限制数据对象的使用,也可以使用数据对象作为chart和外部环境的接口,这里所说的外部环境即Simulink模型中的其他模块。

定义数据对象

所有可用的数据对象都被定义在数据字典中。

定义数据对象时,使用Add菜单下的Data子菜单中相应的命令即可,这些菜单命令决定了数据对象作用的范围:

•Local–数据对象仅在该Stateflow图表中有效

•InputfromSimulink–数据对象是从Simulink中某个模块的信号输入到Stateflow图表中

•OutputtoSimulink–数据对象作为Stateflow块的输出到Simulink模型的其他模块

下图中是添加新数据对象时调用的对话框,可以在数据对象属性对话框中设置数据对象的属性,例如在Name字段中可以编辑数据对象的名字,数据对象的名字作为Stateflow图表中的标签,标识数据对象。

与输入的事件不同,Stateflow块的输入或输出数据对象分别有各自的输入输出端口。

在数据对象属性对话框中设置数据对象的属性。

Scope字段中表示了数据对象的作用范围:

•InputfromSimulink–从外部模块输入信号

•OutputtoSimulink–信号输出到外部模块

•Local–仅在该图表中有效

•Constant–作为一个常量存在,数值不可改变

•Temporary–当图表活动时数据对象才有效

在Stateflow图表中,数据对象的类型不一定必须为双精度类型,可以在Type字段中设置数据对象的数据类型,其中包括:

double,single,int32,int16,int8,uint32,uint16,uint8,boolean等。

每一个输入或输出数据对象都有相应的索引值,可以在Port字段中设置索引值,如果Stateflow图表具有多个输入输出数据,可以在这里修改其索引值,这样就改变了数据对象的端口顺序。

在LimitRange面板的Min和Max字段中可以设置数据对象的最大值和最小值,以限制数据对象值域。

使用数据对象的Stateflow图表,可以使用下列方法设置数据对象的初值:

•数据字典,可以在对话框中设置数据对象的初始数值

•MATLAB工作空间,可以为数据对象直接赋初值

在仿真结束时,也可以强制设置数据对象终值保存到MATLAB的工作空间,选择Savefinalvaluetobaseworkspace选项,在工作空间中就会存在同样名字的数据。

Stateflow浏览器

使用Stateflow浏览器可以查看所有定义的事件和数据对象。

执行Stateflow浏览器,选择Tool菜单下的Explorer命令,同样,在Stafeflow编辑环境的工具栏上也有相应的命令按钮。

Stateflow浏览器分为左右两栏,左边是状态的层次树,右边是相应状态图中定义的数据或事件对象。

需要查看数据或者事件对象时,只要用鼠标单击状态图的根目录,就可以查看、修改相应的事件或数据对象。

在浏览器中,不仅可以查看数据和事件,也可以修改这些数据或者事件的属性,

•双击事件或者数据对象的图标(或)可以打开相应的属性设置对话框

•双击事件或者数据对象的名字可以修改事件或数据对象的命名

•左键单击事件或是数据对象的属性,可以修改或定义相应的属性如果选择了其中某一个对象,可以:

•右键拖放,可以复制数据对象或者事件

•按Delete键可以从数据字典中删除对象

如果需要选择多个事件或数据对象,可以在选取对象的时候按下Shift键。

浏览器的Add菜单可以给选择的状态图添加事件或数据对象。

这时,可以将数据对象或者事件限制在某个局部的范围内,而且,在添加数据或者事件之后可以改变不同的属性,任意的修改作用范围等等。

使用条件

条件表达式包括:

•使用布尔运算符比较两个数据对象

•以布尔变量作为返回值的函数

注意:

•条件表达式不能通过调用函数而更改数据对象或影响改变图表中的状态

•赋值表达式不能作为条件表达式

•使用“与”操作符“&&”完成条件表达式的与操作

•使用“或”操作符“||”完成调价表达式的或操作

这里的与操作和或操作都使用了C语言的语法,也可以使用MATLAB的&和|运算符完成同样的工作,不过需要注意C语言中的位操作语法这里是无效的。

不过如果需要使用这种C语言语法的位操作符,可以在ChartProperties对话框中选择UseC-likeBitOperation选项。

下列是Stateflow支持的布尔运算符

•><>=<===~=!

=<>

•&|&&||

转移动作

下图表示的转移动作标签主要由四个部分组成:

·事件名称

·条件(“[]”之间的表达式)

·条件动作(“{}”之间的表达式)

·转移动作(“/”之后的表达式)

在转移动作标签中不一定需要包含所有的上述部分,但是必须按照图中所示的顺序书写转移动作标签。

条件动作和转移动作运行有所区别,条件动作在条件满足的时候就运行了,而转移动作需要在整个转移通路有效时才运行。

条件动作和转移动作实际使用时候的区别?

状态动作

状态动作的执行与状态是否是活动的息息相关,在下列情况时,发生状态动作

•初始为非活动状态,事件驱动使其激活——entry动作

•初始为活动状态,事件驱动使其进入非活动状态——exit动作

•初始为活动状态,事件没有改变其活动的状态——during动作或on动作

状态动作一般作为状态名称标签的一部分,可以紧跟在标签名称后面定义动作的名称,不过,定义动作的时候需要使用关键字来标识动作的作用类型。

使用状态动作,需要按照下列两种格式书写:

Name/Keyword:

Actions或者

Name

Keyword:

Actions

数亿“/”在第二种格式中可以选择性添加使用

状态动作的关键字:

•entryoren在事件触发状态进入活动状态时执行

•exitorex在事件触发状态退出活动状态时执行

•duringordu在事件触发发生,状态保持原有的活动状态时执行

•onevent_name当以event_name命名的事件发生时,状态保持原有的活动状态而执行相应的动作

动作的执行顺序

前文提及,在有事件驱动且条件满足的时候,执行相应的条件动作,条件的两个分支分别被检查确定有效的通路,如果整条通路都有效,系统才执行转移动作。

而原状态的退出动

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1