3. Stateflow状态机基础
Stateflow 是 Simulink 中用于描述事件驱动逻辑与模式切换的图形化建模工具。它把“系统当前处于什么模式、什么条件触发切换、切换时做什么”这三件事,用状态、转移、事件和动作四类基本元素表达出来。理解这四类元素及其组合规则,是后续用 Stateflow 实现复杂控制逻辑的前提。
一、四类基本元素
状态(State)表示系统在某一时刻所处的模式或阶段,例如“待机”“运行”“故障”。状态可以嵌套,形成父状态与子状态;父状态内部可以定义默认转移,决定进入父状态后首先激活哪个子状态。状态本身可以携带 entry、during、exit 三类动作,分别在进入、停留、离开该状态时执行。
转移(Transition)是连接两个状态的有向边,表示模式切换的路径。转移上可以标注触发事件、转移条件和转移动作,其通用形式为:事件[条件]{动作}。其中事件和条件都可省略:只有条件时表示条件满足即转移;只有事件时表示事件发生即转移;两者都有时表示事件发生且条件为真才转移。
事件(Event)是驱动状态机运行的信号,分为输入事件、本地事件和输出事件。输入事件来自 Simulink 或其他 Stateflow 图,本地事件在 Stateflow 内部广播,输出事件则向外发送。事件可以带数据,用于在转移动作中参与计算。
动作(Action)是状态机在特定时刻执行的语句,常见形式包括:状态动作(entry/during/exit)、转移动作、条件动作和默认转移动作。动作中可对输出变量赋值、调用函数或广播事件。
二、默认转移与执行顺序
默认转移(Default Transition)是从父状态边界指向某个子状态的转移,不带触发事件,用于指定进入父状态后默认激活的子状态。若父状态有多个子状态且未定义默认转移,Stateflow 会报错或无法确定初始状态。因此,只要使用层次化状态,就应显式定义默认转移。
Stateflow 的执行遵循“事件驱动、按序求值”的原则:当外部事件到达时,Stateflow 先对当前活动状态的所有外向转移按图形顺序求值,找到第一条条件为真的转移并执行其动作,然后进入目标状态并执行其 entry 动作。若同一时刻有多条转移条件为真,只有图形顺序最靠前的那条会被执行,因此转移的排列顺序会影响逻辑结果。
三、用 Stateflow 实现一个简单逻辑控制器
下面以一个“启停控制 + 故障保护”的简单逻辑控制器为例,说明从需求到 Stateflow 实现的完整过程。控制对象可理解为一台电机或一个执行机构,输入为三个布尔事件:start、stop、fault,输出为布尔变量 out。控制要求是:初始处于待机状态,输出为 0;收到 start 且使能条件满足时进入运行状态,输出为 1;运行中收到 stop 返回待机;运行中收到 fault 进入故障状态并输出 0;故障状态下收到 reset 返回待机。
在 Simulink 中新建 Chart 后,依次创建三个状态并命名。为“待机”状态添加默认转移,使其成为初始激活状态。然后添加四条转移并标注触发条件:待机到运行为 start[enable],运行到待机为 stop,运行到故障为 fault,故障到待机为 reset。各状态的 entry 动作分别设置为 out=0、out=1、out=0。
需要特别注意的是转移的求值顺序。在“运行”状态中,stop 和 fault 两条转移都可能被触发,若同一仿真步内两者同时为真,Stateflow 只会执行图形顺序靠前的那条。工程上通常把故障保护类转移放在前面,以保证安全优先。此外,enable 作为条件变量,需要在 Chart 的输入数据中定义,类型为 boolean,初值可设为 true。
四、验证与观察
搭建完成后,可用 Signal Builder 或 Step 模块构造输入序列进行验证。一个合理的测试序列是:0~1 s 全部输入为 0,观察 out 保持 0;1 s 时 start 置 1,out 应在该步变为 1;2 s 时 stop 置 1,out 应回到 0;3 s 时再次 start,out 变 1;4 s 时 fault 置 1,out 应变为 0 且状态进入故障;5 s 时 reset 置 1,状态回到待机。通过 Scope 观察 out 波形,并利用 Stateflow 的动画高亮确认状态切换路径与预期一致,即可判断逻辑实现是否正确。
{disp('to Run')} 之类的动作,可在仿真时于 MATLAB 命令行观察转移触发顺序,便于定位条件竞争问题。掌握以上四类元素与默认转移规则后,就可以把更复杂的模式管理、故障分级、时序逻辑逐步纳入 Stateflow,并与 Simulink 的被控对象模型协同仿真。