0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于结构体变量建模的分析和解读

MATLAB 来源:djl 作者:董淑成 2019-09-12 09:46 次阅读

结构体变量建模之终极解决方案—上篇中提到:

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

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

下面我们来看看结构体数组。

三. 结构体数组的代码实现

从前面结构体变量和结构体嵌套的两个例子,我们也可以很清楚的体会到这两点。所以,结构体数组,对应到模型中,自然也就是多维的 Bus 信号了。

关于结构体变量建模的分析和解读

对图中 Inport 端口的 Data type 设置为 Bus: myBus,Port dimensions 设置为 2;数据字典中和信号 x 对应的信号对象 x 做同样的设置,即 Datatype为Bus: myBus,Dimensions 为2。Selector 模块分别选中两维信号的第一维和第二维。两组信号经过运算之后,再次通过 Bus Creator 模块组合成 Bus 信号,再把两路 Bus 信号使用 Vector Concatenate 模块连成维数为 2 的 Bus 信号 y。

信号对象 x、y 除了数据类型设置为 Bus: myBus 之外,Storage Class 均设置为 ExportedGlobal。

由此,就有了如下结构体类型的定义:

typedefstruct

{

real_T a;

real_Tb;

real_T c;

} myBus;

和结构体数组的定义:

myBus x[2];

myBus y[2];

或许你已经注意到几个增益模块的参数值被设置为 k.a,k.b,k.c,没错,既然 myBus 作为结构体类型是一种组合数据类型,同样也可以使用这个 myBus 设置参数 k 的数据类型,只是,一旦参数对象 k 的数据类型被设置为 myBus,那么参数的初始化就不像以前那么简单的。本例设置如下:

k.Value = struct(‘a’,2, ‘b’,3, ‘c’,4);

如果参数k的存储类设置为 ConstVolatile,那么代码中参数 k 的定义如下:

const volatilemyBus k =

{

2.0,

3.0,

4.0

};

四. For-Each和结构体数组的结合

上例中 Bus 信号的维数为 2,所以我们很轻松的使用了 Selector 模块,把两维数据分别取出来实现后续算法,而现实中,我们可能面临几十甚至上百维的 Bus 信号,而后续的处理算法,对于每一维来讲都是一致的,这种情况下怎么办?我们可以想象得见,代码中是可以通过一个 For 循环去实现的,模型当然也可以,这就是 For-Each 子系统。

关于结构体变量建模的分析和解读

双击上图中的 For-Each 子系统,得到下图:

关于结构体变量建模的分析和解读

这个模型中 Inport 和 x、y 信号对象的 Dimensions 为 100。生成代码之后,除了 x、y 两个结构体数组的维数变成 100 之外,算法中有如下代码:

关于结构体变量建模的分析和解读

结合 For-Each 模块,让我们的结构体数组建模更为方便。本想就此结束本篇,想到还会有人惦记另外一些结构体相关的话题,就再说一说:

五.位域结构体的代码实现

Simulink 参数对象和信号对象的存储类(Storage Class)里面都有 BitField (Custom) 选项,必须要说明的是,如果你的数据类型设置为 boolean,并且存储类选择为 BitField,是可以生成位域结构体变量的,只是,正如上一篇微文有网友留言所说,这样做没法指定结构体元素的顺序,当然也没有 Bus 与之对应。

如果我们想得到我们期望的结构体变量,比如:

typedef struct

{

unsigned char a:1;

unsigned char a1:1 ;

unsigned char a2:1;

unsigned char a3:1;

unsigned char a4:1;

unsigned char a5:1;

unsigned char a6:2;

}myBitFieldBus;

或者:此结构体类型中,前 6 个元素各占 1 个 bit,而第 7 个元素占 2 个 bit。模型如下:

关于结构体变量建模的分析和解读

显然,Inport 端口的数据类型应该为 myBitFieldBus,信号对象 input 也一样。

数据字典中定义了 myBitFieldBus 如下:

关于结构体变量建模的分析和解读

不难看出:

myBitFieldBus 内的元素 a,a1,a2,a3,a4,a5,均为 boolean 类型,a6 为 uint8;

Bus 对象 myBitFieldBus 的 Data scope 为 Imported,并且定义在头文件。

mybitfieldstruct.h 文件中,也就是说,结构体类型 myBitFieldBus 不在这个模块中定义,为了能够生成代码,需要提供 mybitfieldstruct.h 文件。

做完上述设置之后,生成代码,如下:

typedef struct

{

boolean_T Out1;

boolean_T Out2;

boolean_T Out3;

boolean_T Out4;

boolean_T Out5;

boolean_T Out6;

unit8_TOut7;

}ExtY_bitfieldstruct_T;

myBitFieldBus input;

xtY_bitfieldstruct_T bitfieldstruct_Y;

void bitfieldstruct_step(void)

