【研发日记】Matlab/Simulink技能解锁(十二)——Stateflow中的两种状态机嵌套对比

文章目录

前言

项目背景

两级状态机

函数状态机

分析和应用

总结

参考资料


前言

见《【研发日记】Matlab/Simulink技能解锁(七)------两种复数移相算法

见《【研发日记】Matlab/Simulink技能解锁(八)------分布式仿真

见《【研发日记】Matlab/Simulink技能解锁(九)------基于嵌入式处理器仿真

见《【研发日记】Matlab/Simulink技能解锁(十)------PID调参技巧

见《【研发日记】Matlab/Simulink技能解锁(十一)------Stateflow中的en、du、ex应用对比

项目背景

近期使用Simulink开发的嵌入式项目中,用到了Stateflow中的状态机嵌套,使用过程中发现了两种嵌套方式存在关键的差异,极易踩坑。查阅官方文档并没有找到相应的解释。利用周末时间亲自摸索了一下,把它们的一些基本规律和技巧总结下来。

两级状态机

两级状态机是在某个State里边直接放入一个Stateflow,示例如下:

从上图可以看出,外层s1每次进入之后,一方面正常执行自有的代码(Cnt=Cnt+1;),另一方面也有序地执行内层的Stateflow。当外层s1退出时,内层的Stateflow也全部退出。当外层s1重新进入时,内层的Stateflow不管前一次停在哪个State,这时候都要从初始State(s2)开始执行。

函数状态机

函数状态机是在某个State里边放入一个Simulik Function,然后再在里边放入一个Stateflow,以此间接实现状态机嵌套的目的,示例如下:

从图上可以看出,外层Stateflow进入s1之后,嵌套在s1内部的Simulik Function也被调用起来,Fcn()实际上也是一个Stateflow。跟前面的两级状态机相比,外层Stateflow基本没有区别,内层Stateflow也是完全一样,正常理解的话应该运行得到相同的结果。实际运行起来看到了很关键的差异,就是外层State每次进入后,内层Stateflow运行的起点不一样。第一次外层进入s1时,内层是从初始State(s2)开始执行的。第二次外层进入s1时,内层直接就从s3开始执行。后面外层每次进入s1,内层都从s3开始执行。

分析和应用

1、两级状态机的外层State每次重新进入时,内层的Stateflow不管原本停在哪个State,都会回到初始State重新开始运行。这种状态机嵌套模式,内层的Stateflow是没有"记忆"的,适合应用于有初始化操作或者有复位操作的系统,比如带有累加功能或者积分功能的应用,每次重新启动都需要清零操作。

2、函数状态机的外层State每次重新进入时,内层的Stateflow都会先找到原本停在哪个State,然后从那里开始继续运行。这种状态机嵌套模式,能保证内层的Stateflow有准确"记忆",适合应用于需要暂存数据的系统,比如有固定执行序列的应用,当应用被打断又重新恢复时,需要从原有的位置开始运行。

总结

以上就是本人在研发中使用Stateflow中的状态机嵌套时,一些个人理解和分析的总结,主要是对比介绍了两种状态机嵌套方式的基本规律,展示了仿真运行的效果,并分析了它们的特点和适用场景。

后续还会分享另外几个最近解锁的Matlab/Simulink新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。

参考资料

cpp 复制代码
    Mathworks Help -> Stateflow

版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

相关推荐
肥仔哥哥19302 天前
嵌入式软件、系统、RTOS(高软23)
嵌入式·嵌入式系统·嵌入式软件·嵌入式系统分类·高软嵌入式
嘿嘿嘿x314 天前
联合体(union)
网络·单片机·嵌入式软件
charlie11451419115 天前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(绘图设备封装)
c语言·stm32·单片机·学习·oled·嵌入式软件
charlie11451419116 天前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
c语言·stm32·单片机·教程·oled·嵌入式软件
charlie11451419117 天前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础图形库实现)
c语言·驱动开发·笔记·单片机·oled·嵌入式软件
黄金右肾1 个月前
STM32之CubeMX图形化工具开发介绍(十七)
stm32·cubemx·嵌入式软件
黄金右肾1 个月前
STM32网络通讯之LWIP下载移植项目设计(十六)
stm32·嵌入式软件·网络通讯·lwip移植
一只搬砖的猹1 个月前
项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试
linux·单片机·嵌入式硬件·python自动化·rtos·嵌入式软件·ota
黄金右肾1 个月前
STM32之CAN通讯(十一)
stm32·单片机·can·嵌入式软件
LaoZhangGong1231 个月前
解决“KEIL5软件模拟仿真无法打印浮点数”之问题
经验分享·单片机·嵌入式硬件·float·仿真