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 总结

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

>>返回个人博客总目录

相关推荐
Matlab程序猿1 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
机器学习之心18 小时前
基于CNN-LSTM的轴承剩余寿命预测,MATLAB代码
matlab·cnn·lstm·cnn-lstm·轴承剩余寿命预测
菜鸟~noob2332 天前
【电子战】 第26篇:大气衰减——氧气与水汽吸收【含matlab代码】
开发语言·matlab
菜鸟~noob2332 天前
【电子战】第25篇:自由空间、双射线与菲涅尔区【含matlab代码】
开发语言·算法·matlab
Evand J3 天前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
weixin_307779133 天前
C++代码实现MATLAB中的cvpartition函数功能
开发语言·c++·算法·matlab
机器学习之心3 天前
DCNN-PINN锂电池SOC估计,因果空洞卷积+物理信息神经网络,把库仑定律写进损失函数,MATLAB代码
人工智能·神经网络·matlab
weixin_307779134 天前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
菜鸟~noob2334 天前
【电子战】 第22篇:误差椭圆与置信区间【含matlab代码】
开发语言·算法·matlab