关于结构体变量建模的介绍和原理

描述

鉴于有不少模型开发工程师缺乏 C 语言的基本概念,我这里大致说一下 C 代码中的结构体。

首先我们需要知道有结构体类型和结构体变量。

结构体类型在 C 语言中的定义如下:

struct mystruct_T

{

uint8 a;

int16 b;

uint16 c;

};

这里 mystruct_T 就是结构体类型。结构体类型是一种组合数据类型,不同于数组,结构体的元素是可以有不同数据类型的,上面的例子中 a、b、c 的数据类型各不相同。

我们可以像使用基本数据类型一样使用结构体类型去定义变量,使用结构体类型定义的变量是结构体变量,比如:

mystruct_T mystruct_var;

那么 mystruct_var 就是一个结构体变量,可以通过如下结构体变量右侧加点来访问结构体变量中的元素,比如:

mystruct_var.a = 30; 

或者:

tmp = mystruct_var.c;

这样,我们就有了结构体类型 mystruct_T 和结构体变量 mystruct_var。

我们做一个假设,如果上述结构体里面的元素 c 不是一个单个元素,而是一个结构体变量,情况将会怎么样?比如:

struct mystruct_T

{

uint8 a;

int16 b; 

substruct_T c;

};

结构体里面还套着一个结构体,于是我们就有了结构体嵌套。

我们在 C 语言中定义变量的时候,可以定义单个变量,也可以定义一个数组,比如:

int8 x[10];

结构体类型同样也可以用于定义结构体数组,比如 

mystruct_T mystruct_array[10]

这样,我们就有了结构体数组。

下面我们一起看看如何在模型里建模或者配置,让生成的 C 代码里出现结构体变量、结构体嵌套和结构体数组。

开始介绍之前,请大家记住两点:

C 代码中的结构体变量跟模型中的 Bus 信号相对应

C 代码中的结构体类型跟模型中的 Bus 对象相对应

一. 结构体变量的代码实现

有模型如下:

代码

数据字典中有 Bus对象 myBus 定义如下:

代码

将 Inport 端口的数据类型设置为 myBus,Inport 的外观发生变化,变成环形。为控制结构体变量的变量名如我们所期望,在信号线上设置信号名 x、y。然后在数据字典中分别定义信号对象 x、y。将 x、y 的数据类型设置为 myBus,如下图:

代码

当然,x、y 的存储类设置跟非结构体代码生成一样,这里分别设置为 ImportedExtern 和 ExportedGlobal。

除此之外,还需要把 BusCreator 的输出数据类型设置为 myBus,如果你没做这个设置, Embeded Coder 会提醒你设置。

做好上述设置,以及代码生成的基本设置之后,Build 模型,代码就有了,你会发现结构体类型 myBus 的定义如下:

typedef struct 

{

real_T a;

real_T b;

real_T c;

} myBus;

变量 y 的定义如下:myBus y;

变量 x 的声明如下:extern myBus x;  

二. 结构体嵌套的代码实现

在上述例子中的数据字典中再定义一个 Bus 对象 subBus,如下图:

代码

再将 myBus 中的元素 c 的数据类型改为 subBus,模型做相应的调整如下:

代码

Build 模型,代码中 myBus 的定义如下:

typedef struct 

{

real_T a;

real_T b;

subBus c;

} myBus;

其中 subBus 定义如下:

typedef struct 

{

real_T u;

real_T v;

} subBus;

数据字典中信号对象 x 和 y 的定义跟前面的例子一样,结构体变量 x 和 y 在代码中的定义也跟前面的例子一样,整个算法的实现函数如下:

void nestStructModel_step(void)

{

y.a = K * x.a;  

y.b = K * x.b;  

y.c.u = K *x.c.u;  

y.c.v = K *x.c.v;

}

很显然,结构体嵌套,对应到模型中,就是 Bus 嵌套。

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

全部0条评论

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

×
20
完善资料,
赚取积分