详解Stateflow建模与应用实例.docx

上传人:b****2 文档编号:17078467 上传时间:2023-07-21 格式:DOCX 页数:87 大小:2.18MB
下载 相关 举报
详解Stateflow建模与应用实例.docx_第1页
第1页 / 共87页
详解Stateflow建模与应用实例.docx_第2页
第2页 / 共87页
详解Stateflow建模与应用实例.docx_第3页
第3页 / 共87页
详解Stateflow建模与应用实例.docx_第4页
第4页 / 共87页
详解Stateflow建模与应用实例.docx_第5页
第5页 / 共87页
详解Stateflow建模与应用实例.docx_第6页
第6页 / 共87页
详解Stateflow建模与应用实例.docx_第7页
第7页 / 共87页
详解Stateflow建模与应用实例.docx_第8页
第8页 / 共87页
详解Stateflow建模与应用实例.docx_第9页
第9页 / 共87页
详解Stateflow建模与应用实例.docx_第10页
第10页 / 共87页
详解Stateflow建模与应用实例.docx_第11页
第11页 / 共87页
详解Stateflow建模与应用实例.docx_第12页
第12页 / 共87页
详解Stateflow建模与应用实例.docx_第13页
第13页 / 共87页
详解Stateflow建模与应用实例.docx_第14页
第14页 / 共87页
详解Stateflow建模与应用实例.docx_第15页
第15页 / 共87页
详解Stateflow建模与应用实例.docx_第16页
第16页 / 共87页
详解Stateflow建模与应用实例.docx_第17页
第17页 / 共87页
详解Stateflow建模与应用实例.docx_第18页
第18页 / 共87页
详解Stateflow建模与应用实例.docx_第19页
第19页 / 共87页
详解Stateflow建模与应用实例.docx_第20页
第20页 / 共87页
亲,该文档总共87页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

详解Stateflow建模与应用实例.docx

《详解Stateflow建模与应用实例.docx》由会员分享,可在线阅读,更多相关《详解Stateflow建模与应用实例.docx(87页珍藏版)》请在冰点文库上搜索。

详解Stateflow建模与应用实例.docx

详解Stateflow建模与应用实例

port_label('input',1,'signal');

port_label('output',1,'gain');

port_label('output',2,'saturation');

port_label('output',3,'sample');

port_label('output',4,'error');

image(imread('dianji.jpg'))

第3章Stateflow建模与应用

Stateflow是有限状态机(finitestatemachine)的图形工具,它通过开发有限状态机和流程图扩展了Simulink的功能。

Stateflow使用自然、可读和易理解的形式,可使复杂的逻辑问题变得清晰与简单,并且还与MATLAB\Simulink紧密集成,为包含控制、优先级管理、工作模式逻辑的嵌入式系统设计提供了有效的开发手段,是本书的核心内容之一。

读者在5~8章将看到Stateflow应用于MCU器件的嵌入式开发,尤其显得得心应手,一些采用传统方法难于实现的算法,如果利用Stateflow建模却非常容易。

大到导弹、航空航天器的控制,小到点亮一个发光二极管,Stateflow都非常称职。

Stateflow状态图模型,还可利用StateflowCoder代码生成工具,直接生成C代码。

Stateflow的主要功能包括:

●使用层次化、可并行的、有明确执行语义的元素,来描述复杂的逻辑系统。

●采用流程图定义图形化函数。

●利用真值表实现表格形式的功能。

●使用临时逻辑处理状态转移与事件。

●支持Mealy和Moore有限状态机。

●可集成用户自定义的C代码。

●可用动画的形式显示状态图的仿真运行过程,并可记录数据。

●调试器使用图形化断点进行单步调试,并可观察其中的数据。

本章主要内容:

●Stateflow工作原理与基本概念

●建立Stateflow状态图与流程图

●Stateflow的层次结构与并行机制

●Stateflow应用

3.1Stateflow基本概念

Stateflow对象可分为图形对象与非图形对象。

