循环逻辑
要得到:
y1 = 0;
for(inx = 0; inx <10; inx++)
{
y1 = u1[inx] + y1;
}
或者
while(flag && (num_iter <= 100)
{
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 有相应的流程图向导可以直接使用,自动生成对应的流程图结构。
全部0条评论
快来发表一下你的评论吧 !