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是否置为1LED_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灯的例子研究了嵌套状态的基本用法。返回个人博客总目录