Stateflow状态机建模:数据

汇聚博主多年工程经验的新书《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 总结

本文更进一步研究了状态机建模中关于数据的诸多细节。

>>返回个人博客总目录

相关推荐
Evand J1 天前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
机器学习之心1 天前
基于贝叶斯物理信息神经网络的矿产预测与不确定性量化,MATLAB代码及复现报告
人工智能·神经网络·matlab·贝叶斯物理信息神经网络
Evand J2 天前
【PMSM例程4】PMSM电阻辨识与模型补偿EKF,MATLAB例程。附下载链接,包运行成功
开发语言·matlab·电机·ekf·卡尔曼·pmsm
slandarer2 天前
MATLAB | 文艺复兴:万圣节使用 MATLAB 绘制黑人抬棺动画
matlab·黑人抬棺
大江东去浪淘尽千古风流人物2 天前
【FLORA】机器人视频标注引擎解析:三模型如何产出动作指令与四类奖励信号
matlab·机器人·跨模态·遥感·图像匹配·1024程序员节·特征描述符
星夜离尘563 天前
MATLAB ADC 码流触顶诊断:命中数、缺口分段与削顶不可辨识性
开发语言·matlab
Evand J3 天前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
iCxhust3 天前
MATLAB SPWM仿真
开发语言·matlab
Moonnnn.4 天前
【MATLAB】零基础入门
matlab
且撷相思红豆枝5 天前
Simulink学习笔记(一)
笔记·学习·matlab