编辑推荐: |
本文主要介绍了Stateflow-层次化建模相关内容。希望对您有所帮助。
本文来源于微信公众号嵌入式软件开发园,由火龙果软件Linda编辑,推荐。 |
|
1 状态动作深入讲解
1.1 五种状态动作
1.2 动作的执行次序
按下例对动作执行次序进行说明
在默认注装移除加入断点,单步调试查看执行动作顺序:开始当事件触发,进入A状态,执行en动作out=1;事件再次触发,判断满足转移条件,执行条件动作:out=3;执行后开始转移,离开A状态。执行ex动作:out=2;然后转移到B,执行转移动作out=4;进入到B状态,执行en动作out=5。
during动作:当状态不满足转移条件,还是保存当前状态,则执行该动作。例如上例加入转移条件。执行顺序为:当第一次进入A状态,执行en动作out=1;
后续事件触发,状态无法转移,适中为A状态,则执行du动作out=10。
1.3 动作中输出事件,状态,函数
stateflow可以输出事件,也可以输出事件去触发simulink模型的执行,如下模型:
运行结果如下,当状态A,B切换中执行事件E广播,触发simulink模块累加计算
和输出事件一样,stateflow还可以输出状态,输出函数:
2 层次化建模
2.1 层次化建模概念
层次化建模 :状态中嵌套另一个状态,外部的状态为父状态,内部为子状态,构成了层次化的状态图模型
构成层次化的Stateflow模型框图时,只要修改某个状态的尺寸让它包含其他的状态,就可构成层次化的Stateflow模型。此时父状态的边缘必须完整包含其内部所有的图形对象。不要使子状态边缘或者子状态之间的转移连线以及连接节点等超越父状态的边缘
特性
当父层次状态被激活时,其内部必有一个子状态处于活动状态
在同一层次的模型中,一般都需要存在一个默认转移,子类同一层次应存在默认转移
Stateflow允许不同层次下的图形对象取相同的名称,子类名字可以和父类同名,但规范下应使用不用的名字
2.2 层次化状态图的转移
判断准则:
子状态的各种对象仅仅在父状态活动时才有可能执行或者有效
当存在直接从父状态发出的转移时,可以不用考虑具体哪一个子状态处于活动状态
超转移
如下例:从子状态B2 出发存在一个转移,其终点直接位于父状态A的边缘上,这种转移称为超转移
转移顺序 :从B2发生超转移时,还是按离开B2状态,离开B状态,进入A状态的执行顺序
2.3 历史节点
历史节点 :在具有层次的模型中, 能够保存父层次状态退出活动状态时子状态的活动情况。当父层次状态再次被激活时,历史节点能够替代默认转移和默认状态,恢复历史节点记录的子状态,即恢复父层次状态退出活动状态时的现场状况
一种特殊的Stateflow 图形对象,只能够用于具有层次的状态内部
如果存在超转移,历史节点无作用
历史节点不能放在模型顶层,在顶层无任何作用
2.4 内部转移
**内部转移**:就是指在状态内部的转移,它从父状态内边缘出发,终止于父状态内的子状态或者连接节点边缘上,也可以终止于状态的内边缘
作用 :提高框图的执行效率,也能够使框图生成的代码变得简短
如下例,将上述历史节点示例用内部转移表示
2.5 自循环转移
自循环转移可以分为向外的外部自循环转移和位于状态内部的内部自循环转移两种
如下例所示:
假如当A处于活动状态,事件E发生,不满足C1条件 (1)A 活动状态退出条件不满足,保持A状态,执行du动作
out = 2 (2)检查内部是否存在有效转移,执行内部循环转移,out = 4 (3)系统进入到暂时的挂起状态,等待下一个触发事件的到来
接着事件E发生,满足C1条件 (1)A 活动状态退出条件满足,退出A状态,执行ex动作 out = 3
(2)状态转移到B,执行转移动作out = 5 (3)激活状态B,执行状态B的entry动作 out =
7 (4)系统进入暂时的挂起状态,等待下一个触发事件的到来 接着事件E第三次发生,此时条件C2 不满足
(1)B活动状态转移到A条件不满足,但存在外部转移,退出B状态,执行ex动作 out = 9 (2)执行外部自循环转移,此时将执行转移动作out
= 6 (3)外部自循环转移将重新激活状态B,执行状态B的entry动作out = 7 (4)系统进入暂时的挂起状态,等待下一个触发事件的到来
2.6 层次化模型的转移检测优先权
转移检测的基本原则
转移测试首先从最高层次的活动状态开始,然后逐级向内检测
外部转移优先于内部转移被检测
在同样的层次上,超转移首先被检测
外部转移 > 内部转移 > 超转移 > 子状态间转移
3 子状态图
子状态图 :将子状态图封装起来,形成明显区分层次
3.1 使用组合的状态
方法 :选中父状态 --> 鼠标右键 --> Grop & Subchart -->Group
组合后,变成了一个整体,颜色加深,子状态不可编辑,仅可以可以整体放大和缩小
双击组合,可以解除组合
3.2 创建子状态图
子状态图Subchart : 将父层次状态的内部细节“隐藏”起来,构成真正的层次化模型
选中父状态 --> 鼠标右键 --> Grop & Subchart -->
Subchart
子状态图颜色变深,父类状态名下有一个横线,点击可进入子类状态进行编辑
在这里插入图片描述
3.3 子状态图的超转移
子状态图的超转移添加方法:
|