{

bitfieldstruct_Y.Out1 = input.a;

bitfieldstruct_Y.Out1 = input.a1;

bitfieldstruct_Y.Out1 = input.a2;

bitfieldstruct_Y.Out1 = input.a3;

bitfieldstruct_Y.Out1 = input.a4;

bitfieldstruct_Y.Out1 = input.a5;

bitfieldstruct_Y.Out1 = input.a6;

}

还要什么?指向结构体变量的指针?那就把前面几个例子里的 x、y、input 等信号对象的存储类设置为 ImportedExternPointer 就可以了,没什么特别的。

最后:

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

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

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

    关注

    8

    文章

    7074

    浏览量

    89137
  • 结构体
    +关注

    关注

    1

    文章

    130

    浏览量

    10852
收藏 人收藏

    评论

    相关推荐

    VirtualLab Fusion:系统建模分析

    ,系统建模分析器。本文档介绍该工具的使用方法 系统建模分析器 如何运行建模分析器 系统
    发表于 01-04 08:45

    仿真分析误差来源及减少建模误差的方法

    一、建模误差 建模误差是仿真分析中最常见的误差来源之一。它主要源于物理系统与其数学模型之间的差异。在建模过程中,为了简化计算,往往会对实际物理系统进行一定的抽象和假设,如忽略小洞和其他
    的头像 发表于 12-24 09:52 350次阅读
    仿真<b class='flag-5'>分析</b>误差来源及减少<b class='flag-5'>建模</b>误差的方法

    VirtualLab:系统建模分析

    ,系统建模分析器。本文档介绍该工具的使用方法。 系统建模分析器 如何运行建模分析器 系统
    发表于 12-19 12:36

    VirtualLab Fusion应用:用于抑制高衍射级次的角滤波光栅

    ,以抑制不需要的高衍射阶数。为此,首先分析光栅的角度灵敏度。 最后,通过使用 VirtualLab Fusion 进行仿真,显示了对不期望的高衍射级次的抑制效果。 建模任务 volume
    发表于 12-09 12:51

    结构成员的顺序会影响结构的大小吗

    相同的结构成员,如果把顺序调整一下,会不会影响结构的大小? 答案是会的,这主要跟字节对齐有关。 比如这样的结构
    的头像 发表于 11-25 16:24 202次阅读

    matlab 神经网络 数学建模数值分析

    matlab神经网络 数学建模数值分析 精通的可以讨论下
    发表于 09-18 15:14

    《嵌入式机电一化系统设计与实现》读后感

    。通过阅读本书,我不仅掌握了嵌入式系统与机电一化系统的基本知识和技能,还培养了分析问题和解决问题的能力。这些能力的提升将对我未来的学习和工作产生积极的影响。 总之,《嵌入式机电一
    发表于 08-21 08:45

    神经网络在数学建模中的应用

    数学建模是一种利用数学方法和工具来描述和分析现实世界问题的过程。神经网络是一种模拟人脑神经元结构和功能的计算模型,可以用于解决各种复杂问题。在数学建模中,神经网络可以作为一种有效的工具
    的头像 发表于 07-02 11:29 974次阅读

    关于螺栓监测系统的专业解读

    关于螺栓监测系统的专业解读 电网的螺栓是一种紧固件,用于连接铁塔的各个部分,使其成为一个整体。螺栓的紧固程度直接影响到铁塔的稳定性和安全性。如果螺栓松动,可能会导致铁塔的结构变形,甚至倒塌,给
    的头像 发表于 06-20 10:46 351次阅读

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构在内
    的头像 发表于 06-04 08:04 495次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    嵌入式中C语言结构基本实现

    :     在struct 中声明了一个含有若干新成员的数据类型。     tag  是结构标签。     member-list  是标准的变量定义,比如 int i; 或者 float f,或者其他
    的头像 发表于 05-11 08:49 1058次阅读
    嵌入式中C语言<b class='flag-5'>结构</b><b class='flag-5'>体</b>基本实现

    求助,关于G031ADC结构设置的几个疑问求解

    本人在使用ADC时想使用多通道模式,所以便在CUBEMX上将十九个通道全部打开(包括三个内部通道),生成代码以后详细看了一下结构的配置发现有几个疑惑, 1.ADC通道分为规则通道和注入通道,那么
    发表于 03-15 07:03

    gis建模与空间分析的区别

    进行比较和解析。 首先,GIS建模是指将现实世界的地理实体和现象通过计算机技术和方法表达出来,用数字化的方式模拟、描述和分析。GIS建模可以分为两个方面,即地理数据模型和地理过程模型。
    的头像 发表于 02-25 14:57 980次阅读

    LC串联谐振拓扑仿真建模及控制策略分析

    拓扑是直流高压电源中最为常用的拓扑结构。上一期内容中我们对LC串联谐振变换器的工作原理进行了分析,今天继续为大家分享LC串联谐振变换器的仿真建模及控制策略分析。根据
    的头像 发表于 02-24 08:21 1541次阅读
    LC串联谐振拓扑仿真<b class='flag-5'>建模</b>及控制策略<b class='flag-5'>分析</b>

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构可以
    的头像 发表于 01-11 08:00 1010次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系