中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

  • 176查看
  • 0回复

[Simulink] MBD的Simulink使用技巧⑨:代码数据类型的修改和控制

[复制链接]


该用户从未签到

发表于 2-3-2024 09:51:27 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


全文约3000字,你将看到以下内容:


    写在前面

    Simulink数据类型基本介绍

    在模块中修改数据类型

    在“Model Data Editor”中设置数据类型

    数据类型替换

autoMBD最近发布了《autoMBD原创技术文章合集》
合集包含156页丰富的MBD入门基础和MBDT硬件支持包的使用还包含基于MBD的电机控制算法开源项目——AMBD-MC合集配备了丰富的视频讲解
和大量的模型、文档和软件资源

如何获取请参考@所有读者:autoMBD发布《autoMBD原创技术文章合集》。

本篇文章是MBD的Simulink使用技巧系列第9期文章,将介绍Simulink数据类型的修改和控制方法。

点击以下链接,可以查看MBD的Simulink使用技巧系列的往期文章:

    MBD的Simulink使用技巧①:Simulink代码生成的基本概念MBD的Simulink使用技巧②:详解代码生成中的模型与代码MBD的Simulink使用技巧③:虚拟子系统与原子子系统的代码生成MBD的Simulink使用技巧④:详解生成代码的结构与代码的生成流程
    MBD的Simulink使用技巧⑤:详解自动代码生成的配置与优化

    MBD的Simulink使用技巧⑥:代码生成目标配置工具

    MBD的Simulink使用技巧⑦:自动生成代码的集成方法

    MBD的Simulink使用技巧⑧:函数原型、传参的控制与修改

    MBD的Simulink使用技巧⑧(续):函数接口封装的控制和修改

特别提示:在本篇文章中使用到的PI控制器模型等文件,可以在autoMBD资源库的“临时资源分享”文件夹中找到(资源序号为tA22、tA31)。资源库链接的获取可以在《autoMBD原创技术文章合集》中找到(见文章开头)。

1  写在前面

Simulink数据类型和存储类是两个不同的概念,数据类型控制着数据的宽度、精度、有无符号等;而存储类则控制数据存储的位置,或指示数据的来源。

下图的思维导图可以简单对比Simulink数据类型和存储类的区别:

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w1.jpg

Simulink数据对比 - From autoMBD

Tips:存储类和数据的组织形式,在后续的文章中再进行详细介绍,本期文章介绍数据类型相关技巧。

2  Simulink数据类型基本介绍

在《MBD的Simulink使用技巧②:详解代码生成中的模型与代码》中,我们已经介绍了模型数据的基本形式,包括:



    信号(Signals)

    参数(Parameters)

    状态(States)

    模型数据(Model Data)

这些模型数据是模块本身、以及模块之间的交互信息,而Simulink数据类型是这些模型数据信息的属性,会极大影响生成代码的具体实现。

具体而言,Simulink内置的数据类型有:



    浮点数:double(64 bits),single(32 bits)

    无符号整型数:uint64uint32uint16uint8boolean,char

    有符号整型数:int64int32int16int8
上述这些Simulink数据类型是仅在模型中使用的,生成的代码分别对应的C语言数据类型如下:

    浮点数:real_T(64 bits),real32_T,(32 bits)
    无符号整型数:uint64_Tuint32_Tuint16_Tuint8_Tboolean_Tchar_T

    有符号整型数:int64_Tint32_Tint16_Tint8_T

Tips:定点数不属于内置的数据类型,它需要用户自定义,我们主要讨论浮点数和整型数。
Simulink模型默认的数据类型为double,以保证仿真精度。在建模时,Simulink模型有一套自己的数据类型继承和传播机制,在大多数情况下开发者无需考虑模型数据的数据类型的问题即可正常建模和仿真。

然而在嵌入式系统中,最常使用的是整型数,数学运算过程中会使用单精度浮点数(甚至定点数)。所以使用模型生成嵌入式代码,就必须考虑数据类型的设置与修改。