图形对象有状态、历史节点、迁移、默认迁移、连接节点、真值表、图形函数、EmbeddedMATLAB函数、盒函数、Simulink函数;非图形对象有事件、数据、目标。

本节首先介绍常用的对象:

状态、迁移、数据、事件的概念和使用,连接节点留待3.3节、历史节点留待3.4节,其余对象留待3.5节说明。

Stateflow状态机使用一种基于容器的层次结构管理Stateflow对象,也就是说,一个Stateflow对象可以包含其他Stateflow对象。

最高级的对象是Stateflow状态机,它包含了所有的Stateflow对象,因此也就包含了Simulink中的所有Stateflow状态图,以及数据、事件、目标对象。

同样地,状态图包含了状态、盒函数、函数、数据、事件、迁移、节点与注释事件(noteevents)。

用户可以使用这一系列对象,建立一个Stateflow状态图。

而具体到一个状态,它也可以包含上述的对象。

图3.1.1抽象地说明了这样的关系,而图3.1.2则具体地说明了Stateflow状态机的组成。

图3.1.1Stateflow层次机构(数据字典)

图3.1.2Stateflow状态机的组成

3.1.1状态图编辑器

在Simulink模块库浏览器,找到Stateflow模块,如图3.1.3所示,添加入模型窗口,如图3.1.4所示。

图3.1.3Stateflow模块

用户也可以使用以下命令,建立带有Stateflow状态图的Simulink模型,如图3.1.4所示,同时打开Stateflow模块库,如图3.1.5所示。

>>sf

图3.1.4带有Stateflow状态图的Simulink模型

图3.1.5Stateflow模块库

用户还可以直接使用以下命令,快速建立带有Stateflow状态图的Simulink模型。

>>sfnew

双击Chart模块,打开Stateflow编辑器窗口,如图3.1.6所示,左侧工具栏列出了Stateflow图形对象的按钮。

图3.1.6Stateflow编辑器窗口

3.1.2状态

状态可以理解为事件驱动系统中的模式,可分为激活与非激活状态,而状态是否激活则是由状态图中的事件与条件决定的,若没有预先定义的事件或条件发生,状态将一直保持其原先的激活或非激活状态。

1.状态的层次结构

状态可以包含除了目标(详见第3.6.6节)以外的所有Stateflow对象,所以状态内部可以有其他状态,如图3.1.7所示,处于外层的A称作超状态(或父状态),处于内部的B称作子状态。

每一个状态都有其父状态,图3.1.7中,状态A的父状态就是Stateflow状态图本身。

图3.1.7超状态与子状态

2.状态的横向结构

在Stateflow状态图的顶层或某一超状态下,通常并存有多个状态,它们之间的关系可分为互斥与并行。

(1)互斥状态(OR)

互斥状态的矩形框边缘显示为实线,同一级的互斥状态,至多允许激活一个状态。

如图3.1.8所示的状态图,状态A与状态B是互斥的,它们只能有一个处于激活状态;当状态A被激活时,同样其子状态A1与A2也只能有一个处于激活状态。

图3.1.8互斥状态

(2)并行状态(AND)

并行状态的矩形框边缘显示为虚线,同一级的并行状态,可在同一时刻被激活。

如图3.1.9所示的状态图。

状态A与状态B是并行的,它们可同时处于激活状态;子状态A1与A2也同时处于激活状态,而子状态B1与B2只能有一个处于激活状态。

图3.1.9并行状态

状态层次结构与并行机制的详细概念与应用,见3.4与3.5节。

3.状态标签

状态名仅是状态标签的一部分,完整的标签格式如下,第一行是状态名,以下若干行是各类动作,用户可以设置全部或部分的状态动作,当然也可以不设置任何动作。

name/状态名

entry:

entryactions进入该状态时的动作

during:

duringactions处于该状态时的动作

exit:

exitactions退出该状态时的动作

onevent_name:

onevent_nameactions某事件发生时的动作

bind:

