STATEFLOW初学者(为什么没状态转换)

2019-07-17 12:56发布

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所示。


请问这是怎么回事啊,请教各位高手了


后台程序 后台程序
前台程序 前台程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
mydows
1楼-- · 2019-07-18 03:56
wangyi31 发表于 2017-11-22 09:14
谢谢您的回答
我为了简便起见,没有用那个函数
没太明白您的意思啊

函数的参数和函数外面的变量虽然同名,但是可见范围不同吧?
1.jpg
2.jpg
函数的参数temperature在chart中并不可见。
按照你的方法:
4.jpg
得到如下仿真结果
3.jpg
证明在chart中的变量temp在其图形函数hot中可用。并得到了正常的动作输出。
附上我的程序matlab2015制作。 untitled1.zip (22.85 KB, 下载次数: 14)
另外你的on_switch和off_swtich同时动作是不是有问题啊?将其改为网上例程的输入,并将仿真时间由10改为inf试一下。
mydows
2楼-- · 2019-07-18 04:03
pianhe 发表于 2017-11-21 14:56
不懂啊

几个月前我也不懂,现在也不太懂
mydows
3楼-- · 2019-07-18 05:16
我分析了一下你的模型设置。假设历史状态为on.low。on_switch与off_switch同时发生,那么状态图状态如下跳转:
off_switch发生进入off状态
speed=0
on_switch发生进入on状态
进入on默认状态on.low
speed=1
进入待机状态,等待下次事件发生。
wangyi31
4楼-- · 2019-07-18 08:49
 精彩回答 2  元偷偷看……
wangyi31
5楼-- · 2019-07-18 09:12
mydows 发表于 2017-11-22 10:34
函数的参数和函数外面的变量虽然同名,但是可见范围不同吧?

谢谢您,我试试吧
mydows
6楼-- · 2019-07-18 11:56
下图为将楼主的程序转为C语言的代码,其中状态图判断的部分:
QQ截图20171129093155.jpg

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行这两个分支。

评分

参与人数 1积分 +5 收起 理由 wangyi31 + 5

查看全部评分

一周热门 更多>