汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市,针对Simulink与MBD开发技术,形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市,感谢粉丝长期以来的支持!
文章目录
- [1 引入](#1 引入)
- [2 数据的编辑及浏览](#2 数据的编辑及浏览)
-
- [2.1 Symbols Pane的使用](#2.1 Symbols Pane的使用)
- [2.2 数据定义方法](#2.2 数据定义方法)
- [3 Local与Parameter数据的使用](#3 Local与Parameter数据的使用)
- [4 总结](#4 总结)
1 引入
Stateflow中的数据用于在状态之间传递信息、条件判断和执行动作等。在《Stateflow状态机建模:开关控制LED灯状态》一文中已经使用过Input和Output类型的数据,其他常用的Stateflow数据类型还包括Local(本地数据)、Parameter(参数)和Constant(常数)。
- Local类型的数据作用域为仅在当前Chart模块内使用,常常用作控制标志位、临时结果、计数器等。
- Parameter类型的数据绑定了Simulink 中的参数变量,方便与Simulink中的其他参数统一管理。
2 数据的编辑及浏览
2.1 Symbols Pane的使用
在上方工具栏的Design Data中点击Symbols Pane,可以调出该Chart模块的数据面板,如图所示。

在右侧弹出的Symbols面板中可以快速浏览该Chart模块中定义的数据及其类型,如图所示。

右键单击某一个变量,选择Highlight all uses,即可在模型中高亮显示所有使用该变量数据的位置,如图所示。这个方法在复杂状态机分析的时候非常有用。

对于未被使用的变量,在Symbols面板也会表现出一个警告标志,如图所示。

2.2 数据定义方法
除了上文示例中在Model Explorer中定义变量数据,也可以通过以下方式。在上方工具栏的Design Data的下拉菜单中,可以根据数据变量类型快速添加数据,如图所示。

另外,也可以在空白处鼠标右键,选择Add Inputs & Outputs,添加数据,如图所示。

3 Local与Parameter数据的使用
本节以延迟关闭LED灯为例,研究Local类型和Parameter类型的用法,例子与《Stateflow状态机建模:开关控制LED灯状态》中的时间事件转移效果相同。
首先新建Simulink模型Stateflow_Data.slx和数据字典Stateflow_Data.sldd,并将二者关联。在数据字典中新建一个名为LED_ON_TIME的Simulink.Parameter参数对象,DataType为single,StorageClass为ExportedGlobal,Value为3000,表示LED灯亮起3000ms后自动熄灭的参数,如图所示。

该参数将作为后续状态转移中的时间条件阈值。在模型中添加一个Chart模块,建立带有延迟关闭策略的LED控制状态图,如图所示。

其中,在ON状态的entry动作中,将本地变量Time_Count初始化为0。在during动作中将Time_Count的数值增加10,表示每个仿真周期都执行一次时间累计的过程。从ON状态到OFF状态增加一个转移,转移条件是Time_Count \> LED_ON_TIME,表示时间累加到3000ms时,产生状态转移。
在Model Explorer模型浏览器中,定义状态机模型所依赖的数据,如图所示。

其中的LED_ON_TIME和Time_Count分别是建模中使用的LED灯熄灭时间阈值和计数器。前者为Parameter类型,直接关联到了Simulink数据字典中的LED_ON_TIME参数。后者为Local类型,是Chart模块的本地变量,用于储存LED灯亮起的持续时间。
将模型配置为固定步长、离散求解器,以及运行周期为0.01s,如图所示。这里配置的运行周期需要与ON状态的during动作中计数的增量值保持一致,确保每个运行周期内Time_Count增长正确的数值。

在Chart模块的输出端口用Scope模块观测Pulse Generator模块的输出、Key_Pressed输入和LED_State的输出,如图所示。

双击Pulse Generator模块,将其中的参数配置为如图所示。

运行模型仿真,双击Scope模块,可以观察到各个信号如图所示。

在1s、6s时刻Pulse Generator模块输出上升沿,LED_State从0跳转到1,持续3s后Time_Count本地变量累加到3000后,满足了转移条件Time_Count \> LED_ON_TIME,状态机发生状态转移,所以LED_State跳转回0。
通过该建模方式的仿真效果与时间事件转移中的after函数类似。
4 总结
本文更进一步研究了状态机建模中关于数据的诸多细节。