首页 Stateflow教程

Stateflow教程

举报
开通vip

Stateflow教程Stateflow介绍创建框图之后,可以将其锁定,具体做法是:1.选择Edit菜单下的ChartProperties选项打开Chart属性对话框2.在Editor域里面选择Locked选项。在matlab窗口中输入sfnew,则出现了带chart的simulink工作界面Inf代表无穷大两个chart的并行状态的设置:在Stateflow的空白处,右击鼠标,选择Decomposition-parallel(AND)此时两个状态的边框将变成虚线,并出现边框状态(state):双击它就可以在其中写一些命令,格式如下(%...

Stateflow教程
Stateflow介绍创建框图之后,可以将其锁定,具体做法是:1.选择Edit菜单下的ChartProperties选项打开Chart属性对话框2.在Editor域里面选择Locked选项。在matlab窗口中输入sfnew,则出现了带chart的simulink工作界面Inf代表无穷大两个chart的并行状态的设置:在Stateflow的空白处,右击鼠标,选择Decomposition-parallel(AND)此时两个状态的边框将变成虚线,并出现边框状态(state):双击它就可以在其中写一些命令, 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 如下(%后面的是我自加的,方便解释):name/%此状态的名称entry:entryaction%刚转换到此状态时执行entryactionduring:duringaction%在此状态之中时执行duringactionexit:exitaction%退出此状态时执行exitaction(可以是事件触发)Stateflow中的动作:触发时间[迁移条件关系式]{条件动作}/迁移动作。注意StateFlow同层次的图执行顺序是从上到下,从左到右的优先级原则,during和on事件的执行顺序由他们在状态图中的位置决定,先写的先执行onevent_name:onevent_nameaction%当某事件发生时执行onevent_nameaction历史节点(HistoryJunction):一旦一个状态框中有这个历史节点,在退出这个状态时会将这个状态的一些信息保存下来,当下次再进入此状态时,此状态的初始状态就会是前面保存过的那些信息。默认转换(defaulttransition):把他拖到一个状态的旁边,它就会指向一个状态,表示系统启动后将首先进入这个状态。节点(Junction):它是方便画状态图的,当各个状态之间的转换很复杂时,可以设立中间节点,将一些相同的转换指向它,然后再由它指向各个状态(或另一个中间节点)转换线(transition):将鼠标放在一个状态的旁边,当它变成+形状的时候,按下左键不动,就会拉出一条线来,当拉到另一个状态旁边时松开左键,这样就画出了一条由一个状态指向另一个状态的转换线,选中这条线,将鼠标停留在上面,鼠标会变成一个I的样子,这时按下鼠标,就可以在上面写语句,例:switch(switch事件使状态转换)或[output>maxtime](当此条件满足时进行状态的转变)。交汇连接点:主要用于处理状态迁移过程中的迁移信号的分离和汇合,合理的使用可以实现if_else的功能图形 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 工具;格式:返回形参=函数名(形参)状态流的图形函数是使用交汇连接工具和状态转移工具绘制状态流图形,在调用函数时,函数必须执行完全,所以图形函数中不能含有状态。一个最小的图形函数至少要包含一个缺省的迁移和一个终止的交汇连接工具可以在状态流的状态动作好状态迁移中反复调用它,调用的格式与函数的格式完全相同,知识需要将形参换成实际使用的 参数 转速和进给参数表a氧化沟运行参数高温蒸汽处理医疗废物pid参数自整定算法口腔医院集中消毒供应 变量。历史交汇工具的使用:Stateflow图进入上层状态时,缺省状态迁移线连接的子系统首先被激活,单在某些情况下,希望在进入上层状态时首先激活以前的最后的状态,这样就要求在上层状态中引入历史交汇工具完成。嵌入式MATLAB函数:格式:函数名(形参)内嵌函数的调用类似于图形函数的调用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ,用户可以在状态的动作和迁移过程中对内嵌函数进行反复的调用。函数的格式: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]意义相同下边是一个定时器的转换图:说明:格式触发事件[条件关系式]{条件动作}/迁移动作Stateflow中的动作:触发时间[迁移条件关系式]{条件动作}/迁移动作。触发事件表示只要迁移关系式是真,该触发事件可以引发状态的迁移,缺省触发事件时,任何事件均可以在条件关系式为真的情况下引发状态的迁移,在图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:jawsSampletime:1Formoutputafterfinaldatavalueby: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)Stateflow中的动作:触发事件[迁移条件关系式]{条件动作}/迁移动作。事件控制有限状态系统的执行。只有某个事件发生后系统才能从一个状态改变到另一个状态。事件是非图形对象——每个事件都被定义成一个独立的名字。如果一个转移用一个事件名做为标签,仅当那个事件发生时,转移才有效。如果转移没用事件名作为标签,只要有事件发生转移就有效。条件(Conditions)条件是有限状态系统中的有效流,条件必须定义在[]括号中。当一个事件发生时,只有当[]括号中的语句为真或非零时,带有条件标签的转移才有效。转移可以同时拥有事件和条件;条件要放在事件名之后。当转移标签既有事件又有条件时,只有当指定的事件发生并且条件为真时转移才有效动作(Actions)转移动作是当一个转移发生时要执行的命令。转移动作定义在―/‖之后,动作能影响系统本身,并且(或者)影响到与有限状态系统相关的一些外部元素。动作能够处理数据,调用函数,发生触发事件。如果把动作和转移相关联,动作语句要放在事件标签和条件语句的后面。数据对象(DataObjects)数据对象存储了关于条件和动作的一些必要的信息。数据对象是非图形对象–每一个数据对象都被指定成一个独立的名字。连接节点(ConnectiveJunction)连接节点作为转移通路的判决点或汇合点。它不是记忆元件。因此,转移的执行不能停留在节点上,必须到达某个状态时,转移才能停止。连接节点可以作为一个决策点。由于连接节点不是记忆元件,转移必须到达某个状态时,执行才能结束。因此,可以利用这个特点来简化模型。缺省转移(DefaultTransitions)缺省转移确定当有限状态机或者父状态处于活动状态的时候,在所有的子状态中第一个被激活的状态。图中当有限状态机变为活动的时候,它首先尝试激活带有缺省转移的子状态,同时可以在缺省转移的标签上加上事件和条件来进行限制,也可以将动作和缺省转移相关联。注意:缺省转移并不意味着停止状态在最初就是活动的,它仅仅标志着当DVD播放机系统变为活动的时候这个状态是活动的状态转移Stateflow状态图被称为―状态转移图‖,这些状态图中包含了所谓的状态、状态转移管理和维护当前内存中活动的状态一旦包含了状态转移的状态图处于活动的状态,则状态图将一直处于这种活动状态,直到整个模型仿真计算结束。当在某一个制定的时间步长内完成了必要的工作后,状态图简单地进入到一种暂时挂起的状态,而不是非活动状态。也就是说,在连续两次触发事件之间,状态图是一直处于活动状态的。具有状态转移的Stateflow状态图相当于一种包含了离散系统模块的触发子系统。这种子系统在内存中保持自己的状态,在有触发时更新自己的输出,而在两个连续的触发之间保持自己的状态。当一个状态转移图处于活动状态时,这个状态转移图首先尝试激活相应的状态,以及邻近的状态。如果,状态机处于第一层,则执行的第一个元素是系统的默认转移。由于状态机在模型运行结束之前一直处于活动状态,默认转移仅仅有效一次,即在状态机被激活的首次有效,这一点必须注意。如果状态的第一层仅有一个状态,则可以不使用默认的转移。一旦进入一个状态,这个状态就一直处于活动状态,直到退出为止。与状态机类似,状态也在连续两次触发之间挂起而不会成为不活动状态。注意StateFlow同层次的图执行顺序是从上到下,从左到右的优先级原则,during和on事件的执行顺序由他们在状态图中的位置决定,先写的先执行事件驱动所谓事件是指触发的发生。一个触发可以是隐含存在的,按照预先的配置自动的发生。同样,触发也可以显性的定义,在一个具有过零特性的信号发生,或者被函数调用时,触发发生,也就是发出了事件。由于这种触发而引起的相应的动作执行,被称之为事件驱动!在Stateflow中,所有的状态图的运行都是依靠事件驱动。换句话说,状态图是依赖于事件而活动的。事件同样驱动状态的变化。每次触发一次,状态图就重新进行判断一次。t5001高亮过零触发过零触发事件具有三种形式:•上升沿触发——当过零信号由负值变为正值,或者由负值变为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或者NameKeyword:Actions注意“/”在第二种格式中可以选择性添加使用状态动作的关键字:•entryoren在事件触发状态进入活动状态时执行•exitorex在事件触发状态退出活动状态时执行•duringordu在事件触发发生,状态保持原有的活动状态时执行•onevent_name当以event_name命名的事件发生时,状态保持原有的活动状态而执行相应的动作动作的执行顺序前文提及,在有事件驱动且条件满足的时候,执行相应的条件动作,条件的两个分支分别被检查确定有效的通路,如果整条通路都有效,系统才执行转移动作。而原状态的退出动作在转移动作执行之前被执行,接着是组含义动作,然后是目标状态的进入动作。Stateflow动作语言Stateflow动作语言是图表内部进行交互的手段,同样也是同外部环境进行交互的手段,使用动作可以:•进行数学运算:•对数据对象赋值•操作数据对象•调用函数:•MATLAB函数•用户自定义的M函数•C数学库中的函数t5001高亮•用户自定义的C函数•触发事件•触发图表内部事件的执行•触发模型中的其他子系统或模块支持的数学运算二元运算:•*/%%+-^•><>=<===~=!=<>•&|&&||一元运算:•~!-•++--赋值运算:•=•+=-+*=/=位运算:•>><<•&^|•&=^=|=调用MATLAB函数调用MATLAB函数,需要在函数的名字前使用MATLAB命名空间运算符——ml,例如:•y=ml.abs(x)•y=ml.max(x1,x2)在使用ml运算符调用MATLAB函数时需要注意以下几点:•使用ml关键字调用的MATLAB函数仅能使用标量或者字符串作为函数的输入参量•调用函数时的圆括号是必须,无论被调用的函数是否具有参量•如果调用的函数具有返回参数,则返回数值的类型必须为double型•如果具有多个返回变量,仅有第一个返回变量被赋值•如果返回的参数不是标量,仅向量中的第一个元素被赋值使用C语言数学函数调用C语言数学函数形式上比较简单,例如::•y=abs(x)•y=max(x1,x2)对于Min和Max运算,仿真目标代码生成器提供了min和max函数的宏定义:#definemin(x1,x2)((x1)>(x2))?(x2):(x1)#definemax(x1,x2)((x1)>(x2))?(x1):(x2)此外,还可以使用下表中列举的数学函数:absacosasinatanatan2ceilcoscoshexpfabsfloorfmodlabsldexploglog10powrandsinsinhsqrttantanh注意:使用上表中列举的数学函数时,不需要提供函数源文件的定义。不过,在使用用户自定义的C语言函数时,必须提供函数原型的定义,以及函数的C语言源文件。调用函数:下面的例子调用了MATLAB函数和C语言数学函数,分别计算数据对象的绝对值。这里,调用MATLAB函数时需要使用ml操作符,而调用C语言函数的时候则比较简单。?????????????????怎么调用自己编的C函数,怎么看库里有什么函数图表更新方法图表更新也是可以配置的,更新主要有三种形式:•Triggered或Inherited——状态或者被外部输入的事件触发,或者按照输入信号的采样频率进行触发•Sampled——按照一个固定的频率触发状态转换•Continuous——每个仿真步长触发状态转换设置更新属性:1.执行File菜单下的ChartProperties命令2.在弹出的对话框中,设置Updatemethod字段中的内容注意:系统默认的更新方式是TriggeredorInherited.触发和继承触发更新依赖于过零信号的输入,如果图表具有事件输入则图表的更新方式必须如此。状态图初始状态为非活动状态,如果需要在模型运行伊始,状态就是活动的,则需要在ChartProperties对话框中选择Execute(enter)ChartAtInitialization选项。当没有驱动事件输入时,图表可以按照输入数据的采样频率更新自己的状态。这时的图表好比具有一个和输入数据对象更新频率一致的驱动事件输入,如果,状态图既没有输入事件也没有输入数据,那么,图表继承而来的更新速率将同系统仿真求解器步长一致。采样更新如果使用采样更新方法,则Stateflow状态图类似于系统的离散模块,具有固定的运算频率。采样更新方法按照固定的仿真步长更新自己的状态,这样,就好比状态图有固定频率的驱动事件输入。注意:采样更新方法在系统仿真开始时触发状态图,如果选择了Execute(enter)ChartAtInitialization选项,则状态图被触发两次。连续更新如果使用连续更新方法,则Stateflow图表同连续系统模块类似。连续更新方法以仿真计算的步长触发状态的更新。一个具有连续更新方法的状态图就好像具有一个极小或者极大的周期的驱动事件输入一样。注意:连续更新方法在模型首次运行时触发状态图,如果选择了Execute(enter)ChartAtInitialization选项,状态图在首次运行时会触发两次。Stateflow调试器在开发一个强壮的系统时,需要具有系统的方法来 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 和解决系统开发过程中出现的问题。Stateflow调试器提供在状态图运行过程中,对整个运行过程的控制能力。运行Stateflow调试器使用Tool菜单下的Debug命令,也可以在Stateflow编辑器的工具条中找到相应的按钮Stateflow调试器界面利用调试器,首先需要设置断点来暂停系统的运行,断点全局控制整个Stateflow状态图的运行,断点的属性可以在对象属性对话框中设置。可以在调试器中设置图表的动画行为,如果忽略动画,一般仿真的速度会比较快。当打开动画模式时,仿真的速度会有所降低。使用文本显示区,可以观察图表运行过程中的所有信息,主要包括:•Breakpoints–显示断点•BrowseData–显示数据对象•ActiveStates–显示当前活动的状态•Coverage–显示图表中处理的信息•CallStack–显示运行步骤过程中的时序信息在调试器进行模型仿真运行的时候,可以直接在调试器对话框的MATLAB命令行(MATLABCommand)字段中输入MATLAB命令,而不必回到MATLAB命令行窗口中执行同样的MATLAB命令设置断点可以将转移或者状态作为本地断点来控制Stateflow状态图的运行:1.右键单击对象,在快捷菜单中设置属性2.执行Properties命令调用对话框3.选择Debuggerbreakpoints字段中相应的属性设置也可以将断点设置为数据对象的修改或者事件的触发,而这些设置在Stateflow浏览器中完成。查寻器从Tool菜单栏中选择find选项,你也可以使用按钮访问finder。你可以限制搜寻的范围,要么查找Stateflow组件,要么既查找Stateflow组件,同时也查找Simulink对象。转移检测优先权在仿真过程中,如果Stateflow在离开状态时检测到有多个有效的转移,转移检测规则将会决定采纳何种转移。一般规则是:如果一个转移具有更多的严格的限制,那么这个转移具有更高的优先级。根据这个规则:1.既有事件又有条件的转移第一个被检测2.仅具有事件的转移则被第二个检测3.仅具有条件的转移第三个被检测4.不加任何限制的转移最后被检测转移冲突如果在同一个优先级中,具有两个合法的转移,会发生什么?这种情况会触发一个转移冲突错误的警告信息。Stateflow通过几何的方法解决这样的问题:•对于来自于一个节点的转移,按顺时针方向检测转移•对于来自于一个状态的转移,从状态的左上角开始,检测转移注意:通过在Stateflowdebugger中的Errorcheckingoptions选项,可以选择清除TransitionConflict,这样就可以抑制转移冲突错误警告信息。流程图Stateflow图如果不包含任何状态就构成了一个流程图。流程图主要是由转移和连接节点组成。流程图并不包含任何存储器。流程图一旦被触发,就会一直执行到退出为止。在两个连续的触发之间,这个流程图是不活动的。状态图在没有合法的转移分支的连接节点处执行结束。终止节点终止节点就是连接节点,只不过该连接节点聚集了所有转移路径。它是一个没有附加任何流出路径的节点。终止节点类似函数中的return声明。在一个流程图中,必须要有一个无条件路径来终止连接,防止无穷递归。在一个流程图中,以{}表示的条件动作仅仅是一个可执行的动作。图形化If-Else结构Stateflow使用转移检测以及几何学的方法解决转移冲突这个问题,我们可以利用这个特点,使用图形化的方法表达逻辑状态。构造一个if-else结构,创建的流程图如下图所示。Stateflow使用转移检测来决定何种转移将会被执行。有条件的转移代表if,而无条件的转移代表else。为了表达if-elseif-else结构,我们可以使用多个连接节点创建流程图。在第一个连接节点上,第一个条件被测试到(if声明).如果转移无效,那么就会继续下一个连接节点,测试第二个条件,(elseif声明).如果转移无效,那么就会执行无条件转移。if_elseif_elseif_else图形化的迭代循环结构使用流程图可以表示图形化的反复循环.创建一个for循环结构,如下图所示的流程图。当执行缺省转移时,循环变量(图中的变量为‗i‘)作为一个条件动作被初始化。在条件声明中‗i‘的值和固定值进行比较。作为条件动作的一部分,反复循环‗i‘的值。创建一个while循环,流程图如下所示。在每个时间步长,都会执行条件动作,直到条件不再为真为止。注意:当创建无状态系统(也就是流程图)时,在终止节点处,必须有一个无条件路径。这是为了防止用户创建无限循环模型.。临时数据vs.局部数据仅在状态图中可见的数据对象可以分成两类。一类为局部(‗local‘)数据对象,另一类为临时(‗temporary‘)数据对象。局部数据对象就相当于函数中的全局变量(也就是一个‗局部‘的全局变量):�状态图中的局部数据就相当于函数的全局变量:只有在状态图中,数据才可见当状态图第一次被激活时,局部数据为初值。随后在状态图被激活时,局部数据为前一次数值重新赋初值时,它的值必须要重置�状态图中的临时数据对象就相当于函数中的一个局部变量:它的值仅在状态图中可见.永远从初值开始在状态图的以后激活的情况下,自动重置�只有在无状态的状态图中临时数据才是有效的.??????????????????????????????????????????????????????????????怎么使用临时数据状态图层次的概念当状态具有第二个层次时,状态就构成了层次。那么高层次的状态就被称之为父状态,而低层次的状态就被称之为子状态。状态图中允许拥有的状态层次的数目是没有任何限制的。Stateflow允许在不同层次状态之间存在转移,如果转移穿越了父状态的边界直接到达了低层次的子状态,则转移被称之为超转移。使用层次需要了解掌握以下概念:•子状态的各种对象仅仅父状态活动时,才有可能执行或者有效•直接从父状态发出的转移,可以不用考虑具体哪一个子状态处于活动状态。层次化转移的路径哪一个状态首先被激活或者退出活动状态?在具有层次的状态之间转移时,一般转移路径的源头是从最内部的子状态出发,而终止于目标状态的最内部的子状态。使用层次的目的在状态图中使用层次有如下几个目的:•使用层次,可以将相关的对象组合在一起,构成族群•可以将一些通用的转移路径或者动作组合成为一个转移动作或路径,简化模型•适当地使用层次,可以有效地缩减生成代码的大小,也能够提高程序执行的效率和可读性生成组合父状态即便是将所有的子对象都用一个父状态包含起来,子对象在编辑状态时彼此之间还是独立的,例如进行移动、拷贝和重新设置大小等操作。如果需要将具有层次的状态当作一个整体来看待时,需要将父状态组合起来。方法:1.右键单击父状态,执行快捷菜单的命令2.选择MakeContents子菜单下的Group命令如果需要取消父状态的组合状态,按照上面的步骤再次选择Group命令即可。另外,还可以双击父状态来完成上面的操作。组合了的层次化状态,其状态框图内部用灰色填充,当重新设置状态框图的大小时,除了状态的标签不发生改变,其余的对象尺寸都会相应的发生变化。低层次的默认转移第二个层次状态的默认转移决定了当父状态被激活时,具体哪一个子状态被激活。如果状态转移之间存在终点为子状态的转移,这种默认转移是不起作用,也没有必要存在的。•记住:默认转移仅仅在父状态被激活时作用一次,在第二个状态图中,如果Power_On状态被第二次激活时,该状态的默认转移就不再起作用了,那么系统不知道究竟哪一个子状态会被激活。•结果:当On事件驱动从Power_Off状态转移到Power_On状态第二次发生时,系统会发出一个状态二义性错误的告警历史节点历史节点记录了在父状态退出活动状态时,具体哪一个子状态处于活动状态。当父状态再次被激活时,如果子状态没有定义显性直接转移,则历史节点将使其记录的子状态处于活动状态。在下面的例子中,如果从Off状态转移到On状态,具体哪一个子状态(Empty或者DiskInserted)会被激活,完全取决于在On状态上次退出时哪一个子状态是活动的。内部转移内部转移是指从父状态边缘内部出发,终止于子状态外边缘的转移,转移始终处于父状态的内部。在下面的例子中,无论哪一个子状态处于活动状态,当Play事件发生时,系统都将转移到Play状态。层次转移的测试优先权在层次化的状态图中,存在一组规则判断转移的有效性,特别是父状态或者子状态同时具有多个有效的转移时,这些规则如下:•转移测试首先从最高层次的活动状态开始,然后逐级向内检测•外部转移优先于内部转移被测试•在同样的层次上,超转移首先被检测上述三个转移测试规则是每一个转移测试的基础。所以根据这些基本原则:1.转移的测试从活动的父状态开始:•向外的转移首先被测试.(level1)•接着是内部转移(level2)2.然后从活动的子状态开始检测转移:•穿越父状态边缘的转移首先被检测(level3)•然后是父状态内部子状态之间的转移被检测.(level4)在同等层次的转移之间,具有最严格限制的转移首先被检测。根据语法规则,状态动作优先于转移!状态进入动作优先于默认转移首先执行•状态的during或on-event动作在内部转移之前被执行子状态图子状态图是从父状态图中创建的,它在功能上有别于父状态,最主要的区别就是子状态隐藏了内部细节。子状态利用灰色图块隐藏内部细节,简化了状态图的复杂程度,从这一点上看,子状态图更类似与Simulink的子系统。创建子状态图将父状态转变成为子状态图:1.右键单击父状态,使用快捷菜单.2.使用MakeContents子菜单3.选择Subcharted命令若取消上述操作,则重复上述过程即可。同样的功能还可以使用Box来完成,同子状态图不同,Box是直角矩形,而子状态图是圆角矩形。观察子状态图的细节察看子状态图的细节只要双击子状态图即可,这时Stateflow图形编辑器将切换视图到子状态图内部。可以利用编辑器工具条的前三个按钮在子状态图内外切换。子状态图之间的超转移绘制子状态图之间的超转移:•从源状态出发,左键拖放转移•将转移拖过目标状态的边界,这时在子状态图中心将出现一个虫孔(Wormhole)•继续拖放转移到虫孔中心,编辑窗体将自动切换到子状态图的内部,显示子图的细节。•继续拖放转移,到最终的子状态的边界,这样完成了超转移的设置相反的操作,从子状态图内部出发,绘制到外部的虫孔,就可以完成操作。状态转移的流程图状态之间的转移可以使用流程图来完成复杂的逻辑控制,一旦发生了触发,状态转移中的流程图就会被执行,直到其中的一个分支到达了某个状态。如果存在终点是连接节点的转移分支,这个转移被认为无效。这个转移也就不会引起状态的转移。状态中的流程图当进入某个状态时,可能需要根据某些复杂的逻辑关系执行一系列的动作,例如if-elseif-else结构。为了完成这样的功能,就需要没有状态存在的流程图结构。这种情况下,状态每次触发流程图就被执行一次,一直执行到某个转移分支到达终止连接节点。和状态图中的流程图不一样,当流程图执行完毕后,父状态保持活动状态。定义状态的本地数据可以将数据对象的作用范围定义成为Local或者静态,这样数据对象的有效范围就可以在某个状态内部了:1.在浏览器的层次树选择某个状态;2.选择Add菜单下的命令添加数据对象到数据字典同样也可以修改已有数据的可见性,从全局到本地。可以在浏览器中用右键拖放数据对象到不同状态或状态图中,改变数据的作用范围。访问数据对象在其他状态中访问其他状态的数据对象依然可能,然而,必须使用特殊的表达式语法形式。如果需要在其他的状态中使用其他状态中的数据对象,使用下面的语法形式:state_name.data_name如果在状态和父状态内部同时存在一个同名的数据对象,则状态中数据对象就会被父状态中的数据对象―屏蔽‖。例如Chart和State1分别具有数据对象名叫:data。若需要在State1中访问定义在Chart中的数据对象data,则需要使用下面的语法,指定父状态的名称:parent_name.data_name图形函数图形函数是指在状态图中以图形方式存在的函数,它是从具有流程图的状态创建的,它可以将具有特殊的功能或者流程结构的状态图创建成为函数,一次创建而多次使用。图形函数可以包含输入输出参数来执行相应的动作或条件。图形函数可以使用父状态的数据,在下面的例子中TRACK_MIN,TRACK_MAX和trackCounter三个数据对象是在状态图层次声明的,然而仍然可以图形函数中使用它们。图形函数的作用范围被限制在其父层次内部,所以,若图形函数在状态内部创建,则不能在状态图其他的条件或转移动作表达式中任意使用。这一特性类似于状态的本地变量,若需要超出层次之外使用状态中的图形函数,使用下面的语法格式:State_name.function_name(input_arguments)创建图形函数创建图形函数的步骤:1.在状态内部创建函数的流程2.右键单击包含流程图的状态3.在弹出的快捷菜单中,选择Type子菜单下的Function命令4.在函数的标签上定义函数的输入输出参数当在函数标签中定义输入输出参数时,这些输入输出参数都被自动的添加到数据字典中,也可以在浏览器中手动添加数据对象作为函数的输入输出参数,只要强制数据对象的名称和函数的输入输出参数名称保持一致。这些数据对象作为本地的数据对象临时存在,也就意味着只有在函数执行时数据对象才有效。??????????????????????为什么type下边没有那个命令。状态并行机制的概念状态的行为可以按照其解析方式分为两大类:互斥状态exclusive(OR)和并行状态parallel(AND)。如果在层次化的状态图中包含了互斥的状态,也就意味着同一时刻仅有一个状态处于活动状态,否则,若状态被设置为并行状态,则所有的状态都可能在同一时刻处于活动状态。并行状态可以描述系统中处于并发状态的部件,处于并行状态的状态框图边框为虚线。按照定义,父状态处于活动时并行状态就处于活动状态。当状态图处于活动时,状态图中的并行状态都将处于活动状态,所以在并行状态中就不必指定默认转移,否则状态图就会报错。同样,若从并行的状态边缘出发转移也会出错。在下面的例子中,DVD播放器具有两个组件,其中一个维护是否有光盘放入,另一个管理播放器的状态‗ON‘或‗OFF‘,可以使用并行机制完成这种系统建模工作。设置状态解析关系可以将已有的状态从互斥状态转变成为并行状态:1.右键单击状态的父状态2.选择Decomposition菜单3.执行Parallel(AND)命令注意:右键单击状态的父状态,而不是每一个状态对于顶层的状态,直接在图形编辑器的背景上单击右键即可。使用层次的并行状态可以在任意的层次上设置并行状态,然而,在同一个层次上的不同状态的解析关系必须保持一致,也就是说,在某个层次上,所有的状态要么是互斥的,要么就是并行的,两种解析状态是不可能同时存在于同一个父中。在下面的例子中,DVD播放器并行的状态有DiskSlot和Player,其中Player状态下具有子状态控制不同的工作模式(例如:Play,Rew,etc.)。设置并行状态的激活顺序按照定义,同一层次下的所有并行的状态应该在其父状态被激活的时候同时被激活,然而它们的激活是具有一定顺序的。并行状态的激活顺序在每一个状态的右上角标明,这个次序,一般按照―从上至下,从左至右‖的规则排列。若状态图中具有一个―盒子‖(BOX)包含了几个并行状态,所有盒子中的并行状态将在盒子之外的并行状态被执行之前被执行完毕。并行状态的执行顺序在并行状态中的所有有效的状态(包含子状态)执行到下一个有效的状态被执行为止。本地事件广播使用事件广播,可以在某个状态内部触发其他并行状态的执行,这样就可以在系统的不同状态之间实现交互,让一个状态的改变影响其他状态。例如,当将自己的车门锁上后,往往希望汽车的防盗系统自动打开,同时锁死汽车的点火系统。所有广播事件必须预先定义,使用Add菜单下的Event子菜单中的Local命令添加本地事件到数据字典中。这些事件可以在状态动作或者转移动作中被执行。本地事件的优先级•本地事件广播的优先级相当于函数调用·当出现事件广播时,原有的执行顺序被打断,直到所有与事件广播有关的动作执行完毕直接事件广播使用直接事件广播可以限制广播的事件触发指定的状态,这样就可以防止事件广播无意识的改变整个状态图的状态。使用直接事件广播的命令格式:send(event_name,state_name)定义状态的本地事件可以限制事件的作用范围在状态的内部:1.在浏览器种选择某个状态2.使用浏览器的Add菜单添加事件到数据字典也可以通过浏览器修改事件的可见范围,也可以修改事件到不同的状态中,这些过程都可以在浏览中使用鼠标操作完成。受限的事件广播与使用本地数据对象的方法类似,状态之外触发状态的本地事件需要指定状态名,命令格式为:state_name.data_name注意:受限的事件广播仅仅能应用在单一状态的本地事件Input/State2.Local2;Input/send(State.Local,State2);Input是一个事件,Lacal是chart一个事件Lacal2是State2下边的Local2上边可以实现相同的功能隐含事件和条件使用隐含事件和条件有助于简化并行状态之间的依赖关系,也可以减少数据字典中定义的事件数量,降低状态图的复杂程度。隐含事件:•entry(state_name)或en(state_name)•exit(state_name)或ex(state_name)•change(data_name)或chg(data_name)•wakeup或tick隐含条件[in(state_name)]??????????????????????????????怎么使用时间逻辑事件使用时间逻辑事件,可以根据事件发生的次数决定事件的逻辑转换。时间逻辑操作符(at,every,after和before)分别完成相应的Boolean运算,处理Stateflow事件的发生次数。使用时间逻辑可以:•监测转移•控制on-event状态动作语法:temporal_operator(number,event_na
本文档为【Stateflow教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
天山书童
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:0
分类:
上传时间:2020-01-27
浏览量:1