stateflow历史节点使用及案例剖析

目录

前言

1. 案例需求

2.案例stateflow模型

3.问题缘由及问题解决方案

3.1问题

3.2问题产生缘由

4. 历史节点作用


前言

       之前总是认为stateflow有啥用,好像它可以做的switch和if等模块都能做到,也是带着这些不解去接触,后来发现stateflow能把逻辑思路大大简化和清晰,且由于带触发和持续动作的缘由,其它模块并非简易能够做到替代,目前仍是一名小白,写下博客首先要感激b站的:Hyowinner校长

Hyowinner校长的个人空间-Hyowinner校长个人主页-哔哩哔哩视频

遇到了问题抱着试试的态度,感谢百忙抽空做到开会议解答!往后您的作品持续支持!

视频学习链接:

【入门篇】Stateflow历史节点的使用_哔哩哔哩_bilibili

 下面将分为案例需求、案例stateflow模型、问题缘由及问题解决方案三部分创作,由于博客完全根据校长视频记录,如有侵权,请联系删除,谢谢校长!

1. 案例需求

注:截图来自上述视频链接。 

2.案例stateflow模型

3.问题缘由及问题解决方案

3.1问题

按照上述按键+防抖需求,出现连续的5个电平应该能够执行相应的动作,我这里给了6个低电平,应该在0.05s时候就要执行value+1操作,即0.05s输出为1(求解器采样时间0.01s)。

3.2问题产生缘由

注:上述模型中的cnt为局部变量,视频中按照人为习惯理解设为0,我这里改为了1本以为能解决问题,但实际不行,问题由两个因素导致,随我娓娓道来,可能较为啰嗦,水平能力有限,请多多指教!

采用断点调试可以发现在0s时刻停留在默认转移状态,或者说在IDLE chart的外围,还未进入该chart,更未执行chart中的动作。

这里注意断点调试时间显示是在0.000s暂停,但实际上已经在0-0.01s之间,即第一个步长运行,通过IDLE的高亮状态也可看出。

可以看到在0.01s时刻,此时只是在第二个chart PRESS_DOWN的外围,高亮墨绿色,但此时已“浪费一个步长在第一个chart中”,且cnt的值没有增加,问题出现在这里,实际上inLevel输入电平到了第二个电平元素 。

第二个步长0.01-0.02s之间执行cnt+1第一个操作 

0.05s执行完5个步长,但此时的inLevel是第6个元素

仿真结果如下,可以看到此时达到我们的想法在0.05s,即连续6个元素输入确认不是按键抖动,value+1。那该如何做到第5个元素value加1呢?

 个人解决方案,利用状态自转移,同时设置cnt计算初值为1,但是仍实际上未能解决0时刻便读取第一个电平元素的小问题。

结合c代码生成

注:外部自转移优先级顺序>内部自转移>en、du和ext 

啰里啰唆,不知道有没描述清楚我的问题及解决问题,如有更好的解决方案欢迎评论留言交流!

4. 历史节点作用

最后来简单介绍以下历史节点History作用,以这个消抖问题作为案例,历史节点能够在cnt<100时间内时刻,此时需要不断进行消抖判断,即PRESSED和RELEASE 两个chart的往复交互,历史节点History使其能在判断完消抖后保留判断前的数据,以便做好储存工作。

分析:如上图所示,历史节点在PRESSED父层级中,此时若从LONG_PRESSED退出进入RELEASE chart,后续如若再次返回PRESSED层,进入的是LONG_PRESSED,而非拥有默认转移状态的SHORT_PRESSED chart,即"后出先进"。

总结:

①在状态图的顶层或一个父状态里或放置一个历史节点,它便能能记录退出父状态时,正处于激活状态的子状态,当再次进入父状态时,则默认激活上一次所记录的子状态,而不是激活默认迁移的状态。

②历史节点仅作用于所在层级。

4.1 案例测试与分析

对比有无历史节点的仿真结果,仿真步长为1s。

4.2分析

①有历史节点: F1(1个步长)→(F2中的S1(1个步长)→S2(2个步长))(共3个步长)→F1(1个步长)→S2(3个步长)→F1(1个步长)→S2

②无历史节点:  F1(1个步长)→(F2中的S1(1个步长)→S2(2个步长))(共3个步长)→F1(1个步长)→S1(1个步长)→S2(2个步长)→F1(1个步长)→S1

③此时并非执行F2的y=2动作命令?并非如此,只是scope将此优化不显示,因为在该时刻瞬间执行了动作,使用inspector查看如下:

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Simulink Stateflow是一种基于模型的设计和仿真工具,可以在Matlab/Simulink环境下进行系统级建模和仿真。它可以帮助工程师通过图形化编程方式来实现各种控制逻辑,例如状态机、事件驱动等。 Stateflow在许多应用领域中广泛应用,例如自动化、控制和通信系统。下面我来举一个简单的Stateflow案例来说明其应用。 假设我们要设计一个自动贩卖机系统,其中包含以下几个状态:待机、选择商品、等待付款和出货状态。我们可以使用Stateflow来描述这些状态之间的转换和行为。 在Stateflow中,每个状态都可以用一个矩形表示,并且可以定义进入状态时的初始化动作和在状态内发生的事件。我们可以使用转换条件来定义状态之间的转换条件,例如当用户按下购买按钮时,系统从选择商品状态转换到等待付款状态。 在每个状态中,我们可以定义相关的操作和行为。例如,在待机状态下,系统可以定时检测是否有用户按下按钮,如果有,则进入选择商品状态。在等待付款状态下,系统可以接收付款信息,并根据付款结果来决定是否进入出货状态。 在Stateflow中,我们还可以定义事件和条件之间的层级关系。例如,在等待付款状态中可以定义一个超时事件,如果在规定时间内没有收到付款信息,系统将自动转换到选择商品状态,并重新开始流程。 通过使用Simulink Stateflow,我们可以在一个集成的开发环境中对自动贩卖机系统进行建模和仿真。这样可以大大简化系统设计和调试过程,并提高系统的可靠性和性能。 总之,Simulink Stateflow是一个强大的建模和仿真工具,可以在各种应用领域中实现复杂的控制逻辑。通过它,工程师可以图形化地描述系统的状态转换和行为,并进行细粒度的调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. 邹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值