events,data指定需要限制作用范围的事件与数据

①状态名

状态名可由字母、数字、下划线组成,如果状态名后跟随的是回车符,则斜线是可有可无的。

根据Stateflow的分层结构,同级的各个子状态不允许重名,但不同级的状态则不受限制。

图3.1.10所示的Stateflow状态图是有效的,尽管看上去状态C1、C2有重名现象,但在Stateflow分层结构中,它们的全名分别是:

A.On

A.Off

B.On

B.Off

图3.1.10状态名

②状态动作

状态动作如表3.1.1所列。

表3.1.1状态动作类型

动作类型

缩写

说明

entry

en

进入当前状态时的动作

during

du

处于当前状态,并且某事件发生时的动作

Executeswhenthestateisactiveandaspecificeventoccurs

exit

ex

离开当前状态时的动作

bind

约束一个事件或数据,使得仅当前状态及其子状态有权限广播该事件或修改该数据

onevent_name

当前状态接收1次广播事件时的动作

onafter(n,event_name)

当前状态完整接收n次广播事件后的动作

onbefore(n,event_name)

当前状态完整接收n次广播事件前的动作

onat(n,event_name)

当前状态完整接收n次广播事件时的动作

onevery(n,event_name)

当前状态每接收n次广播事件时的动作

每个动作类型,用户可指定多个具体动作,每个动作之间以回车、分号、逗号区隔,动作类型关键词后必须跟随一个半角冒号。

(1)entry动作

关键词为entry(或缩写为en)。

如果用户在状态名后加入斜线,并直接跟随具体动作,则该动作默认为进入动作。

如图3.1.11所示,进入状态A时,y=3,同时又执行y++,最终的结果y=4。

图3.1.11entry动作

(2)during动作

关键词为during(或缩写为du)。

如图3.1.12所示,进入状态A时,y=3,同时不断执行y++。

若求解器的定点步长取0.2,仿真时长取2,则最终的结果y=13。

图3.1.12during动作

(3)exit动作

关键词为exit(或缩写为ex)。

如图3.1.13所示,系统处于状态A,当A的激活时间达到5个仿真步长,退出状态A,进入状态B,最终的结果y=4,如图3.1.14所示。

图3.1.13exit动作

图3.1.14输出结果

(4)广播事件动作

表3.1.1所列的广播事件动作,能实现各种的事件触发。

以单次广播事件动作为例,关键词为onevent_name,其中event_name表示某一广播事件名,事件名应是唯一的。

如图3.1.15所示,系统处于状态A,当检测到事件stop,立即执行c()。

图3.1.15广播事件动作

(5)bind动作

关键词为bind。

如图3.1.16所示,变量y、事件start被绑定在状态A,这表示仅有A状态及其子状态有权限修改变量y并广播事件start,其他状态B能够读取变量y、监听到事件start,但无权修改变量y、广播事件start。

图3.1.16bind动作

若运行该状态图,系统提示变量y仅能由状态A及其内部的状态迁移修改,事件start仅能在状态A。

图3.1.17错误提示

与其他动作不同,bind动作不需要判断当前状态是否已激活,也就是说它在整个Stateflow状态图范围内都是有效的,因此不同状态不允许约束同一个变量与事件。

如图3.1.18所示,状态A、B同时约束了变量y,系统提示这是不允许的。

图3.1.18无效的bind动作

图3.1.19错误提示

3.1.3迁移

1.迁移

Stateflow状态图使用一条单向箭头曲线表示迁移,它将两个图形对象连接起来,多数情况下,迁移是指系统从源状态向目标状态的转移。

在迁移曲线上加上标签,可以指定系统在何种条件下从源状态向目标状态转移。

如图3.1.20所示,当系统处于状态A1时间达到1秒,即向状态A2迁移。

图3.1.20状态迁移

2.默认迁移

默认迁移是一种特殊的迁移形式,它没有源对象。

用于指定同一级有多个互斥状态并存时,首先激活的状态。

