STATEFLOW初学者,按照网上例程做了一个例子,使用了多层状态嵌套。
程序分为两个事件on-switch(下降沿触发)与off_switch事件(上升沿触发)。
输入变量temp,输出变量为speed(如图1与2所示)
程序设计思路:
on-switch事件发生时,temp>=120时,speed=2(High状态);
temp<120时。speed=1(low状态);
off-switch事件发生时,speed=0(off状态);
设计思路很简单,temp=200时,按道理说speed在0与2之间转换,实际运行时,发现speed只在0与1之间转换,没有进入High状态,如图3所示。
请问这是怎么回事啊,请教各位高手了
-
后台程序
-
前台程序
函数的参数和函数外面的变量虽然同名,但是可见范围不同吧?
函数的参数temperature在chart中并不可见。
按照你的方法:
得到如下仿真结果
证明在chart中的变量temp在其图形函数hot中可用。并得到了正常的动作输出。
附上我的程序matlab2015制作。
另外你的on_switch和off_swtich同时动作是不是有问题啊?将其改为网上例程的输入,并将仿真时间由10改为inf试一下。
几个月前我也不懂,现在也不太懂
off_switch发生进入off状态
speed=0
on_switch发生进入on状态
进入on默认状态on.low
speed=1
进入待机状态,等待下次事件发生。
谢谢您,我试试吧
45行 判断是否为0U,(不知道是干啥)如果是则执行,后退出。
55行 判断事件发生时系统处于off状态时,执行on-switch事件判断。
87行 系统处于on状态时,执行的事件判断:
首先,判断是否为off-switch事件,是则执行,后退出。
其次,判断是否为High状态,是则执行hot()判断,后退出。
最后,low状态,执行hot()判断,后退出。
系统仅在B_step(RT_MODEL_B_T *const B_M)函数中调用了上面的函数
if ((zcEvent_idx_0 != NO_ZCEVENT) || (zcEvent_idx_1 != NO_ZCEVENT)) {
/* Gateway: Chart */
if ((int8_T)zcEvent_idx_0 == 1) {//上升沿off开关
/* Event: '<S1>:17' */
sfEvent = B_event_off_switch;
B_chartstep_c3_B(&sfEvent, B_DW);
}
if ((int8_T)zcEvent_idx_1 == -1) {//下降沿on开关
/* Event: '<S1>:18' */
sfEvent = B_event_on_switch;
B_chartstep_c3_B(&sfEvent, B_DW);
}
}
从上面的程序看,仅仅在发生上升沿和下降沿的时候才会调用状态转换函数,而在这两个动作时仅产生B_event_on_switch和B_event_off_switch这两个事件,所以B_chartstep_c3_B()仅仅能执行55行和89行这两个分支。
评分
查看全部评分
一周热门 更多>