关于Stateflow实现循环逻辑的相关分析和介绍,stateflow

描述

循环逻辑

要得到:

y1 = 0;

for(inx = 0; inx <10;>

{

y1 = u1[inx] + y1;

}

或者  

while(flag && (num_iter <=>

{

flag = func ();

num_iter ++;

}

怎么做:

Stateflow 有相应的流程图向导可以直接使用,自动生成对应的流程图结构。

For循环

1. 模型

在 Stateflow 里有各种控制流的构造向导,如下图。如果对 Stateflow 的流程图构建不熟悉的话,可以使用它来自动生成,再在它的基础上进行修改:

从而得到所需要的框图:

2. 数据

定义 Stateflow 模块的端口和本地变量,输入端口 u1,输出端口 yy1,以及本地变量 inx 如下:

在 Base Workspace 里定义输入输出信号 u1,yy1 的 Data Object:

3. 关联

在信号线上右键,设置信号属性,勾选 “Signal name must resolve to Simulink signal object”,将信号与 Base Workspace 的数据对象关联在一起。关联输入输出信号后,会看到如图的蓝色小叉子:

4. 代码

Ctrl+B,它所自动生成的代码:

While循环

1. 模型

下图就通过向导构造的,得到跟 for 循环类似的流程图:

这里的func作为一个 事件Event ,触发外面的 function call 子系统 func 计算flag:

2. 数据

Stateflow 内的数据定义如下图,输入端口名称 u1,输出端口名称 yy2,本地变量 num_iter。flag 由外部函数 func 来更新而作为输入。另外, func 事件触发调用外部的 func 函数。( inx 这里没有用)

在 Base Workspace 里定义相应的数据对象。因为这个 Simulink 模型的信号线上已经命名为 u2,所以定义的数据对象名称要跟信号线的名字一致: u2,yy2,flag。

并设置 flag 的初始值为 true。将数据对象与 Simulink 信号线关联。

3. 生成代码

Ctrl+B,生成的代码如下图所示。设置了 func()子系统的属性,把它变成一个子函数来调用。没有截图显示,但是func() 函数里修改了全局变量 flag 的值。

代码正常生成,但此时会得到如下的警告:

也就是说,我们之前对数据对象 flag 所设置的初始值是没用的,会被模型中 func 子系统的输出端口 Out1 的初始值所覆盖。

默认情况下 Out1 端口的初始值为 0 ,所以看下图的初始化函数里, flag 被初始化为 false,我们之前所设置的初始值 true 没有发生作用。

主程序里的 while(flag&(inx<100))>

所以,需要双击 func 子系统的 Out1 端口,设置初始值为 true,仿真才能得到正确的结果。同时,也会最后得到下面的初始化代码。

do while循环

使用流程图的向导,选择 do while 模式,把 Chart 里面的流程图改改就行了。另外,被调用的 func 函数,也可以写在 Chart 里面。

Stateflow 有相应的流程图向导可以直接使用,自动生成对应的流程图结构。

相关推荐

相关文章