ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Stateflow状态机建模:状态转移

2026/8/16 14:18:11 拓冰建站 浏览量
Stateflow状态机建模:状态转移

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

文章目录

  • 1 引入
  • 2 转移的语法构成
  • 3 默认转移
  • 4 输入事件触发转移
  • 5 时间事件转移
  • 6 转移优先级
  • 6 总结

1 引入

Stateflow中的转移表示系统满足一定条件后,从一个状态变化到另一个状态的过程,之前的博客《Stateflow状态机建模:开关控制LED灯状态》中的Key_Pressed就是满足了按键按下的条件后,系统在OFF和ON状态之间转移。本节研究Stateflow中的转移的更多用法。

2 转移的语法构成

在《Stateflow状态机建模:开关控制LED灯状态》中通过转移上的方括号表示转移的条件,完整的转移语法包括以下部分:

[condition]{condition_action}/ transition_action

其中,各个部分的含义如下:

  • condition:判断是否允许转移的条件。
  • condition_action:条件成立时、在转移之前执行的代码语句。
  • transition_action:执行转移动作时执行语句。

转移语法中,[condition]是最常用的基于条件的转移。如果转移线上没有任何语句,则会被判定为没有条件的转移,会在下一周期立即转移状态。

3 默认转移

当一个Chart有多个状态时,Stateflow 必须知道在第一次要进入哪个状态。如果没有明确设置,Stateflow 会报错。默认转移的图形特征为,起点是一个圆点,从圆点引出一条线,末端的箭头指向某个状态,如图所示。

在状态机嵌套中,一个父状态中的多个子状态也需要有默认转移,如图所示。

如果Chart模块中没有默认转移,则会报错如图所示。

默认转移也可以先转移到一个连接点上,再有节点判断条件转移到对应的状态上。例如将《Stateflow状态机建模:开关控制LED灯状态》中的建模示例改成如下图所示。默认转移经过连接点后,首先根据转移1判断Key_Pressed是否满足,满足则通过转移1在第一个周期进入ON状态,不满足则通过转移2进入OFF状态。

注意:该建模方式也需要确保Junction节点跳转到状态机的各个转移中,有一条是没有条件的,如图中的转移2所示,否则就相当于没有默认转移,也会导致Stateflow报错。

4 输入事件触发转移

Stateflow状态机会在接收到某个特定事件时,从一个状态转移到另一个状态。以《Stateflow状态机建模:开关控制LED灯状态》中的开关控制LED灯为例,在Chart模块中可以直接定义一个检测上升沿触发的事件,再根据该事件触发与否来进行状态转移。

首先点击建模工具的Model Explorer,在模型浏览器中通过上方的工具栏添加一个事件,如图所示。

将该事件重命名为Key_Pressed_Event,Scope选为Input from Simulink,表示事件从外部输入。Trigger选为Rising,表示检测输入信号的上升沿事件,如图所示。

在Chart模块中搭建状态及跳转模型,用Key_Pressed_Event事件触发跳转,如图所示。

在Chart模块上方会出现一个上升沿的图标及端口,将该端口连接到Pulse_Generator上,如图所示。

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

仿真结果中,在第3、5、7、9s时Pulse Generator产生上升沿,输出的LED_State信号也根据上升沿跳转OFF和ON状态。在第1s时Pulse Generator也产生了上升沿,但是由于状态机在先前还未被激活,所以第1s时事件激活状态机,默认转移到OFF状态。这一点是事件作为转移条件和信号作为转移条件的差别。

另外,也可以勾选Model Explorer中的Execute chart at initialization,在初始化的时候直接激活Chart 模块,如图所示。

勾选该参数后再仿真,Chart模块就会在0时刻被激活,在1s时产生事件触发后就从OFF状态转移到ON状态,如图所示。

5 时间事件转移

Stateflow中的时间事件转移是指在状态持续一段时间后自动触发的一种特殊转移方式。例如,进入一个状态之后,如果经过了几秒钟或者若干个周期,就自动跳转到另一个状态。Stateflow中提供了以下几种常用的时间触发函数:

  • after(n, time_unit):在进入当前状态 n 个时间单位后触发。
  • before(n, time_unit) :在 n 个时间单位前触发(较少使用)。
  • duration(x):条件 x 已持续的时间。
  • elapsed(x) :当前状态持续了多久。

其中,时间单位time_unit为sec,msec或tick,分别表示秒、毫秒、周期。下文以最常用的after函数为例,研究时间事件转移的用法,其余函数可参考官方帮助文档。

对于《Stateflow状态机建模:开关控制LED灯状态》中的开关控制LED灯的例子,假如将跳转条件改为,按下开关后LED 亮起,如果持续3秒钟没有再次按键或者再次按下开关,LED 自动熄灭。该需求则可以将《Stateflow状态机建模:开关控制LED灯状态》中的状态机模型修改为建立第2个从ON状态到OFF状态的跳转,如图所示。

第2个跳转条件使用after函数,在ON状态维持3s后跳转到OFF状态。Chart模块外的Pulse Generator模块配置参数如图所示,模拟按开关。

参照本文之前内容,将模型配置为固定步长、离散求解器,以及运行周期为0.01s。运行模型仿真,双击Scope模块,可以观察到各个信号如图所示。

在1s、6s时刻Pulse Generator模块输出上升沿,LED_State从0跳转到1,持续3s后再由第二个转移中的after函数条件再跳转回0。

注意:after等时间事件转移条件中如果以sec或者msec的时间为单位,在生成的嵌入式代码中会根据模型的离散仿真周期和after函数中的时间,计算出需要延迟的周期数。例如模型运行周期为0.01s,转移条件为[after(3,sec)],代码中会用一个变量作为计数器,计数到300后执行跳转。

6 转移优先级

在状态机建模中可能存在一个状态有多个向其他状态的转移,如图所示。

Stateflow会按照转移优先级依次判断转移条件,执行第一个满足条件的转移。转移优先级体现为转移上的数字,通过右键点击数字,在Execution Order中可以修改转移优先级顺序,如图所示。

在Stateflow状态机建模中需要关注优先级,避免出现不符合预期的跳转顺序。

6 总结

本文详细研究了状态转移的诸多细节,在工程实践中需要更多地注意。

>>返回个人博客总目录