循环逻辑
要得到:
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 有相应的流程图向导可以直接使用,自动生成对应的流程图结构。
扬式吊机出现齿轮轴磨损的修复方法
索尼PS5睡眠模式可能导致控制台崩溃
北斗星通云芯一体高精度定位服务产品实现全国31个省市地区的覆盖
小型化之路,莫仕应对5G普及的到来
O.S.Engines发动机的应用
关于Stateflow实现循环逻辑的相关分析和介绍
三星疯狂打压国产机!全面下调手机价格,采取高配低价策略!
华为任正非表示美国在通信产业的失败不要归罪于华为的崛起
国航首个VR培训教室正式启用 为民航培训事业发展提供了新的解决方案
苹果公司已将其四款低价智能手机从印度市场上架
浅析2021年各行业芯片供应情况
苹果Apple Watch扩大显示心肺功能
基于CW32系列MCU的GY-33颜色识别模块设计
2012年度亚洲市场最具价值品牌 三星居首
病毒检测仪的仪器特点是怎样的
板上芯片封装(COB),板上芯片封装(COB)是什么意思
RFID什么意思
流媒体技术的原理实现及在网络电视中的应用
全球首家超级充电站:落户中国!
东芝M303E microSD存储卡能够准确流畅地记录视频