1. 从“一团乱麻”到“井然有序”:为什么你需要层次化状态机?
如果你用过Stateflow画过稍微复杂一点的逻辑,我猜你一定经历过这种痛苦:画布上密密麻麻全是状态和转移线,像一团纠缠不清的毛线,想改一个逻辑,得瞪大眼睛找半天,生怕牵一发而动全身。我自己在做一个工业设备控制项目时就踩过这个坑,一个主控逻辑图,塞了二十几个状态,后期调试的时候,加一个报警条件,感觉整个图都要重画一遍,那感觉真是糟透了。
这就是层次化状态机(Hierarchical State Machine) 要解决的核心问题。你可以把它想象成整理你电脑里的文件夹。如果你的所有文件都堆在桌面上,找起来肯定费劲。但如果你建立了“工作”、“学习”、“个人”几个大文件夹,里面再细分“项目A”、“文档”、“图片”等子文件夹,结构立刻就清晰了。层次化状态机干的也是这个事儿:它允许你把一个大的、复杂的状态(我们叫它超级状态或父状态)打开,里面再包含若干个更精细的子状态。只有当父状态被激活时,它里面的子状态才有机会“上台表演”;父状态退出了,里面的所有子状态不管在干嘛,都得跟着一起退出。
这么做的好处太明显了。首先,视觉上极度清爽。你可以把一组相关的状态“打包”起来,在顶层图上只显示这个父状态,细节被隐藏了。想看细节?双击进去就行。这就像一本书的目录,你只看章节标题就能把握全书脉络,需要时再翻到具体章节细读。其次,它天然地体现了逻辑的封装和复用。比如,一个“运行”状态,里面可能包含了“启动”、“恒速运行”、“调速”、“停止”等一系列子状态。在任何需要“运行”逻辑的地方,你只需要引用这个“运行”父状态,而不必把里面复杂的子状态转移再画一遍。最后,也是我体会最深的一点,它让维护和修改变得可控。修改只影响封装的模块内部,不会像“霰弹枪”一样误伤全局逻辑。理解了这一点,你就掌握了从Stateflow新手迈向进阶玩家的第一把钥匙。
2. 动手搭建你的第一个层次化状态机
光说不练假把式,咱们直接上Simulink/Stateflow,看看怎么把一个“平面”的状态机改造成“立体”的。我拿一个经典的“自动售货机”逻辑来举例,假设它有三个主要模式:“待机”、“销售中”、“维护”。在“销售中”模式下,又有一连串子步骤:“选择商品”、“确认支付”、“出货”、“找零”。
最开始,我们可能会把所有状态平铺开来,结果就是“待机”到“选择商品”,再到“确认支付”……线条交叉,非常混乱。现在,我们用层次化来改造它。
第一步,创建父状态(超级状态)。
- 在Stateflow图表中,点击工具栏上的“State”图标,但别急着画。注意看,鼠标光标旁边会显示你画的状态的默认层次。我们直接拖动画出一个较大的矩形


375

被折叠的 条评论
为什么被折叠?