某些情况下,默认迁移也可以加入标签,限制其所指向目标状态的激活。

如图3.1.21所示,状态A1与A2是互斥的,当它们的父状态A激活时,状态A1也同时激活。

图3.1.21默认迁移

3.迁移标签

迁移标签的完整格式如下,它可用于一般迁移与默认迁移,如图3.1.22所示。

event[condition]{condition_action}/transition_action

图3.1.22完整的迁移标签

各字段的意义如表3.1.2所示:

表3.1.2迁移标签字段

标签字段

说明

event

引发迁移的事件

[condition]

条件动作与迁移的发生条件

{condition_action}

当条件为真时,执行的动作

/transition_action

发生迁移,进入目标状态前所执行的动作

1事件

指定迁移的触发事件。

如果用户另行指定了触发条件,则当条件为真,且发生该触发事件时,即发生迁移。

这是个可选项,如果用户不指定触发事件,则任何事件都能够引发该迁移。

多个触发事件之间使用逻辑或运算符“|”分隔。

如图3.1.20,当条件after(1,sec)为真时,触发了迁移,系统状态从A1变成A2。

②条件

条件是一个布尔表达式,当它为真时,一旦发生指定的触发事件,则发生迁移。

条件表达式的前后必须使用方括号“[]”包围。

如图3.1.23所示,当条件[y>=3]为真时,发生迁移。

③条件动作

当条件表达式为真时,立刻执行条件动作。

若事先未指定条件,系统则假设条件为真,并执行该条件动作。

如图3.1.23所示,当条件[y>=3]为真,条件动作{y=10}立刻执行。

④迁移动作

当迁移目标有效时,执行迁移动作。

若迁移标签由多个字段组成,则当整个标签有效时,执行迁移动作。

如图3.1.23所示,当条件[y>=3]为真,且目标状态B有效时,发生迁移,并执行迁移动作z=20。

运行结果如图3.1.24所示:

图3.1.23迁移条件与动作

图3.1.24输出结果

4.迁移有效条件

对于非默认的迁移,当源对象处于激活状态的且迁移标签有效时,发生迁移;对于默认迁移,当其父状态被激活时,发生迁移。

表3.1.3列出了迁移标签的有效条件,用户可以根据需要,选择性地输入迁移标签的部分或全部字段。

表3.1.3迁移标签有效条件

标签内容

标签有效条件

仅事件

该事件发生

事件与条件

该事件发生及条件为真

仅条件

任何事件发生及条件为真

仅行动

任何事件发生

任何事件发生

3.1.4数据与事件

图3.1.1所示的数据字典中,数据与事件是合并在一个圆圈内的,这表明他们有相似之处,这里合并介绍。

1.数据

数据是非图形的对象,它有一个很重要的特性:

作用域,用户在使用数据时必须明确定义该特性。

根据作用域的不同,数据可分为:

●Stateflow状态图本地数据(Local);

●自外部Simulink模块输入的数据(InputfromSimulink);

●向外部Simulink模块输出的数据(OutputfromSimulink);

●临时数据

●定义在MATLAB工作空间的数据;

●常数(Constant);

●向Simulink模型与Stateflow状态图外部的目标(代码)导出的数据;

●自Simulink模型与Stateflow状态图外部的源代码导入的数据。

数据的简单使用,见3.2.4小节。

2.事件

事件也是非图形的对象,它驱动着整个Stateflow状态图的运行。

如同数据,事件同样有它的作用域,

根据作用域的不同,事件可分为:

●Stateflow状态图本地事件;

●自外部Simulink模块输入的事件;

●向外部Simulink模块输出的事件;

事件的简单使用,见3.2.4;事件的分类,见3.5各小节。

3.动作

Stateflow状态图支持状态动作、条件动作、迁移动作,已在上文做了简要介绍。

这里所说的动作可以是一个函数调用,广播事件,数学运算等等。

例如:

函数调用:

ml.log10(x);……

事件广播:

