详解Stateflow建模与应用实例



《详解Stateflow建模与应用实例》由会员分享,可在线阅读,更多相关《详解Stateflow建模与应用实例(88页珍藏版)》请在装配图网上搜索。
1、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 是有限状态机( finite state machine )的图形工具,它通过开发 有限状态机和流程图扩展了 Simulink 的功能。 Stateflow 使用自然、可读和易理
2、解 的形式,可使复杂的逻辑问题变得清晰与简单,并且还与 MATLAB\Simulink 紧密集 成,为包含控制、优先级管理、工作模式逻辑的嵌入式系统设计提供了有效的开发 手段,是本书的核心内容之一。读者在 5~8章将看到Stateflow 应用于MCUIM牛的 嵌入式开发,尤其显得得心应手,一些采用传统方法难于实现的算法,如果利用 Stateflow 建模却非常容易。大到导弹、航空航天器的控制,小到点亮一个发光二 极管, Stateflow 都非常称职。 Stateflow 状态图模型,还可利用 Stateflow Coder 代码生成工具,直接生成 C代码。 Stateflo
3、w 的主要功能包括: 使用层次化、可并行的、有明确执行语义的元素,来描述复杂的逻辑系统。 采用流程图定义图形化函数。 利用真值表实现表格形式的功能。 使用临时逻辑处理状态转移与事件。 支持Mealy和Moore有限状态机。 可集成用户自定义的 C代码。 可用动画的形式显示状态图的仿真运行过程,并可记录数据。 调试器使用图形化断点进行单步调试,并可观察其中的数据。 本章主要内容: Stateflow 工作原理与基本概念 建立 Stateflow 状态图与流程图 Stateflow 的层次结构与并行机制 Stateflow 应用 3.1Stateflow 基本概念 S
4、tateflow 对象可分为图形对象与非图形对象。 图形对象有状态、历史节点、迁移、默认迁移、连接节点、真值表、图形函数、 EmbeddedMATLAB0数、盒函数、Simulink函数;非图形对象有事件、数据、目标。 本节首先介绍常用的对象:状态、迁移、数据、事件的概念和使用,连接节点留待 3.3节、历史节点留待 3.4节,其余对象留待 3.5节说明。 Stateflow 状态机使用一种基于容器的层次结构管理 Stateflow 对象,也就是 说,一个Stateflow 对象可以包含其他 Stateflow 对象。 最高级的对象是 Stateflow 状态机,它包含了所有的 St
5、ateflow 对象,因此也 就包含了 Simulink中的所有Stateflow 状态图,以及数据、事件、目标对象。 同样地,状态图包含了状态、盒函数、函数、数据、事件、迁移、节点与注释 事件(note events )。用户可以使用这一系列对象,建立一个 Stateflow 状态图。 而具体到一个状态,它也可以包含上述的对象。 图3.1.1抽象地说明了这样的关系,而图 3.1.2则具体地说明了 Stateflow 状 态机的组成。 状态机 迁移 节点 节点 数据/ 事件 数据/ 事件 数据/ 事件 迁移 目标 标注 状态/ 盒函数/ 函数 标注
6、11 图3.1.1Stateflow 层次机构(数据字典) Ejie drt Wew SinouUttwi- Fsirmsrt Icrals Jdelp 状态机 状态块 ConESant Ctiart 流程图,状强图 Sine Wavfl CMrtl 身 [nkOKcmJ: {3=0J 图3.1.2 Stateflow 状态机的组成 3.1.1状态图编辑器 在Simulink模块库浏览器,找到 Stateflow 型窗口,如图3.1.4所示。 模块,如图3.1.3所示,添加入模 Simuhnk Design Verifier
7、 Simulink Extras + Simulink VerifieatiDn and Vaidation Stateftow System Identificatio-n IbDlbox Target Support Radag Target for Microchip (Till) dsPIC Wh-icte Network 的olbox Video and Image Processing Blockset * S + ! + 图 3.1.3 Stateflow 模块 用户也可以使用以下命令, 建立带有Stateflow 状态图的Simulink模型
8、,如图 3.1.4所示,同时打开 Stateflow 模块库,如图3.1.5所示。 >>sf 图3.1.4 带有Stateflow 状态图的Simulink模型 Chart Examples (Double click to open the Truth Table Stateflow Examples Library) 图 3.1.5 Stateflow 模块库 用户还可以直接使用以下命令,快速建立带有Stateflow状态图的Simulink模 型。 >>sfnew 双击Chart模块,打开Stateflow 编辑器窗口,如图 3.1.6所示,左侧工具栏 列出了
9、Stateflow 图形对象的按钮。 File Edit View Simulation lools Format Add Patterns Help , 皿闫昌区、< 状套 * 历史节点 . 球认状意迁移 • 连接节点 ■ 真值表 W 图形函裁 . Embedded MATLAB函数 4 金函数 SiEiiink函敷调用 • 缩放 二] 寸 ► -ll ■ 陶图醴圜•依。& 图3.1.6 Stateflow 编辑器窗口 3.1.2状态 状态可以理解为事件驱动系统中的模式,可分为激活与非激活状态,而状态是 否激活则是由状态图中的事件与条件决定的,若
10、没有预先定义的事件或条件发生, 状态将一直保持其原先的激活或非激活状态。 1 .状态的层次结构 状态可以包含除了目标(详见第 3.6.6节)以外的所有 Stateflow 对象,所以 状态内部可以有其他状态, 如图3.1.7所示,处于外层的A称作超状态(或父状态), 处于内部的B称作子状态。 每一个状态都有其父状态,图 3.1.7中,状态A的父状态就是 Stateflow 状态 图本身。 图3.1.7 超状态与子状态 2 .状态的横向结构 在Stateflow 状态图的顶层或某一超状态下,通常并存有多个状态,它们之间 的关系可分为互斥与并行。 (1)互斥状态(OR 互斥
11、状态的矩形框边缘显示为实线,同一级的互斥状态,至多允许激活一个状 态。如图3.1.8所示的状态图,状态 A与状态B是互斥的,它们只能有一个处于激 活状态;当状态 A被激活时,同样其子状态 A1与A2也只能有一个处于激活状态。 A1 A2 图3.1.8互斥状态 (2)并行状态(AND 并行状态的矩形框边缘显示为虚线, 同一级的并行状态,可在同一时刻被激活。 如图3.1.9所示的状态图。状态 A与状态B是并行的,它们可同时处于激活状态; 子状态A1与A2也同时处于激活状态, 而子状态B1与B2只能有一个处于激活状态。 Ai fB [Bl A2 图 3.1.9
12、并行状态 状态层次结构与并行机制的详细概念与应用,见 3.4 与 3.5 节。 3 .状态标签 状态名仅是状态标签的一部分,完整的标签格式如下,第一行是状态名,以下 若干行是各类动作,用户可以设置全部或部分的状态动作,当然也可以不设置任何 动作。 name/ entry: entry actions during: during actions 状态名 进入该状态时的动作 处于该状态时的动作 exit: exit actions on event name: on event name actions bind: events, data 退出该状态时的
13、动作 某事件发生时的动作 指定需要限制作用范围的事件与数据 ①状态名 状态名可由字母、数字、下划线组成,如果状态名后跟随的是回车符,则斜线 是可有可无的。根据 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状态动作类型 动作类型 缩写
14、说明 entry en :进入当前状态时的动作 during du 处于当前状态,并且某事件发生时的动作 Executes when the state isactive and a specific eventoccurs exit ex 离开当前状态时的动作 bind 无 约—个事件或数据,使得仅当前状态及 其子状态有权限J、.播该事件或修改该数据 on event_name 无 当前状态接收1次广播事件时的动作 : on after(n,event_name) 无 [当前状态完整接收 n次广播事件后的动作[ on before(n,event_nam
15、e) 无 当前状态完整接收 n次广播事件前的动作 on at(n, event_name) 无 [当前状态完整接收 n次广播事件时的动作「 on every(n,event_name) 无 当前状态每接收n次广播事件时的动作 每个动作类型,用户可指定多个具体动作,每个动作之间以回车、分号、逗号 区隔,动作类型关键词后必须跟随一个半角冒号。 ⑴entry 动作 关键词为entry (或缩写为en)。如果用户在状态名后加入斜线,并直接跟随具 体动作,则该动作默认为进入动作。如图 3.1.11所示,进入状态 A时,y=3,同时 又执行y++,最终的结果y=4。 图
16、3.1.11 entry 动作 (2) during 动作 关键词为during (或缩写为du)。如图3.1.12所示,进入状态 A时,y=3,同 时不断执行y++。若求解器的定点步长取 0.2 ,仿真时长取2,则最终的结果y=13o A • en:y=3; du:y++; 图 3.1.12 during 动作 ⑶exit 动作 关键词为exit (或缩写为ex)。如图3.1.13所示,系统处于状态 A,当A的激 活时间达到5个仿真步长,退出状态 A,进入状态B,最终的结果y=4,如图3.1.14 所示。 ,en:y=1; du:y++; ex:y=y-1; X af
17、ter(5,tick) 图 3.1.13 exit 动作 图3.1.14输出结果 (4)广播事件动作 表3.1.1所列的广播事件动作,能实现各种的事件触发。 以单次广播事件动作为例,关键词为 on event_name ,其中event_name表示某 一广播事件名,事件名应是唯一的。如图 3.1.15所示,系统处于状态 A,当检测到 事件stop ,立即执行c()。 en:y=1; du:y++; on stop:c(); 图3.1.15广播事件动作 ⑸bind 动作 关键词为bind。如图3.1.16所示,变量y、事件start被绑定在状态 A,这表 示仅
18、有A状态及其子状态有权限修改变量 y并广播事件start ,其他状态B能够读 取变量V、监听到事件start,但无权修改变量 v、广播事件start 。 A en:y=1; du:y++; bind:y;start; en:y=1;start; 图 3.1.16 bind 动作 若运行该状态图,系统提示变量 y仅能由状态A及其内部的状态迁移修改,事 件start仅能在状态Ao View Font Size Message Source Reported By Summify ♦ Parse Error B Stateflow Data V 仔24〕can be mo
19、dified only in states and transition... j ■ Parse Error B Stateflow Event start (*ZS1) can be broadcast only in states and ■ Parse Error state Parse ♦ Model error Unknown Simulink Event start (#29) can be broadcast onty in stales 曰nd tirans.. 。staite/Chart.B Daita 9 y| 024) can be n
20、ullified only xxi 马七aEe■耳 and tranaiVxana contained in to which i& is bound (*.g. f (819) > Open 曲 口。* 图3.1.17错误提示 与其他动作不同,bind动作不需要判断当前状态是否已激活,也就是说它在整 个Stateflow 状态图范围内都是有效的,因此不同状态不允许约束同一个变量与事 件。 如图3.1.18所示,状态 A B同时约束了变量y,系统提示这是不允许的。 i eny=1; du:y++; bind:y; X B bmd:y; 图3.1.18 无效的bind动
21、作 View Font Size Message Source Reported By Sum限ry il ■■■■■■!■■ ta ■■■■■・■1・4 ■ KI ■ Ki ■■■■■(■■ la ■■■■ l・a ■ Bl ■ KI ■ Ki ■■■■■■■■■■”!■ 1 1・ 1 ■・1■■■■ Bi ■■■■■ !■ ■■■ 1 KB ■ l・■■■■■■■■ Bi ■■■- 1 1■ 1 Bi ■■■ 1 ■ H ■■■ KB “■■■ Bl ■■■■ Bi 1 ■■■■■!■■■■■■!■■ L・■■ KI 1 ■■ 1 Bi ■ ■■■■!■■■■ liB 1 ■■ 1
22、1 量 Parse Error y Stateflaw Multiple startts A f*19] and B (*20) are bath bound to y (#23}. This is iI ■ ■■wiiwiiniHii ■■■■■■■■■■■ mmiiHimi ■■■■■■■■■■■ iMinmimi ■■■■■■■■■■ ■■ammiiwirKiiKim ■■■■■■■■■■■■mmiiBi in ■■■■■■■■■■■■■■■■■■■ ■■■ iwirnmiHiiBamiiBi ■■■ nitBiiKimiHiiBaiBai ■■■ ar ・ Parse E/ror
23、 $1 Parie ■ Mdel er... Unknowi Slmullnik Multiple states A |*19] and B (#20) are both bound to y [*231, This hs ..r 9 sl/Charty HuItiplQ1 fl-tates A -iHS) and B j tS0 i ari bsth bound to y 3储卜-This is not allQ^red 图3.1.19错误提示 3.1.3迁移 1 .迁移 Stateflow 状态图使用一条单向箭头曲线表示迁移,它将两个图形对象连接起 来,多数情况下,迁移
24、是指系统从源状态向目标状态的转移。 在迁移曲线上加上标签, 可以指定系统在何种条件下从源状态向目标状态转移。 A1 after(1,sec) A2 如图3.1.20所示,当系统处于状态 A1时间达到1秒,即向状态 A2迁移。 图3.1.20状态迁移 2 .默认迁移 默认迁移是一种特殊的迁移形式,它没有源对象。用于指定同一级有多个互斥 状态并存时,首先激活的状态。 某些情况下,默认迁移也可以加入标签,限制其所指向目标状态的激活。 如图3.1.21所示,状态A1与A2是互斥的,当它们的父状态 A激活时,状态 A1也同时激活。 图3.1.21 默认迁移 3 .迁移
25、标签 迁移标签的完整格式如下,它可用于一般迁移与默认迁移,如图 3.1.22所示。 event[condition]{condition_action}/transition_action 图3.1.22完整的迁移标签 各字段的意义如表 3.1.2所示: 表3.1.2迁移标签字段 标签字段 说明 event 引发迁移的事件 [condition] 条件动作与迁移的发生条件 {condition_action} 当条件为真时,执行的动作 「 /transition_action 发生迁移,进入目标状态前所执行的动作 ①事件 指定迁移的触发事件。如果用
26、户另行指定了触发条件,则当条件为真,且发生 该触发事件时,即发生迁移。这是个可选项,如果用户不指定触发事件,则任何事 件都能够引发该迁移。多个触发事件之间使用逻辑或运算符“ |”分隔。 如图3.1.20 ,当条件after(1,sec) 为真时,触发了迁移,系统状态从 A1变成 A2。 ②条件 条件是一个布尔表达式,当它为真时,一旦发生指定的触发事件,则发生迁移。 条件表达式的前后必须使用方括号“ 门”包围。 如图3.1.23所示,当条件[y>=3 ]为真时,发生迁移。 ③条件动作 当条件表达式为真时,立刻执行条件动作。若事先未指定条件,系统则假设条 件为真,并执行该条
27、件动作。 如图3.1.23所示,当条件[y>=3 ]为真,条件动作{ y=10 }立刻执行。 ④迁移动作 当迁移目标有效时,执行迁移动作。若迁移标签由多个字段组成,则当整个标 签有效时,执行迁移动作。 如图3.1.23所示,当条件[y>=3 ]为真,且目标状态 B有效时,发生迁移,并 执行迁移动作z=20。运行结果如图3.1.24所示: 图3.1.23迁移条件与动作 Chart 图3.1.24输出结果 4 .迁移有效条件 对于非默认的迁移,当源对象处于激活状态的且迁移标签有效时,发生迁移; 对于默认迁移,当其父状态被激活时,发生迁移。 表3.1.3列出
28、了迁移标签的有效条件,用户可以根据需要,选择性地输入迁移 标签的部分或全部字段。 表3.1.3迁移标签有效条件 标签内容 标签功效条件 仅事件 r该事件发生 事件与条件 该事件发生及条件为真 仅条件 任何事件发生及条件为真 仅行动 [任何事件发生 空 「任何事件发生 3.1.4 数据与事件 图 3.1.1 所示的数据字典中,数据与事件是合并在一个圆圈内的,这表明他们 有相似之处,这里合并介绍。 1. 数据 数据是非图形的对象,它有一个很重要的特性:作用域,用户在使用数据时必 须明确定义该特性。 根据作用域的不同,数据可分为: Stateflow 状
29、态图本地数据( Local ) ; 自外部 Simulink 模块输入的数据( Input from Simulink ) ; 向外部 Simulink 模块输出的数据( Output from Simulink ) ; 临时数据 定义在MATLAB:作空间的数据; 常数( Constant ) ; 向 Simulink 模型与 Stateflow 状态图外部的目标(代码)导出的数据; 自 Simulink 模型与 Stateflow 状态图外部的源代码导入的数据。 数据的简单使用,见 3.2.4 小节。 2. 事件 事件也是非图形的对象,它驱动着整个 Stateflow 状
30、态图的运行。如同数据, 事件同样有它的作用域, 根据作用域的不同,事件可分为: Stateflow 状态图本地事件; 自外部 Simulink 模块输入的事件; 向外部 Simulink 模块输出的事件; 事件的简单使用,见 3.2.4 ;事件的分类,见 3.5 各小节。 3. 动作 Stateflow 状态图支持状态动作、条件动作、迁移动作,已在上文做了简要介 绍。这里所说的动作可以是一个函数调用,广播事件,数学运算等等。 例如: 函数调用: ml.log10(x); 1。3 o 事件广播:Start;Stop; 数学运算:x=1;y=2;z=x+y;
31、 3.1.5对象的命名规则 以上简要介绍了常用对象的概念,用户可以使用任意的字母、数字与下划线的 组合为这些对象命名,但名称不能以数字开头,中间也不能有空格。 由于Real-Time Workshop代码生成工具的限制,对象的名称不能超过一定长度, 用户可以在模型参数设置对话框的 Real-Time Workshop —Symbols面板进行修改, 默认的长度是31,最大的长度是 256,如图3.1.25所示。 Auto-generated identifier naming rules Maximum identifier length: 31 图3.1.25设置对象名称的长度
32、 表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
33、 隐含事件 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显示实时时 14 o 间;第一次回到起点,表示跑完一圈,这时按下 L
34、AP按钮,数码管2显示当前的时 间值,表示一圈所花费的时间,但比赛仍在进行,因此计时器仍然在计时;再次按 下Start按钮,2组数码管同时显示最后的时间;第三次按下 Start按钮,2组数码 管清零,回到初始状态。本节以此为例,说明 Stateflow 状态图的建立过程。 3.2.1状态 1 .添加状态 新建一个空白的 Stateflow 模型,单击状态按钮,并在 Stateflow 窗口的适当 位置再次单击,加入一个状态,如图 3.2.1所示。 在加入之前,用户可随时按下键盘的 ESC键,或再次单击按钮,取消添加。 ]固圉 19 图3.2.2 状态命名 3.添加
35、子状态 图3.2.3 状态名修改 图3.2.1 添加状态 2 .状态命名 在状态矩形框左上角的编辑提示符后,输入状态的名称,如 stop ,如图3.2.2 所示。若需要修改状态名,可将鼠标移至名称附近,待光标变成编辑样式时,再单 击修改,如图3.2.3所示。 Stool 将鼠标移至状态矩形框 4个角落的任意一个,调整其大小,如图 3.2.4所示。 图3.2.4调整状态框 再按步骤①、②,添加状态 Reset、Finished ,放置在状态Stop的矩形框内, 这时Stop为超状态,Reset、Finished 为子状态,如图 3.2.5所示。 图3.2.
36、5 父状态与子状态 3.2.2迁移 1 .添加迁移 将鼠标移至源状态矩形框的边缘,当光标变成十字时,如图 3.2.6所示,按下 左键并拖向目标状态的边缘,然后释放,如图 3.2.7所示,即添加了一个迁移。 图3.2.6迁移起点 图3.2.7迁移终点 2 .添加默认迁移 单击 将鼠标移至默认状态矩形框的水平或垂直边缘,如图 3.2.8所示。 画一]E亚国一 图3.2.8选择默认迁移 再次单击,即添加了一个默认迁移,如图 3.2.9所示。 图3.2.9添加默认迁移 由于Stop是父状态,还需要针对其中的子状态,设置默认迁移,如图 3.2.10
37、 所示,关于Stateflow 的层次结构,详见 3.4节。 图3.2.10添加子状态默认迁移 3.迁移变更 鼠标放置在迁移的起点或终点,当光标变成圆圈时(图 键,可将该端点移至其他状态,如图 3.2.12所示。 3.2.11 ),按住鼠标左 图3.2.11 开始迁移变更 将默认迁移的起点移至某一状态, 即转换为一般迁移; 将一般迁移的起点悬空, 即转化为默认迁移,如图3.2.13所示,若迁移终点悬空,则该迁移无效,如图3.2.14 所示。 图3.2.13迁移起点变更 图3.2.14迁移终点变更 4.迁移标签 新建的迁移标签不包含任何文字信息,用户单击
38、迁移曲线一次,曲线上方显示 7 ”如图3.2.15所示: 图3.2.15添加迁移标签 将鼠标移至7 附近,再次单击,当显示编辑光标时,可编辑迁移标签,如图 3.2.16 所示。 图3.2.16编辑迁移标签 完成编辑后,将鼠标放在标签的任意位置,按住左键并拖动,调整标签的位置, 如图3.2.17所示。 图3.2.17移动迁移标签 21 3.2.3计时器状态图 根据以圈计时的特点,整个系统可分为 2个父状态:停止与运行。停止状态包 含2个子状态:计时器清零 Reset、计时器停止Finished ;运行状态也包含 2个子 状态:计时器运行 Ru
39、nning、以圈计时LAR如图3.2.18所示: 图3.2.18 添加4个状态 再根据各状态之间的联系,添加默认迁移、迁移以及迁移标签,如图 3.2.19所 示。图中的迁移标签 start表示按下start按钮这个事件,而 LAP则表示按下LAP 按钮。 图3.2.19添加迁移及迁移标签 Running 3.2.4数据与事件 以圈计时需要2组数码管显示当前以及记录的分、秒、百分秒,另有两个按钮, 为此需要添加6个数据与2个事件。数据是向外输出的,而事件是自外输入的。 添加数据或事件的方法有两种:使用菜单项 Add或使用模型浏览器( Model Explorer )。
40、前者的优势是添加方便,但菜单项仅提供了添加功能,无法通过菜单 删除已添加的数据或事件,因此我们推荐用户使用模型浏览器。 为了照顾读者的不同需求,本文仍旧介绍两种添加方式。 1 .菜单项 在 Stateflow 编辑器窗口,选择菜单项 Add— Data 一 Output to Simulink ,如 图3.2.20所示。 File fdit View ^imul^tion Tcoh Format Add Patterns Help Evant •蒙弱@•熊⑥• RarW Sture Mcmoryi.i tocal... ]npuf from $imuM J Oidputt
41、o Siirnulinki.u 卜 cn$tant.., Pairameter.z.. 画刽色楣I 图3.2.20添加输出数据 在Name栏填入输出变量名 min,另外用户在scope栏还可以再次决定变量的作 用域,如图3.2.21所示。 图3.2.21修改数据名及作用范围 2 .模型浏览器 在Stateflow 状态图的顶层(即不选中任何图形对象),选择菜单项 Tools 一 Explore ,或直接按下 Stateflow 编辑器窗口的工具栏按钮 虽,打开模型浏览器, 并确认已选中左侧模型结构图中的 Chart节点,如图3.2.22所示。 图3.2.
42、22模型浏览器 在浏览器窗口的工具栏找到按钮 服3、.与* ,添加一个数据/事件或删除对 应项。在中部窗口选中数据 /事件的条目,右侧窗口即显示它的属性,如图 3.2.23 所示。与菜单项方法不同的是,使用浏览器添加的数据 /事件,默认的作用域是本地 (Local),用户需要手动修改为外部输入或外部输出。 Cokrnn View; State/ Short Detail 1 白油世匚也 intents Wewch Results General 图氓 寓由奴jte$ Qe$orggn min Type 二 double Lock data type seding agarn
43、st changes by the fixed而nt to 图3.2.23利用模型浏览器修改数据 对于事件,用户还需指定它的触发方式, Rising表示上升沿、Failing 表示下 降沿,而Either表示上升或下降沿皆可触发, 本例的两个输入事件 start与LAP皆 选用Either方式触发,如图3.2.24所示。 PodiEent link: 图3.2.24利用模型浏览器修改事件 有多个数据或事件时,用户还可以指定它们的端口号,合理地排列这些端口, 将有利于以后的 Simulink模块连线。如图3.2.25所示,是完整的数据与事件列表。 Column View
44、: Stateflow ▼ ShowD etais 8 of 13 obiects Name Scope Port Rol DataType Trigger Ini 隙] [匚] [:] [1] 对 min Output 1 sec Output 2 percent Output 3 minbuf Output 4 secbuf Output 5 percentbuf Output 6 start Input 1 LAP Input 2 double double double double double double Either
45、 Either nr ► Contents Search Results 图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与Finished的
46、进入动作为: Finished entry: minbuf = min; secbuf = sec; percentbuf = percent; 添加了动作的状态图如图 3.2.26所示: 图3.2.26 动作定义在状态 当然用户可以将显示时间值定义为迁移动作。 为此按图3.2.27调整状态图,添 加节点与迁移动作。对照图 3.2.26 ,用户应很容易理解图 3.2.27的意义。 图3.2.27动作定义在迁移 不过目前的Stateflow 状态图还缺少最关键的时钟程序,该过程详见 3.3节。 3.2.6自动创建对象 实际建模时,随着思路的不断扩展与成
47、熟,状态、迁移、数据、事件、动作等 等各种图形与非图形对象,总是交替着添加,很少按照上述过程逐步进行。这就难 免发生遗漏,尤其是大型、多层次的 Stateflow 状态图。 当用户完成状态图的编辑,按下仿真按钮时,系统首先要进行语法检查,如果 发现错误,则给出提示。如果是某些数据或事件未定义,用户可使用随后出现的 Symbol Autocreation Wizard 向导,自动创建缺失的对象。 例如,用户可以在图 3.2.26中,任意添加一个状态动作 y=1,任意添加一个迁 移事件stop ,如图3.2.28所示。 图3.2.28添加一个状态动作 按下仿真按钮,系统首先给出
48、语法错误提示,如图 3.2.29所示: 图3.2.29错误提示 系统进一步分析该语法错误,是由于状态图中存在无法处理的符号,因此弹出 Symbol Autocreation Wizard 向导与向导使用说明,如图 3.2.30 所示,若用户已 能够熟练使用,可径自忽略该说明。 2 25 口 Stateflow Symbol Wizard Alert Parse errors occurred due to unresolved symbols in your diagram(s). These types of errors occur when appropria
49、te derta/event objects have not been odd" to the Model Explorer before parsing. A ^est guess" has been made for you. Please do the following: 1) Review the in the Symtooll Wizard. 2) Check the items you wish !to add. 3) Click the ^Creerte button. This wfl aiiornsitically create data/evert object
50、s in the Model Explorer which correspond to these unresolved symbols,
[ki the future, deni show this alert
OK
图3.2.30向导使用说明
Symbol Autocreation Wizard向导建议,应另行创建数据 y与事件stop ,如图
3.2.31 所示。
Unresoh 51、E in the Model Explorer
CheckAll UnCheckAll Ore ate Cancel
图3.2.31自动创建对象向导
用户可以不断单击 Scpoe与Proposed Parent的内容,修改数据/事件的作用域 与父对象,如图3.2.32所示。
Unresoh 52、Cre ate Cancel
图3.2.32修改作用域与父对象
用户若接受向导的建议,则单击数据 /事件前的空白处,选中该条目,之后按下
Create ,创建对象,如图 3.2.33 所示。
Unresofved symbols found in stopwatch_process [machine}
Place a check by the data/events you wish to CREATE in the Model Explorer
丁( T |Symb&l [Scope 回口Parent |
方 stop st□ pwatch process (machine) 53、
V EI y Output Chart (chart)
CheckAll UnCheckAll Create Cancel
图3.2.33创建对象
3.3 Stateflow 流程图
3.3.1 流程图与节点
3.1与3.2节介绍了 Stateflow 状态图的基本概念与创建过程。状态图的一个 特点是,在进入下一个仿真步长前,它会记录下当前的本地数据与各状态的激活情 况,供下一步长使用。而流程图只是一种使用节点与迁移来表示条件、循环、多路 选择等逻辑的图形,它不包含任何的状态。
由于迁移(除了默认迁移)总是从一个状态到另一个状态,节点之间的迁移只 能是一个迁移段。因此流程图可以 54、看作是有若干个中间支路的一个迁移,一旦开始 执行,就必须执行到终节点(没有任何输出迁移的节点),不能停留在某个中间节点, 也就是说必须完成一次完整的迁移。
从另一个角度来看,节点可以认为是系统的一个判决点或汇合点,它将一个完 整的迁移分成了若干个迁移段。因此可以将几个相同的迁移段合并为一个,用一个 迁移表示多个可能发生的迁移,简化状态图,由此生成的代码也更加有效
对于以下情况,用户应首先考虑使用节点:
if-else 判断结构、自循环结构、 for循环结构;
单源状态到多目标状态的迁移;
多源状态到单目标状态的迁移;
基于同一事件的迁移;
注意:事件无法触发从节点到状态的迁移。
55、
建议:用户可以把流程图封装成一个图形函数(详见 3.6.2 节),便于在
Stateflow 的任意位置调用。
3.3.2建立流程图
1.手动建立
建立流程图的过程与建立状态图的过程相似,以一段简单的代码为例,手动建 立流程图。
if percent==100
{percent=0;
sec=sec+1;}
else if sec==60
{sec=0;
min=min+1;}
end
end
①起始节点
单击 按钮,添加起始节点。如图 3.3.1所示:
图3.3.1添加节点
②条件节点与终节点
根据代码的执行过程,逐一添加条件节点 A1、B1、C 56、1,终节点A2、B2,以及节
点间的迁移与迁移标签,如图 3.3.2所示。
$ [percent== 100]{percent=0;sec=sec+1J
A1
QW H
i
乂 [sec==60]{sec=0:min=rriin+1;}
B11尸 Q 8?
2
J
C1 3
图3.3.2流程图
流程图运行过程如下:
1 .系统默认迁移进入节点 A1,如果条件[percent==100]为真,执行
{percent=0;sec=sec+1;} ,并向终节点 A2迁移;
2 .如果条件[percent==100]不为真,向B1节点迁移,继续判断如果条件 [sec== 57、60]为真,执行{sec=0;min=min+1;},并向终节点 B2迁移;
3 .如果不满足任何条件,则向终节点 C1迁移。
③节点与箭头大小
对于某些重要的节点或迁移,用户可以调整其节点大小与迁移箭头的大小,突 出其地位。例如,选择节点 C1的右键菜单项Junction Size - 16,如图3.3.3所示,
放大节点;选择节点 A1的右键菜单项 Arrowhead Size - 20 ,放大指向该节点的
所有迁移箭头,如图 3.3.4所示。
[percent==100]{percent=0:sec=sec+1;1
V)再 2
2
[sec==60]{sec= 58、0;min=min+1;}
; >Q B2
29
图3.3.3节点大小
[percent=-100]{percent-0:sec-sec+1;
A1
A2
[sec==60]{sec=0:min=nnin+1:}
一;」B2
33
图3.3.4箭头大小
④优先级
两个判断节点 A1、B1,均有两条输出迁移,分别标记了数字 1、2,这表示迁移
的优先级。默认情况下,Stateflow 状态图使用显性优先级模式,用户可以自行修 改各个迁移优先级。
例如,选择迁移曲线的右键菜单项 Execution Order ,将优先级由1降低为2, 59、
如图3.3.5所示。修改了某一输出迁移的优先级,系统会自动调整同一节点另一迁 移的优先级。
Patterns
7 Smart
[percent==100}
Cut
Copy
Paste
二:」J.
[sec==60]{sec
;
Fo-rward
Go To Parent
Requirements
HDL Coder
Execution Ordef
Font Size
Arrcwhedd Size
图3.3.5迁移优先级
为避免用户错误地设置优先级, Stateflow提供了另一种模式:隐性优先级。
选择编辑器菜单项 File 一 Chart P 60、roperties ,取消 User specified
state/transition execution order前的复选框,启用隐性模式,如图 3.3.6 所示。
Name: Ch^rt
Machin^: fmaEhinp] Junction
■■■■■■! S fl !!:■■■■■■ SSS J S! ■■■■■■!!! SI
State Machine Type; I Classic
kxMJg ”1 1 1, ” MJAMl , “ 1 MXMJ
Update method: f Inherited ▼ Sample Time:
Apply to 己I 61、I charts in machine nov^
匚 Enable C-bit operations
C Usef spettfied gtaie/tr己 nation《乂gtution cjrd^)
Export Chart Level Graphical Funcnons (Make Global)
1/ Use Strong Dp怕 Typing v;(th Simulink I/O
图3.3.6自动设置迁移优先级
使用这种模式时,系统根据以下规则,自动设置迁移优先级,从高到低排列为:
1 .既有事件又有条件的迁移
2 .仅有事件的迁移
3 .仅有条件的迁移
4 .不 62、含任何限制的迁移
注意:同一个 Stateflow 状态图,只能选用一种优先级模式,但对于有多个状 态图的Simulink模型,则不受此限制。
2.自动建立
对于简单的流程图,手动建立难度不大,而对于稍复杂的逻辑,用户难免会感
到无从下手。Stateflow 提供了快速建立流程图的向导,它可以生成 3类基本逻辑:
判断、循环、多条件。本小节使用向导,重建图 x的流程图。
①单击编辑器菜单项 Patterns -Add ...,选择流程图的类型,如图 3.3.7所
示。
file Edit View fmuhti 口 力 leok F&rmfft Add Pflttems Hel 63、p
Add Qscisitn 卜
Add Loop ►
Add Switch 卜
Add ^UEtDFTl
Save Pattern
肝出Mif用骗 tf-ElMif-Elserf-a^
Hcsted-lf.B.
图3.3.7流程图向导菜单
,在随后打开
D 这里选择 Patterns — Add Decision — If-Elseif-Else...
的对话框中输入判断条件与对应的动作,如图 3.3.8所示。
Description:
if condition: percent-100
If action: percent=0:sec=se 64、c*1 ;
Etseif condition:
sec==€0
Eto&if actkin: sec=0:min=rnin+1 :
Etee action:
OK ; Cancel
图3.3.8新建流程图对话框
③生成的流程图如图 3.3.9所示:
3.
两种方式的对比
尽管用户可以手动建立流程图,但使用流程图向导的优势也是显而易见的:
任何一种流程图都可归结为判断、循环、多条件,或者三者的组合,因此
皆可以使用向导自动生成;
使用向导生成的流程图符合 MAAB MathWorksAutomotive Advisory Board)
规则 65、,这有利于后期模型检查;
各种流程图的外观基本一致;
将设计好的流程图,另存为模板,便于重用。
3.4 层次结构
3.4.1 层次的概念
Stateflow 的对象具有层次性,一个 Stateflow 对象可以包含其他 Stateflow
对象,例如状态内若包含其他状态,则形成父状态,其内部状态称为子状态。当状 态具有第二个层次时,状态就构成了层次。
状态具有了层次,迁移自然也具有了层次, Stateflow 允许在不同层次状态之
间存在转移。如果迁移穿越了父状态的边界直接到达了低层次的子状态,则被称之 为超迁移。
在状态图中使用层次有如下几个目的:
使用层次,可以将相关的 66、对象组合在一起,构成族群;
可以将一些通用的迁移路径或者动作组合成为一个迁移动作或路径,简化
模型;
适当地使用层次,可以有效地缩减生成代码的大小,也能够提高程序执行 的效率和可读性。
3.4.2 迁移的层次
1 内部迁移
内部迁移是指从父状态边缘内部出发,终止于子状态外边缘的迁移,迁移始终
处于父状态的内部,不会退出源状态。
在交通灯系统中,同一个父状态 PowerOn存在红黄绿三个子状态,它们需要不
停地转换,但除非发生 PowerOff 事件,不会退出父状态,对于这样的逻辑过程,读
者可能习惯使用节点将三种状态的迁移联系起来,如图 3.4.1 所示。
图3.4.1带有节点的迁移
使用了内部迁移,可直接从父状态激活相应的子状态,不必经过节点,大大简 化状态图,如图3.4.2所示。
图3.4.2内部迁移状态图
2层次化迁移的优先级
与状态类似,迁移也具有层次性,迁移所属的层次是由其父状态、源状态和目
标状态决定的。因此,当多个迁移同时有效时,
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。