matlab的stateflow(状态流)简单应用--做一个计数器收藏
精华区里只有关于stateflow的英文介绍,再加上前几天有网友问我怎么用它,我就拿我以前用stateflow做的计数器来简单介绍一下stateflow的用法,希望能够抛砖引玉。
先介绍一下stateflow,从matlab的help中翻译过来的,stateflow要与simulink一起使用,他是一个用来在控制和管理中设计和开发逻辑图的工具(翻的不好,请大家见谅)。从我的理解来说,stateflow就是用来作状态流图的,可以用它设计一些状态和各个状态之间的转换条件,然后放在simulink中仿真。
说了这么多,我的手痒起来了,还是动手做吧,^_^。
一.打开simulink,新建一个model(保存为time.mdl),在simulink的左边找到stateflow并选中他,将右边的chart拖入新建的model中,双击这个chart,就出现了stateflow的编辑器,先介绍一下这里面能画的东东(在左边的工具栏上)
1.左边工具栏上第一个图标是方框似的东东,将它拖入编辑器中,就表示一个状态(state),双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):name/%此状态的名称
entry:entryaction%刚转换到此状态时执行entryaction
during:duringaction%在此状态之中时执行duringaction
exit:exitaction%退出此状态时执行exitaction
stateflow真值表高级用法
【实用版】
目录
一、Stateflow简介
二、Stateflow真值表的概念与作用
三、Stateflow真值表的高级用法
四、总结
正文
Stateflow是MATLAB中的一个工具,可以用来模拟和分析复杂的动态系统。通过使用Stateflow,用户可以建立一个状态机模型,并对其进行仿真和分析。Stateflow可以帮助用户解决复杂的逻辑问题,并对系统的行为进行清晰、简洁的描述。
Stateflow真值表(StateflowTruthTable)是用于描述Stateflow状态机模型中各个状态之间转移的一种方法。它可以帮助用户清晰地了解状态机在各个状态下的行为,以及在状态之间如何转移。通过使用Stateflow真值表,用户可以更好地分析和优化状态机模型。
Stateflow真值表除了可以描述状态之间的转移外,还可以用于实现一些高级功能。例如,用户可以使用Stateflow真值表来:
1.建立状态监视器:通过在真值表中添加监视器,用户可以实时监控状态机的运行状态。
2.实现状态拦截器:通过在真值表中添加拦截器,用户可以控制状态
机在特定状态下的转移。
3.进行状态持久化:通过在真值表中添加持久化器,用户可以将状态机的状态信息保存到文件中,以便在后续仿真中使用。
4.实现状态机优化:通过分析Stateflow真值表,用户可以找到状态机中可能存在的性能瓶颈,并进行优化。
stateflow用法
Stateflow是Matlab/Simulink提供的一种建模工具,用于建立离散事件系统(DES)和有限状态机(FSM)模型。下面是Stateflow的一些常见用法:
1.建立状态图:使用Stateflow可以通过绘制状态图来建立系统的状态转换模型。可以使用Stateflow提供的图形化界面来创建状态、转移和条件等元素,也可以使用Matlab代码来编写状态图。
2.定义状态:Stateflow允许用户定义系统的不同状态,并为每个状态定义适当的行为或动作。可以在状态图中添加状态,并为每个状态添加相应的动作。这些动作可以是Matlab代码、Simulink模型或其他Stateflow图形元素。
3.定义转移:使用Stateflow可以定义状态之间的转移条件和动作。可以在状态图中定义转移条件,即当满足特定条件时,系统将从一个状态转移到另一个状态。此外,可以为每个转移定义动作,以在状态转移时执行特定操作。
4.设计层次结构:Stateflow支持层次结构的建模,可以通过创建子状态来实现状态的层次化组织。这使得系统的复杂性得以管理,并可以更好地表达系统的行为。
5.事件触发机制:Stateflow支持事件的触发机制,可以通过发送事件来触发状态转换或执行特定动作。可以在状态图中定义事件,并在转移条件或动作中使用这些事件。
6.运行模拟:Stateflow提供了用于模拟和调试模型的功能。可以通过Matlab/Simulink环境中的模拟器来运行Stateflow模型,并查看状态的变化、转移条件的触发以及动作的执行情况。
摘要:
1.stateflow简介
2.stateflow真值表的概念
3.stateflow真值表的高级用法
4.总结
正文:
Stateflow是一种基于状态机的建模工具,可以用来描述和模拟复杂的系统行为。通过运用状态机原理、流图概念和状态转换图,Stateflow能够对复杂系统的行为进行清晰、简洁的描述。在Simulink环境中,用户可以利用Stateflow实现各个状态之间的切换,以解决复杂的逻辑问题。
Stateflow真值表(TrueTable)是一种用于描述Stateflow模型中各个状态之间逻辑关系的方法。它可以帮助我们更好地理解模型在不同状态下的行为,以及如何控制模型在各个状态之间进行切换。通过创建真值表,我们可以为模型定义一系列输入和输出变量,以及它们在各个状态下的取值范围。
Stateflow真值表除了可以描述模型的基本逻辑关系外,还提供了一些高级功能,如下:
-表达式:在真值表中,我们可以使用MATLAB表达式来描述状态之间的逻辑关系。这使得我们可以在真值表中定义更复杂的逻辑,从而更准确地模
拟现实世界中的系统行为。
-枚举:在定义状态时,我们可以使用枚举类型来简化状态的表示。这有助于减少模型中的状态数量,提高模型的可读性和可维护性。
-共享状态:在多个状态之间共享相同的状态,可以减少模型的复杂性。通过共享状态,我们可以在多个状态之间实现相同的行为,从而简化模型的描述。
stateflow语法
1.Stateflow的定义
2.Stateflow的基本元素
二、Stateflow语法详解
1.状态定义
2.状态转移
3.事件
4.条件
5.初始化
6.操作
三、Stateflow应用实例
1.设计一个简单的计数器
2.设计一个复杂的状态机
四、Stateflow与其他工具的结合
1.Stateflow与Simulink的结合
2.Stateflow与MATLAB的结合
五、Stateflow的高级功能
1.并发状态
2.层次化状态结构
3.状态压缩
4.符号执行
Stateflow是一种基于图形化界面的MATLAB函数,用于描述和仿真复杂的状态机和动态系统。它可以帮助用户创建和编辑图表,以可视化状态转移、事件、条件和操作。Stateflow可以与其他MATLAB工具箱结合使用,如Simulink和SymbolicMathToolbox,以实现更高级的功能。
Stateflow是一种用于描述和仿真复杂状态机和动态系统的图形化界面。用户可以通过拖放组件来创建和编辑Stateflow图表,这些组件包括状态、事件、条件和操作等。Stateflow是基于MATLAB的,因此可以使用MATLAB的丰富函数库来处理数据和实现复杂算法。
在Stateflow中,状态是一个核心概念。状态定义了一个特定时刻系统的状态。状态可以是离散的(如0或1)或连续的(如在某个范围内的值)。
一个经典的stateflow入门例子及总结.pdf
wstateflow总结与分析(我是用的是matlab2009b,也就是matlab7.9版本)
一、什么是stateflow(后面简称sf)
sf集成于simulink中,是针对控制系统的复杂逻辑进行建模与仿真。在matlab
commandwindow(后面简称cw)输入sfnew就可以打开。如下图:
此时打开的是simulink模型,stateflow还需要双击chart图标,以打开集成于simulink的sf。
打开之后,我已经创建了一个模型,表示声音控制灯的开与关。假设灯原来打开,来一
次声音,灯打开(从左向右);再来一次声音,灯关闭(从右向左);。。。。。一直循环。
这是最简单的sf控制模型,当有多个逻辑控制的时候,可以构成很复杂的系统。
附打开的另外两个方法:
①,打开simulink,然后,找到sf模块
②,在cw中输入stateflow,得到下图。便可以打开。
二、简单介绍
编辑状态图
状态图是sf中最基本的。如下所示。
拖动下来以后,可以得到一个状态,上图中的开灯与关灯就是两个状态图,它们表征系统所术语的一个状态。
状态动作:keyword:stateactions
名称与注释,大家都应该知道。关于状态动作,表示表示在着一种状态下,内部的执行命令。假如,每开一次灯,计数一次;灯开着的时候,自动控制空调降温;当灯关闭的时候,关闭
所有的家用电器。那么,就如下图:
这个时候,就完成了开灯时候我们需要做的工作。这儿,为了
表示简单,我用中文解释,实际上都需要使用数学表达式。
基本理论
应用模式:
(1)使用if-else逻辑判断
(2)使用两个或者三个等的状态转换;三个状态的话,注意是否每个状态都能切换到另两个状态。比如下面第一个例子中当switch_on为0的时候在on状态和standby状态都切换到off状态。
(3)StateFlow里面的参数为全局变量,可以多个状态中用。如:调用函数,并行的两个状态模块,一个状态机中变量来控制另一个状态模块中的切换条件。
(4)分层
1)下图中,左边和右边是同时并行(and模式)的两个chart,并行后边框编程虚线;
2)每一层都需要有一个缺省转移的状态(默认状态),用箭头指向该状态。
(5)during和entry
entry使用
如下图中,当前状态为黑色画框的,但是根据默认的状态原因,输出力矩分别为20(图中未显示),200(LowSlipRate中的entry),80(LowSlipRate1中的entry),70
(LowSlipRate1中的during)
During使用
例子(进入一个状态后,下一次还进入这个状态)
在on模块,直接switchon==0就回到off状态;
On模块进入T>160时候,就要,先关闭device,然后开风扇降温到T<65,才回到off状态。
Stateflow函数:T<65;65
去掉红色框中的条件时,温度高了只能先让风扇降温到低温下才能彻底把风扇和device关掉。
三个档位的风扇(三个状态的转换)
Stateflow介绍
创建框图之后,可以将其锁定,具体做法是:
1.选择Edit菜单下的ChartProperties选项打开Chart属性对话框
2.在Editor域里面选择Locked选项。
在matlab窗口中输入sfnew,则出现了带chart的simulink工作界面
Inf代表无穷大
两个chart的并行状态的设置:在Stateflow的空白处,右击鼠标,选择Decomposition-parallel(AND)此时两个状态的边框将变成虚线,并出现边框
状态(state):双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):name/%此状态的名称
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中创建输入参数和输出的参数。
常用的逻辑操作:
After(10,CLK)&&[temp==COLD]与CLK[after(10,CLK)&&temp==COLD]意义相同下边是一个定时器的转换图: