当前位置: 首页 > news >正文

Stateflow状态机建模:嵌套状态

汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市,针对Simulink与MBD开发技术,形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市,感谢粉丝长期以来的支持!

文章目录

  • 1 引入
  • 2 建模过程
  • 3 嵌套状态的注意点
  • 4 总结

1 引入

之前写过一篇状态机的博客《Stateflow状态机建模:开关控制LED灯状态》,研究了状态机的最基础用法,完成了快速闭环的学习。

在Stateflow中的某个状态有时可以细分为多种不同的情况,分别对应一个细分状态,这种状态中的状态就是嵌套状态的概念。

例如,同样是对于开关控制LED灯,假如考虑到控制电路故障,就可以将整个系统分成两个父状态:【工作】和【故障】状态。在【工作】状态中,再细分为2个子状态【OFF】和【ON】状态。在博客《Stateflow状态机建模:开关控制LED灯状态》的基础上修改模型可以实现上述例子。

本文内容基于Matlab 2024b。

2 建模过程

首先,点击建模工具的Model Explorer,打开模型浏览器。类似输入类型的数据Key_Pressed,添加一个布尔类型的输入信号Battery_Fail,表示电池故障,作为【工作】和【故障】状态之间的跳转条件,如图所示。

在Chart模块中添加一个Working状态和一个Error状态,两者之间的跳转条件为Battery_Fail或Battery_Fail取反,如图所示。

跳转条件表示Battery_Fail为1时,状态机由Working状态跳到Error状态;Battery_Fail为0时,状态机由Error状态跳到Working状态。在进入Error状态时,产生一个en动作,将输出信号LED_State赋值为0,表示故障状态下LED灯不亮。

在Working状态中,按照博客《Stateflow状态机建模:开关控制LED灯状态》的方式建立OFF状态和ON状态之间的跳转模型,从视觉上来看OFF状态和ON状态处于Working状态内部,如图所示。

在Working状态中包含了OFF状态和ON状态两个子状态,并且将OFF状态作为默认跳转的子状态。这表示模型运行的第一个周期,通过2层默认跳转,先进入到OFF状态中。另外,由于Stateflow中的父状态优先级更高,Working状态可以通过Battery_Fail条件跳转到Error状态,无论内部的子状态的跳转条件。

接下来通过仿真模型验证嵌套状态的功能。由于配置了Battery_Fail输入变量,在Chart模块外部多出了一个Battery_Fail输入端口,在该端口上连接另一个Pulse Generator模块,如图所示。

双击Battery_Fail输入端口上对应的Pulse Generator模块,将参数配置为如图所示。

仿真配置及周期与博客《Stateflow状态机建模:开关控制LED灯状态》相同,配置完成后运行模型,双击Scope模块观察输出结果,如图所示。

由于前6s时间内,Battery_Fail输入为1,状态机跳转到Error状态,因此无论Key_Pressed是否置为1,LED_State都输出为0。第6s时刻Battery_Fail输入为0,状态机从Error状态跳转到Working状态,并默认进入了OFF子状态,LED_State输出还是保持为0。直到第7s和第9s时的Key_Pressed信号置为1,状态机才开始在Working状态的2个子状态之间互相跳转,输出的LED_State才会在0和1之间变化。

3 嵌套状态的注意点

  • 从可读性、逻辑复杂度、代码生成复杂性的角度考虑,Stateflow的状态嵌套一般不超过3层。如果状态机过于复杂,建议拆分为多个Chart模块开发。
  • 并非只有同级状态之间才能跳转,子状态可以直接引出一条转移线,满足条件后可转移到父状态外层。

4 总结

本文延续LED灯的例子,研究了嵌套状态的基本用法。

>>返回个人博客总目录

http://www.jsqmd.com/news/1091898/

相关文章:

  • 当AI智能体遇上高并发:我是怎么用Redis+负载均衡干掉推理超时的
  • Node Exporter 核心指标监控实战:从数据采集到告警配置
  • OpenAI重磅发布GPT-5.6:三款AI模型强势登场,性能远超谷歌Anthropic,但普通人无缘使用!
  • 时间复杂度与空间复杂度在实际工程中如何权衡取舍?
  • TI评估模块安全合规指南:从硬件开发到全球市场准入
  • IM系统端到端加密实战:从Signal协议到密钥管理全解析
  • OpenEuler24.03 LTS sp2 换软件源
  • Claude API 鉴权失败:Key、权限和配置怎么查
  • 零壹教育:列表推导式到底好在哪?从新手循环到Pythonic的必经之路
  • 铰链滑轨如何分辨好坏,国内家具五金品牌对比参考
  • 人造太阳(托卡马克聚变堆)
  • MOSFET 场效应管笔记总结
  • 中继镜实战:从参数解析到图卡选型的完整测试指南
  • 夸克网盘自动化神器:三分钟搞定追剧转存,彻底告别手动操作
  • 你是不是也受够了配置丢失的苦?
  • 存储器映射
  • Memory Checker:极致轻量的 Windows 托盘内存监测工具,告别内存焦虑
  • 基于DeepSeek+RAG的医疗智能问答系统~Python+DeepSeek+RAG+向量模型+智能问答
  • NifSkope 2.0:如何高效编辑游戏模型文件的完整指南
  • CPUDoc:如何让你的CPU性能提升5-10%而不超频?
  • 电脑连接手机调试
  • 深度解析NifSkope:游戏模型编辑与逆向工程的终极工具
  • RIP作业
  • Windows 从零安装 CUDA Toolkit 12.4 全过程(避坑指南)
  • 终极免费IDM激活教程:3分钟搞定Internet Download Manager永久使用指南
  • 深入解析LibreDWG未初始化内存漏洞:从原理到防御实战
  • 【Springboot毕设全套源码+文档】基于springboot校园资料分享系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 全平台视频元数据解析 API:从调用到深度集成实践
  • Ai2Psd:5分钟实现AI到PSD无损转换的终极解决方案
  • 2026面试|Java后端面试题大全(整理版,附答案详解)