Start;Stop;……

数学运算:

x=1;y=2;z=x+y;……

3.1.5对象的命名规则

以上简要介绍了常用对象的概念,用户可以使用任意的字母、数字与下划线的组合为这些对象命名,但名称不能以数字开头,中间也不能有空格。

由于Real-TimeWorkshop代码生成工具的限制,对象的名称不能超过一定长度,用户可以在模型参数设置对话框的Real-TimeWorkshop→Symbols面板进行修改,默认的长度是31,最大的长度是256,如图3.1.25所示。

图3.1.25设置对象名称的长度

表3.1.4列出了一些关键字,它们是Stateflow动作语言的组成部分,因此是不能用来为对象命名的。

表3.1.4关键字

关键字

在Stateflow中的用途

hasChanged,hasChangedFrom,hasChangedTo

变更监测

complex,imag,real

复数数据

boolean,double,int8,int16,int32,

single,uint8,uint16,uint32

数据类型

cast,fixdt,type

数据类型操作

send

明确事件

change,chg,tick,wakeup

隐含事件

false,inf,true,t

标志位

matlab,ml

MATLAB函数与数据

bind,du,during,en,entry,ex,exit,on

状态动作

in

状态激活

after,at,before,every,sec,temporalCount

时间逻辑

3.2Stateflow状态图

长跑比赛时,通常要用到以圈计时的方法,它的意思是:

计时器初次开启时,2组数码管皆清零;运动员出发时,按下Start按钮开始计时,数码管1显示实时时间;第一次回到起点,表示跑完一圈,这时按下LAP按钮,数码管2显示当前的时间值,表示一圈所花费的时间,但比赛仍在进行,因此计时器仍然在计时;再次按下Start按钮,2组数码管同时显示最后的时间;第三次按下Start按钮,2组数码管清零,回到初始状态。

本节以此为例,说明Stateflow状态图的建立过程。

3.2.1状态

1.添加状态

新建一个空白的Stateflow模型,单击状态按钮,并在Stateflow窗口的适当位置再次单击,加入一个状态,如图3.2.1所示。

在加入之前,用户可随时按下键盘的ESC键,或再次单击按钮,取消添加。

图3.2.1添加状态

2.状态命名

在状态矩形框左上角的编辑提示符后,输入状态的名称,如stop,如图3.2.2所示。

若需要修改状态名,可将鼠标移至名称附近,待光标变成编辑样式时,再单击修改,如图3.2.3所示。

图3.2.2状态命名图3.2.3状态名修改

3.添加子状态

将鼠标移至状态矩形框4个角落的任意一个,调整其大小,如图3.2.4所示。

图3.2.4调整状态框

再按步骤①、②,添加状态Reset、Finished,放置在状态Stop的矩形框内,这时Stop为超状态,Reset、Finished为子状态,如图3.2.5所示。

图3.2.5父状态与子状态

3.2.2迁移

1.添加迁移

将鼠标移至源状态矩形框的边缘,当光标变成十字时,如图3.2.6所示,按下左键并拖向目标状态的边缘,然后释放,如图3.2.7所示,即添加了一个迁移。

图3.2.6迁移起点图3.2.7迁移终点

2.添加默认迁移

单击

,将鼠标移至默认状态矩形框的水平或垂直边缘,如图3.2.8所示。

图3.2.8选择默认迁移

再次单击,即添加了一个默认迁移,如图3.2.9所示。

图3.2.9添加默认迁移

由于Stop是父状态,还需要针对其中的子状态,设置默认迁移,如图3.2.10所示,关于Stateflow的层次结构,详见3.4节。

图3.2.10添加子状态默认迁移

3.迁移变更

鼠标放置在迁移的起点或终点,当光标变成圆圈时(图3.2.11),按住鼠标左键,可将该端点移至其他状态,如图3.2.12所示。

图3.2.11开始迁移变更图3.2.12完成迁移变更

