C代码中常用的循环控制语句有诸如for 、while以及do while。那么,这种循环逻辑在Simulink模型中是如何实现的呢?
Simulink里有三种建模手段:
Simulink 框图
Stateflow Chart
MATLAB Function
先来看看如何使用Simulink 框图来表达这种循环逻辑。
点击末尾的 “阅读原文” 下载本文的案例模型
循环逻辑
要得到:
y1 = 0;
for(inx = 0; inx <10; inx++)
{
y1 = u1[inx] + y1;
}
或者
while(flag && (num_iter <= 100)
{
flag = func ();
num_iter ++;
}
怎么做:
在 Simulink的Port & Subsystem库里,有IF-ELSE以及While模块。
For循环实例
1. 新建一个简单的Simulink模型
首先来看For循环,这是从Port & Subsystem库里拖出来的For Iterator模块:
双击它,搭建内部如下图:
代码生成之前所需要的配置、数据对象的构造以及信号关联等等,这些任务与之前所述一样,此处就不再重复说了。
5. 生成代码
Ctrl+B,生成代码。
如前面所设置的,可以看到下图所生成的For循环的C代码:
While循环实例
在Port & Subsystem库里的While Iterator模块,实现while循环的功能。从这个模型的端口来看,在这个循环里根据输入u2来计算输出y2的值,如下图。
在这个While Iterator子系统内部,则是具体的while循环的内容,如下图。
While Iterator模块,是这个循环的条件模块,可以设置最大的循环次数,同时cond为while的循环条件。而在上部的累加计算框图,则是 while 循环的内容。
生成代码,如下图。图中的func函数就是框图func子系统所生成的函数。内部做了一些更新flag的计算。另外可以看到累加框图生成的代码:y2 += u2。
do while循环实例
这个就简单了,直接把上图中的 while Iterator 模块双击设置为 do while 的模式就行了。
其他
生成代码结束之后,如果继续编译链接生成 exe 文件时,会有一个有意思的错误如下。有兴趣的可以去查看 math.h 的函数定义。
在Simulink的Port & Subsystem库里,有IF-ELSE以及While相应的子系统模块实现循环算法。
全部0条评论
快来发表一下你的评论吧 !