关于Stateflow实现循环逻辑的相关分析和介绍,stateflow 2023-12-09 13:48:31 0 0 描述 循环逻辑 要得到: 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 有相应的流程图向导可以直接使用,自动生成对应的流程图结构。 收藏(0)