实验环境
matlab2012a
步骤
- 打开simulink,新建,拖入stateflow库中的chart
- 双击,得到打开之后添加基本的元素即可
注意
- 数据传输
- 在stateflow窗口中点击”view->model explorer”,可以配置自己的输入输出以及其他相关
- 也可以点击菜单栏的”add”添加输入输出以及事件
- 在当需要传输的数据是数组时,需要用C语言的数组格式去调用该函数的值,下面举几个例子
- 定义test和test_o,都是2X2数组,则下面调用是正确的
test_o = test;
(可以对数组整体赋值)test_o[0][0] = test[1][1]
(注意下标从0开始,不能越界!)
- 而下面的是错误的
1.test_o(1,1) = test(1,1)
(matlab经典用法在此处行不通=。=) - example:state_chart_test3.mdl->third状态图
- 定义test和test_o,都是2X2数组,则下面调用是正确的
- 基本配置
- 单击”simulation->configuration parameters”,将仿真步长设置为固定长度(fixed step),其size为auto或者自己给定的值均可
- 每个父状态都要有一个迁移,一般为默认迁移,父状态里的某一个子状态也需要有一个默认迁移
- 状态转移有有优先级,需要设置,也可以通过”file->chart properties”取消勾选”user specified state…”,启用隐性模式,让软件自动设置
状态工具
整体格式
name %状态名
entry(en): %进入状态时的动作
during(du): %处于该状态时的动作
exit(ex): %退出该状态时的动作
on event_name:%某某事件发生时的动作
bind: %指定需要限制作用范围的时间与数据
状态迁移
缺省状态迁移
系统进入初始状态时,常采用该种结点,表示系统最先从哪个地方开始执行;对应一个父系统或者子系统,只能有一个缺省状态迁移结点,
时间结点迁移
格式
after(time,event)%time是迁移时间
- 常用event:
- tick:只有当系统没有外部事件时才能用该时钟,和仿真设置的步长相同
- sec:表示1s,当仿真步长小于1s时,它就表示1s,当仿真步长大于1s时,它和仿真步长相同(上次亲测出来的。。)
- 迁移过程中父状态的优先级大于子状态,即父状态的迁移时间到了之后一定会立刻发生迁移,而不会考虑子状态进行到哪
- 如果在父状态中加入历史结点,则在状态转移之后又回到该父状态时,系统会自动进入上次退出时保留的子状态,且重新开始计数;如果没有加入历史结点,则每次进入该状态都会从父状态开始一步步默认执行
条件迁移(迁移标签)
格式
event[condition]{condition_action}/transition_action
- event可选,如果加上,则表明当事件发生且满足触发条件时,状态迁移
- condition:发生迁移的条件(如果有触发事件,则需要2者同时满足才迁移)
- condtion_action,表达式中用逗号连接,不需要分号(当然,用了是最好=。=)
- 状态转移时产生的动作:因为有时候条件满足了不一定就发生状态转移,因此有了上面2种动作
并行机制
- 在空白处
右键->decomposition->AND
即可让该层级的所有转状态改为并行机制,即同时运行
事件(event)
定义
- 有local、input from simulink等多种类型,当选择local时,可以直接定义给它起个名字比如
lakers
,但是要看你在哪个层级上定义的,一般默认是全局变量
本地事件广播
- 在哪个地方驱动该事件,直接调用(写上该事件的名称加上逗号=。=)即可,当该事件被驱动时,将该事件驱动作为条件的转移也会发生相应的转移(如果没有其他限制条件的话)
直接事件广播
- 使用直接事件广播可以在仿真过程中避免出现不必要的循环或递归,并能有效地提高生成代码的效率
几种广播的方式
send函数
send(event_name,state_name)
可以针对某个状态发送广播或事件
send(event_name)
可以发送某个全局的事件
send(state_name.event_name)
可以发送针对某个状态框图建立的事件,即局部事件,
用事件名直接事件广播
需要在状态框图下面定义事件名称,然后在状态转移时直接
/state_name.event_name
(/是状态转移中的格式=。=)即可,当然如果定义的是全局变量,则可以直接/event_name
隐含事件和条件
- 当状态图执行的时候会自动发生,有几下几种
- change(data_name):对变量写进数据时会产生本地信号
- enter(state_name):进入指定状态时,隐含地产生一个本地信号
- exit(state_name):离开状态时,隐含地产生一个本地信号
- tick:评估状态所在的状态图被唤醒时,产生一个本地事件(参考after(num,tick))
- wakeup:与tick相同
- [in(state_name)]:当指定状态为激活状态,为真
stateflow其他常用对象
真值表(truth table)
- 首先建立table,如下
* 在空白处填写zz=xortable(xx,yy)
,在该真值表里创建xx、yy、zz三个变量,2个为输入、1个为输出(好像不添加也可以在运行报错后自动生成=。=),在该状态框图,之后调用的时候就可以直接调用函数result=xortable(in1,in2)
,result、in1、in2都是其他的变量
- 注意:在真值表的父状态之外调用它都是耍流氓
图形函数(graphical function)
注:拖出来之后是function ?
而不是 matlab function ?
!!!!
- 格式
function [n1,n2···]=func_name(a1,a2,···)
- 可以在里面添加真值表或者其他状态过程,在其他地方可以直接调用该函数,但是调用的地方不能是它的父状态之外
- example:state_chart_test3.mdl->first状态框图
图形盒(BOX)
- 要引用图形盒里面的变量或者函数,需要加上该图形盒的路径,如调用一个函数
box_name.func_name()
;
Simulink函数调用
- 它与simulink有以下区别
行为 | 调用simulink子系统 | simulink |
执行中是否需要函数调用输出事件 | 是 | 否 |
是否需要信号线 | 是 | 否 |
是否支持基于帧的输出信号 | 是 | 否 |
- 在一个状态图里创建的simulink函数只能在这个框图里面调用,在其他地方调用非法
- 添加simulink子函数后,最好先写好函数模型,之后系统会自动生成输入、输出变量;双击进去编辑时有一个f()的框,可以先不管它
- example:
example:state_chart_test3.mdl->fourth状态框图