文章目录
- 一、状态
- 1.状态的层次结构
- 2.状态的横向结构
- 3.状态标签
- 1)状态名
- 2)状态动作
- 4.迁移
- 二、数据与事件
一、状态
1.状态的层次结构
分为父状态和子状态
- 每一个状态都有父状态,最外围的状态其父状态是它本身
- 外部的state叫父状态,内部的状态叫子状态
2.状态的横向结构
状态图的顶层或某一父状态下,通常并存多个状态,他们之间的关系分为互斥和并行
- 互斥状态
互斥状态的矩形框边缘显示为实线,同一级的互斥状态,至多允许激活一个状态。 - 并行状态
并行状态的举行框边缘显示为虚线,同一级的并行状态可在同一时刻被激活
3.状态标签
1)状态名
同级的各个子状态不允许重名,不同级的状态不受限制。
2)状态动作
(1)entry(或缩写成en)动作(进入时执行动作)
如果用户在状态名后加入斜线,并直接跟随具体动作,则该动作默认为进入动作。如下
A/y=3
y++
进入A状态时,立刻执行y=3,之后又执行y++,最终结果为y=4。
(2)during或du动作(保持动作)
A
en : y = 3;
du : y++;
在进入状态A时,执行动作y=3,之后不断执行y++。若求解器的定点步长取0.2,仿真时长取2,则最终的结果y=13。
(3)exit或ex动作(退出时执行动作)
A
en : y = 3;
du : y++;
ex : y = y - 1;
在五个仿真步长之后,退出状态A,进入状态B时,最终结果应为7。即退出时要执行减一这个动作。
(4)广播时间动作on event_name
event_name代表某一广播事件名,事件名应该是唯一的。
A
en : y = 1;
du : y++;
on stop : c();
系统处于A状态,当检测到事件stop,立即执行c()。
(5)bind动作
A
en : y = 1;
du : y++;
bind : y; start;
B
en : y = 1;start
变量y和start被绑定在状态A,这表示仅有A状态及其子状态有权限修改变量y并广播时间start,其他状态B仅能够读取变量y,监听到事件start,无权修改变量y和广播时间start。
bind动作在整个Stateflow状态图范围内都是有效的。
若运行这个代码,会报错。
A
en : y = 1;
du : y++;
bind : y; start;
B
bind : y;
两个状态同时约束变量y,这是不被允许的。
4.迁移
(1)迁移
Stateflow状态图使用一条单向箭头曲线表示迁移,它将两个图形对象连接起来,多数情况下,迁移是指系统从原状态向目标状态的转移。
在迁移曲线上加标签,可以指定系统在何种条件下从源状态向目标状态转移。
(2)默认迁移
是一种特殊的迁移方式,它没有源对象。用于指定同一级有多个互斥状态并存,首先激活的状态
(3)迁移标签
迁移标签的完整格式
Event[Condition]{Condition_Action}/Transition_Action
1)event:引发迁移的时间
2)[condition]:条件动作与迁移的发生条件
3){condition_action}:当条件为真时,执行的动作
4)/transition_action发生迁移,进入目标状态前所执行的动作
condition_action和transition_action的区别是当condition为真时condition_action立刻执行,而transition_action是当condition为真,并且迁移状态(下个激活状态)有效时,执行transition_action这个动作。
二、数据与事件
- 数据是非图形的对象
用户在使用数据时必须明确定义作用域。 - 事件也是非图形的对象