Tips:嵌入式系统一般为32位系统,虽然也能运行和使用double数据类型,但效率更低、速度更慢,会消耗更多空间。在非必须的情况下,一般只会使用单精度浮点数。

以初始PI控制器模型tA22为例(经后文的修改后的模型为tA31),下面介绍几种修改数据类型的方法。

3  在模块中修改数据类型
点开大部分的Simulink模块,都能看到Signal Attributes、Parameters Attributes或State Attributes,可以直接在这些地方修改数据类型,如下所示:

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w2.jpg

模块中的数据类型配置1 - From autoMBD

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w3.jpg

模块中的数据类型配置2 - From autoMBD

模块不多的情况下,可以使用这个方法设置数据类型。当模块非常多时,一个一个点开模块进行配置将变得低效,一般不建议这样操作。

4  在“Model Data Editor”中设置数据类型
该方法是更加推荐的方法,可以通过下图的方式打开“Model Data Editor”窗口(快捷键Ctrl+Shift+E):

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w4.jpg

Model Data Editor - From autoMBD

注意区分“Model Data Editor”和第8期中介绍的“Code Mappings - C”窗口,它们都能对模块生成代码进行控制、修改,但负责的内容是完全不一样的。“Code Mappings - C”窗口只能在Embedded Coder工作视图下打开。

在“Model Data Editor”中,可以看到有很多标签页,包括:


    Inports/Outputs

    Signals

    Data Store

    States
    Parameters

对于生成代码而言,Inports/Outputs和Signals都属于模型数据中的信号类型,Data Store和States都属于状态类型。只不过它们之间具有一些不同的其他属性。

“Model Data Editor”中显示了模型当前层级中所有模块的信号、状态、参数,以及其他配置信息,可以直接进行修改,而不需要点开具体模块。子系统中的模块需要进入子系统的层级查看和修改。

除了数据类型,它也能修改很多其他配置选项,例如名称、初始值、采样时间等。

当然它还有其他功能,后续介绍数据字典(Data Dictionary)的时候会进一步介绍它。

特别提示,在“Model Data Editor”窗口的左上角有一个窗口选项:



    Design
    Instrumentation

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w5.jpg

窗口选项 - From autoMBD

要设置各个模块的参数属性,请选择“Design”窗口,即上文介绍的窗口。

“Instrumentation”窗口针对信号(Inports/Outputs和Signals)提供了额外的功能,即:


    Test Point
    Log Data

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w6.jpg

Instrumentation窗口 - From autoMBD

对于某个信号,如果勾选了“Test Point”,那么生成代码时将会生成一个模块数据变量:model_B。

例如上图对Err信号勾选了“Test Point”,此时Err信号线上会出现一个放大镜的小标记,如下所示:

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w7.jpg

Test Point - From autoMBD

“Test Point”生成的模块数据变量如下:
/* 文件:autoMBD_example_PI_DataTypes.h *//* Block signals (default storage) */typedefstruct {  real_T Err;                        /* '<Root>/Sum2' */} B_autoMBD_example_PI_noSubsTP_T;/* 文件:autoMBD_example_PI_DataTypes.c *//* Block signals (default storage) */B_autoMBD_example_PI_noSubs_T autoMBD_example_PI_noSubs_B;原本Err信号只生成一个局部临时变量,而此时有一个专门的全局模块数据变量保存它,其他函数可以方便地访问。
如果模型中有特别重要的内部信号(非输入输出信号)需要单独输出,那么可以采用这种方式,这样可以避免增加不必要的输入输出端口。
“Log Data”仅对仿真起作用,不影响代码生成。某信号勾选“Log Data”后,仿真过程中的数据会被“Data Inspector”(如下图所示)记录,方便用户查看,这里不做过多介绍。

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w8.jpg

Data Inspector - From autoMBD

5  数据类型替换在模型的系统设置中,可以控制全局的数据类型。例如将默认的double数据类型修改为Single数据类型:

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w9.jpg

