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
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

查看全部评分

一周热门 更多>