将默认迁移的起点移至某一状态,即转换为一般迁移;将一般迁移的起点悬空,即转化为默认迁移,如图3.2.13所示,若迁移终点悬空,则该迁移无效,如图3.2.14所示。

图3.2.13迁移起点变更图3.2.14迁移终点变更

4.迁移标签

新建的迁移标签不包含任何文字信息,用户单击迁移曲线一次,曲线上方显示“?

”如图3.2.15所示:

图3.2.15添加迁移标签

将鼠标移至“?

”附近,再次单击,当显示编辑光标时,可编辑迁移标签,如图3.2.16所示。

图3.2.16编辑迁移标签

完成编辑后,将鼠标放在标签的任意位置,按住左键并拖动,调整标签的位置,如图3.2.17所示。

图3.2.17移动迁移标签

3.2.3计时器状态图

根据以圈计时的特点,整个系统可分为2个父状态:

停止与运行。

停止状态包含2个子状态:

计时器清零Reset、计时器停止Finished;运行状态也包含2个子状态:

计时器运行Running、以圈计时LAP。

如图3.2.18所示:

图3.2.18添加4个状态

再根据各状态之间的联系,添加默认迁移、迁移以及迁移标签,如图3.2.19所示。

图中的迁移标签start表示按下start按钮这个事件,而LAP则表示按下LAP按钮。

图3.2.19添加迁移及迁移标签

3.2.4数据与事件

以圈计时需要2组数码管显示当前以及记录的分、秒、百分秒,另有两个按钮,为此需要添加6个数据与2个事件。

数据是向外输出的,而事件是自外输入的。

添加数据或事件的方法有两种:

使用菜单项Add或使用模型浏览器(ModelExplorer)。

前者的优势是添加方便,但菜单项仅提供了添加功能,无法通过菜单删除已添加的数据或事件,因此我们推荐用户使用模型浏览器。

为了照顾读者的不同需求,本文仍旧介绍两种添加方式。

1.菜单项

在Stateflow编辑器窗口,选择菜单项Add→Data→OutputtoSimulink,如图3.2.20所示。

图3.2.20添加输出数据

在Name栏填入输出变量名min,另外用户在scope栏还可以再次决定变量的作用域,如图3.2.21所示。

图3.2.21修改数据名及作用范围

2.模型浏览器

在Stateflow状态图的顶层(即不选中任何图形对象),选择菜单项Tools→Explore,或直接按下Stateflow编辑器窗口的工具栏按钮

,打开模型浏览器,并确认已选中左侧模型结构图中的Chart节点,如图3.2.22所示。

图3.2.22模型浏览器

在浏览器窗口的工具栏找到按钮

,添加一个数据/事件或删除对应项。

在中部窗口选中数据/事件的条目,右侧窗口即显示它的属性,如图3.2.23所示。

与菜单项方法不同的是,使用浏览器添加的数据/事件,默认的作用域是本地(Local),用户需要手动修改为外部输入或外部输出。

图3.2.23利用模型浏览器修改数据

对于事件,用户还需指定它的触发方式,Rising表示上升沿、Failing表示下降沿,而Either表示上升或下降沿皆可触发,本例的两个输入事件start与LAP皆选用Either方式触发,如图3.2.24所示。

图3.2.24利用模型浏览器修改事件

有多个数据或事件时,用户还可以指定它们的端口号,合理地排列这些端口,将有利于以后的Simulink模块连线。

如图3.2.25所示,是完整的数据与事件列表。

图3.2.25数据与事件列表

3.2.5动作

上文提到,显示时间值可以定义为状态动作,也可以定义为迁移动作。

为不失一般性,本小节分别说明这两种动作的定义方法。

计时器复位时,2组数码管皆应清零,因此设置子状态Reset的进入动作为:

Reset

entry:

min=0;sec=0;percent=0;

minbuf=0;secbuf=0;percentbuf=0;

按下LAP按钮或再次按下start时,数码管2都必须显示当前时刻,因此设置子状态LAP与Finis

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2