关于如何定义结构体的分析和介绍

描述

我们来聊聊结构体。

E-Coder 在做自动代码生成的时候,在默认情况下,它会把所有的输入信号定义为一个结构体_U,把所有的输出信号定义为另一个结构体_Y,把所有的参数定义为一个结构体_P。虽然这样的结构体不一定是我们想要的,但至少,说明自动代码生成是支持结构体的。

本文并不解决“哪些情况下应该使用结构体”这个问题,这里来说说:

怎么实现我想要的结构体?

从之前的文章中我们说到,自动生成代码时,想让各种信号、参数定义和声明采用什么样的方式,都是通过数据对象 (Data Object) 来实现的。那,如果我希望把信号 a ,b,c 或者参数 k1,k2,k3 定义为一个结构体,该怎么实现呢?

构造结构体

要得到:

typdef struct {

double k1;

double k2;

double k3;

} kk_type;

kk_type kk={2.0,3.0,4.0};

怎么做:

设置数据对象的 Storage Class 属性为 Struct

或者使用 Simulink Bus 来定义新的结构体类型 outyy

举个例子

1. 新建如下的简单模型并生成代码

先看一下 “正常的” 不使用结构体的情况:

结构体

看下面这张图,定义好了对应的信号数据对象 (Simulink.Signal) u1、u2、u3、yy1、yy2、yy3,与参数数据对象(Simulink.Parameter) k1、k2、k3。

通过名字对应以及关联操作,实现关联,也就是上图中的蓝色小叉子。具体如何操作以前介绍过。

结构体

Ctrl + B,生成代码:

结构体

2.把参数 k1、k2、k3 放在指定的结构体 kk 里

选中数据对象 k1,k2,k3,把 StorageClass 都设置为 Struct(Custom),并指定结构体名字为 kk。这样在自动生成代码时,这几个参数会自动放入结构体 kk 中。

结构体

看到,在生成的代码里,得到一个新的结构体类型 kk_type:

结构体

并且,根据这几个参数的值,得到了结构体变量 kk:

结构体

3.把信号 yy1、yy2、yy3 也放在一个输出结构体里

刚才的参数结构体是通过设置数据对象的 StorageClass 为 Struct 来实现的。而现在,以信号为例,使用另一种方式来实现这个目的: Simulink Bus。

a. 首先,通过 Simulink Bus 来定义一个新的结构体数据类型 outyy:

结构体

定义这个 Bus 的结构,里面的成员名就是最后出现在代码里的名字:

结构体

那么此时,一个新的数据类型就构造好了。将来在生成代码时,这个新的结构体类型就是这样:

结构体

数据类型定义好了,接着,我们就要来用它了。

b. 把 Simulink 的三个输出信号使用 Bus Creator 模块变成总线信号,取名叫 outStruct:

结构体

设置这个 Bus Creator 模块的数据类型为刚定义好的结构体 outyy。另外,还得勾选它为非虚拟总线。那么这样,它在生成代码时,就会被当做结构体来看:

结构体

c. 如同之前每一个 double\single 类型的信号一样,接着,也为 outStruct 信号定义一个同名的数据对象 outStruct。

在 Simulink 模型上的 outStruct 信号线的属性界面上勾选关联到这个数据对象,得到蓝色小叉子。

结构体

4. 最后生成代码

结构体

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分