Matlab论坛
直播中

h1654155268.4531

9年用户 444经验值
擅长:电源/新能源
私信 关注
[问答]

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

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


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


  • 后台程序
  • 前台程序
已退回20积分

回帖(16)

h1654155268.4531

2017-11-19 11:22:38
拜托各位了,困扰好久了,大家给点提示啊
举报

mydows

2017-11-21 11:17:49
是哪一个教程?
举报

mydows

2017-11-21 11:35:16
5#
https://bbs.elecfans.com/forum.p ... =1124689&extra=
网上的教程,应该是例12.5吧
举报

mydows

2017-11-21 11:49:37
应该是function中没有引入参数tem所导致。无法形成转移条件。
举报

刘刚

2017-11-21 14:56:20
不懂啊
举报

h1654155268.4531

2017-11-22 09:14:29
引用: mydows 发表于 2017-11-21 11:49
应该是function中没有引入参数tem所导致。无法形成转移条件。

谢谢您的回答
我为了简便起见,没有用那个函数
没太明白您的意思啊
举报

mydows

2017-11-22 10:34:18
引用: wangyi31 发表于 2017-11-22 09:14
谢谢您的回答
我为了简便起见,没有用那个函数
没太明白您的意思啊

函数的参数和函数外面的变量虽然同名,但是可见范围不同吧?
1.jpg
2.jpg
函数的参数temperature在chart中并不可见。
按照你的方法:
4.jpg
得到如下仿真结果
3.jpg
证明在chart中的变量temp在其图形函数hot中可用。并得到了正常的动作输出。
附上我的程序matlab2015制作。
另外你的on_switch和off_swtich同时动作是不是有问题啊?将其改为网上例程的输入,并将仿真时间由10改为inf试一下。
举报

mydows

2017-11-22 10:36:27

几个月前我也不懂,现在也不太懂
举报

mydows

2017-11-22 10:50:04
我分析了一下你的模型设置。假设历史状态为on.low。on_switch与off_switch同时发生,那么状态图状态如下跳转:
off_switch发生进入off状态
speed=0
on_switch发生进入on状态
进入on默认状态on.low
speed=1
进入待机状态,等待下次事件发生。
举报

h1654155268.4531

2017-11-25 21:15:11
引用: mydows 发表于 2017-11-22 10:50
我分析了一下你的模型设置。假设历史状态为on.low。on_switch与off_switch同时发生,那么状态图状态如下跳转:
off_switch发生进入off状态
speed=0

但是我设置上升沿触发on_switch事件,下降沿触发off_switch状态啊

而且进入on状态时,TEMP=200,大于120,不是该进入HIGH状态
举报

h1654155268.4531

2017-11-25 21:19:44
引用: mydows 发表于 2017-11-22 10:34
函数的参数和函数外面的变量虽然同名,但是可见范围不同吧?

谢谢您,我试试吧
举报

mydows

2017-11-29 10:36:05
下图为将楼主的程序转为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: ':17' */
      sfEvent = B_event_off_switch;
      B_chartstep_c3_B(&sfEvent, B_DW);
    }
    if ((int8_T)zcEvent_idx_1 == -1) {//下降沿on开关
      /* Event: ':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行这两个分支。
举报

h1654155268.4531

2017-12-3 10:32:26
引用: mydows 发表于 2017-11-29 10:36
下图为将楼主的程序转为C语言的代码,其中状态图判断的部分:

感谢您的回答,学习一下

另外,请教您这是什么软件生成的。vc?
举报

h1654155268.4531

2017-12-3 10:33:49
引用: mydows 发表于 2017-11-29 10:36
下图为将楼主的程序转为C语言的代码,其中状态图判断的部分:

感谢您的回答,学习一下

另外,请教您这是什么软件生成的。vc?
举报

mydows

2017-12-4 09:25:44
matlab生成的。具体设置还没太学会。13#的解释可能还有错误,请楼主参考就可以了。
举报

nihaoxiaozhang

2018-2-28 09:56:23
有相关学习资料,请Q498292477
举报

更多回帖

发帖
×
20
完善资料,
赚取积分