模型设置中修改默认数据类型 - From autoMBD
此时生成的代码中,所有的浮点数全都变成了32位单精度浮点数(real32_T),生成的代码如下:/* 文件:autoMBD_example_PI_DataTypes.h *//* Block signals (default storage) */typedefstruct {  real32_T Err;                        /* '<Root>/Sum2' */} B_autoMBD_example_PI_noSubsTP_T;
/* Block states (default storage) for system '<Root>' */typedefstruct {  real32_T DiscreteTimeIntegrator_DSTATE;/* '<Root>/Discrete-Time Integrator' */} DW_autoMBD_example_PI_noSubsT_T;
/* External inputs (root inport signals with default storage) */typedefstruct {  real32_T Req_Ctrl;                   /* '<Root>/Req_Ctrl' */  real32_T Feedback;                   /* '<Root>/Feedback' */} ExtU_autoMBD_example_PI_noSub_T;
/* External outputs (root outports fed by signals with default storage) */typedefstruct {  real32_T PI_Ctrl;                    /* '<Root>/PI_Ctrl' */} ExtY_autoMBD_example_PI_noSub_T;实际中还可能遇到另外一个问题:项目中数据类型的名称可能和Simulink内置的数据类型不同。例如NXP电机算法库的数据类型名称为:


    浮点数:tFloattDouble

    无符号整型数:tU64tU32tU16tU8tBool

    有符合整型数:tS64tS32tS16tS8

名称不同会被认为是不同的数据类型,不能直接交互,给数据传递带来了麻烦。可以通过数据类型替换“Data Type Replacement”进行替换,如下所示:
MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w10.jpg

替换默认数据类型 - From autoMBD
上图中,将默认的real32_T数据类型替换成了tFloat(仅以此为例,其他替换是相同的)。特别注意,在生成代码前,还要在工作空间中新建一个名为tFloat的Alias数据对象。新建的方法为:首先在模型中打开模型浏览器,然后选择“Base Workspace”,然后在工具栏中选择Add -> Simulink AliasTpye,此时得到一个Alias数据对象,修改它的名称为tFloat,修改它的Base Tpye为single。详细过程如下图所示:
MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w11.jpg

打开模型浏览器 - From autoMBD

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w12.jpg

新建Alias数据对象 - From autoMBD

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w13.jpg

修改名称和Base type - From autoMBD
此时应该能在工作空间中看到该数据对象:

MBD的Simulink使用技巧⑨:代码数据类型的修改和控制w14.jpg

得到的tFloat Alias数据对象 - From autoMBD
完成上述工作后,生成代码如下:/* 文件:autoMBD_example_PI_DataTypes.h *//* Block signals (default storage) */typedefstruct {  tFloat Err;                          /* '<Root>/Sum2' */} B_autoMBD_example_PI_noSubsTP_T;
/* Block states (default storage) for system '<Root>' */typedefstruct {  tFloat DiscreteTimeIntegrator_DSTATE;/* '<Root>/Discrete-Time Integrator' */} DW_autoMBD_example_PI_noSubsT_T;
/* External inputs (root inport signals with default storage) */typedefstruct {  tFloat Req_Ctrl;                     /* '<Root>/Req_Ctrl' */  tFloat Feedback;                     /* '<Root>/Feedback' */} ExtU_autoMBD_example_PI_noSub_T;
/* External outputs (root outports fed by signals with default storage) */typedefstruct {  tFloat PI_Ctrl;                      /* '<Root>/PI_Ctrl' */} ExtY_autoMBD_example_PI_noSub_T;可以看到原本所有的real32_T都被替换成了tFloat。生成的代码中,是通过typedef的方式实现的数据类型替换,如下所示:/* 文件:rtwtypes.h *//* Define Simulink Coder replacement data types. */typedef real32_T tFloat;    /* User defined replacement datatype for real32_T */这种方式是全局替换,不需要在模块中,或者在“Model Data Editor”进行任何修改,更加方便快捷。Tips:上述所有操作后的模型,可以在autoMBD资源库的“临时资源分享”文件夹中找到该模型,资源序号tA31。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 22-11-2024 21:27 , Processed in 0.296509 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.