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

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

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

搜索附件  
汽车工程师之家 附件中心 结构原理专业知识特区 『Matlab-Simulink-Advisor论坛』 MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w10.jpg
左侧广告
附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w10.jpg

 

MBD的Simulink使用技巧?:详解数据对象与数据字典(中):
本期是数据对象(Data Objects)和数据字典(Data Dictionary)的第二篇,点击这里查看上一篇。

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

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

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

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

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

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

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

    MBD的Simulink使用技巧⑩:数据存储类的使用方法

    MBD的Simulink使用技巧?:详解数据对象与数据字典(上)

特别提示:在本篇文章中使用到的.m脚本等文件,可以在autoMBD资源库的“临时资源分享”文件夹中找到(资源序号为tA35)。资源库链接的获取可以在《autoMBD原创技术文章合集》中找到(见文章开头)。
在上一期文章中介绍了几种常用的MATLAB数据对象和Simulink数据对象。本期将介绍两个较为特殊但也很常用的数据类型(数据对象):Bus(总线)和枚举数据类型。

1  总线数据类型

Bus(总线)数据类型也属于Simulink数据对象,实际应用中非常频繁,也具有独特的编辑工具,所以单独拎出来介绍。

Simulink中的“总线”是一种灵活的自定义数据类型,可以创建包含若干不同数据类型的集合体。它可以被认为等价于C语言中的“结构体”数据类型,它生成的代码也就是结构体数据类型。

Tips:任何形式的数据,包括数据类型、数值变量等,都可以当作是数据对象。

在Simulink中使用总线,可以简化模型结构、优化建模方法;而在嵌入式开发中会提升代码的结构性和可读性。因此使用好总线数据对象对MBD开发是非常重要的。

总线数据对象的创建有两种方式,下面分别做介绍。

1.1 Bus Editor工具

Bus Editor工具是专门用来创建、管理和设计总线数据对象的。可以在MATLAB的命令行中输入如下语句来打开Bus Editor工具:

buseditor;Bus Editor窗口如下所示:


Bus Editor窗口 - From autoMBD
通过工具栏中的按钮可以很方便地实现总线数据类型的创建、添加元素、剪切、复制和删除操作(上图中创建了一个名为myBusObject_A的总线数据类型)。在窗口的右边可以对总线数据类型进行编辑和设置。选中子元素,也能对子元素进行编辑和设置,如下所示:



Bus Editor窗口 - From autoMBD
前面提到:“总线”是一种灵活的自定义数据类型。下图以常数模块为例,展示总线数据类型的使用。


常数模块 - From autoMBD



设置常数模块的数据类型为总线数据类型 - From autoMBD
实际上任何数据,包括总线的子元素,都可以设置为“总线数据类型”,即总线数据类型是可以嵌套使用的。要实现总线数据类型的嵌套,只需要将子元素的Data Type设置为嵌套的总线数据类型即可。如下所示:


总线之间的嵌套和引用 - From autoMBD
上图中,b0子元素的Data Type设置为了前面创建的myBusObject_A。此时b0便是子总线,包含两个子元素。
在实际中,总线的嵌套可能会很复杂、嵌套很多层,如何合理的管理总线之间的嵌套引用关系,是值得提前考虑周全的。
当用户选中某个总线后,工具栏中的两个灰色按钮将会变为可用状态(



),如下所示:



Bus Editor窗口 - From autoMBD
这两个按钮是用来生成.m脚本的。按钮

会生成一段自动创建Simulink.Parameter数据对象的脚本,设置其数据类型为所选的总线数据类型,并赋结构数据初值。生成的脚本如下所示:%% ------------------------------------------------------------------%  You can modify the valuesof the fieldsin myBusObject_B_MATLABStruct%  andevaluate this cell tocreate/update myBusObject_B_Param%  in the MATLAB base workspace.% -------------------------------------------------------------------myBusObject_B_MATLABStruct = struct;myBusObject_B_MATLABStruct.b0 = struct;myBusObject_B_MATLABStruct.b0.a0 = 0;myBusObject_B_MATLABStruct.b0.a1 = 0;myBusObject_B_MATLABStruct.b1 = 0;
myBusObject_B_Param = Simulink.Parameter;myBusObject_B_Param.Value = myBusObject_B_MATLABStruct;myBusObject_B_Param.CoderInfo.StorageClass = 'Auto';myBusObject_B_Param.Description = '';myBusObject_B_Param.DataType = 'Bus: myBusObject_B';myBusObject_B_Param.Min = [];myBusObject_B_Param.Max = [];myBusObject_B_Param.DocUnits = '';
clear myBusObject_B_MATLABStruct;按钮

仅生成总线数据类型对应的结构数据初值,生成的脚本如下所示:%% ------------------------------------------------------------------%  You can modify the valuesof the fieldsin myBusObject_B_MATLABStruct%  andevaluate this cell tocreate/update this structure%  in the MATLAB base workspace.% -------------------------------------------------------------------myBusObject_B_MATLABStruct = struct;myBusObject_B_MATLABStruct.b0 = struct;myBusObject_B_MATLABStruct.b0.a0 = 0;myBusObject_B_MATLABStruct.b0.a1 = 0;myBusObject_B_MATLABStruct.b1 = 0;自动生成的脚本可以方便后续修改或使用。当然,编码能力强的可以自己写脚本。当用户尝试关闭Bus Editor窗口时,会提示保存总线数据(如下图所示)。如果不保存,创建的总线数据在关闭软件后会丢失,所以切记要保存数据。



保存总线数据 - From autoMBD

保存时有两种格式可选:.mat和.m。

前者直接保存数据,后续使用时直接加载到工作空间即可;后者为总线创建自动生成的.m脚本,运行一遍脚本即可得到创建的总线数据类型。

当选择.m格式保存时,还会提示生成Cell还是Object,两者效果一样,建议选择Object。

Tips:这里生成的脚本和上文中的按钮(



)是不一样的。按钮生成的是Simulink.Parameter数据对象和结构数据的脚本,而这里生成的是Bus总线。
也可以使用模型管理器编辑总线数据类型,语句如下:sfexplr;


模型管理器窗口 - From autoMBD

在模型管理器中,也可以对元素进行简单编辑,但功能较少,这里不再赘述。点击“Launch Bus Editor”按钮打开Bus Editor工具。

特别提示,如果想要使用Bus Editor工具编辑和修改数据字典中的总线数据类型(对象),只能通过“Launch Bus Editor”按钮打开。buseditor语句打开的是针对base workspace的总线数据。

1.2 m脚本

在上一期中有脚本展示如何创建总线数据类型(对象),这里不再赘述。

用户也可以通过保存数据对象时,选择.m格式,通过生成的脚本来学习如何创建总线数据对象。

Tips:在MATLAB中,m脚本是极为强大的,在复杂的场景下,使用脚本往往能极大地提高MBD开发的效率。读者要有意识提升写m脚本的能力。MBD开发的自动化处理,指的就是使用脚本来处理数据和模型。

2  枚举数据类型

枚举数据类型在Simulink中也是一种非常特别的数据形式。由于嵌入式开发中也会大量的使用枚举数据类型,所以在模型中使用枚举数据也是常见需求。

不过Simulink对枚举数据的支持,似乎并不太完善,某些情况下也存在一些限制。

枚举数据有两种创建方法:Simulink Enumerated Type和系统枚举类型。下面对它们分别进行介绍。

2.1 Simulink枚举对象

Simulink枚举类型(Simulink Enumerated Type)也是一种对象,它的类型的类名称为:

    Simulink.data.dictionary.EnumTypeDefinition
它属于数据字典的一个句柄类,所以它只能在数据字典中创建,在Base workspace中不能创建,Base workspace中只能通过句柄来访问Simulink枚举数据类型。Tips:特别更正,上一篇文章中,提到的Simulink.data.dictionary.Section和 Simulink.data.dictionary.Entry也属于句柄类,并非子类。getSection和getEntry等函数得到的是句柄,而非真正的数据类。
创建Simulink枚举对象之前,需要先创建好数据字典(创建方法见上一期)。

在模型管理器中,Simulink枚举类型/对象的创建、编辑和管理方法和其他Simulink对象是类似的。如下图所示:



新建Simulink枚举类型 - From autoMBD



编辑和管理Simulink枚举类型 - From autoMBD

这里也给一个使用m脚本编辑Simulink枚举类型的示例(通过句柄),供读者参考:
% autoMBD示例脚本% 展示Simulink枚举数据的基本创建方法% 创建时间2023-02-24
%% 清空数据clear; clc;
%% 创建数据字典if (exist('myDictionary.sldd', 'file'))    ddObj = Simulink.data.dictionary.open('myDictionary.sldd');else    ddObj = Simulink.data.dictionary.create('myDictionary.sldd');end
sectionObj = getSection(ddObj, 'Design Data');
%% 新建一个枚举数据对象的句柄:myEnumTypeHandlemyEnumTypeHandle = Simulink.data.dictionary.EnumTypeDefinition;
% 设置枚举数据myEnumTypeHandle.removeEnumeral(1);myEnumTypeHandle.appendEnumeral('myenum0', 0);myEnumTypeHandle.appendEnumeral('myenum1', 1);myEnumTypeHandle.appendEnumeral('myenum2', 2);myEnumTypeHandle.appendEnumeral('myenum3', 3);
%% 将枚举数据类型添加到数据字典中if (exist(sectionObj, 'myEnumType'))    enumObjEntry = getEntry(sectionObj, 'myEnumType');else    enumObjEntry = addEntry(sectionObj, 'myEnumType', myEnumTypeHandle);end
% 保存修改saveChanges(ddObj);
%% 使用枚举数据类型% 配置Simulink.Parameter数据类型为myEnumType,并设置枚举值为myenum1paramObjHandle = Simulink.Parameter;paramObjHandle.DataType = 'Enum: myEnumType';paramObjHandle.Value = myEnumType.myenum1;
% 显示配置结果disp(paramObjHandle.Value);
% 将Simulink参数对象添加到数据字典if (exist(sectionObj, 'paramObjEnum'))    paramObjEntry = getEntry(sectionObj, 'paramObjEnum');else    paramObjEntry = addEntry(sectionObj, 'paramObjEnum', paramObjHandle);end
% 保存修改saveChanges(ddObj);
%% 显示数据字典show(ddObj);Tips:上述脚本可以在临时资源分享中找到,资源序号tA35。但Simulink枚举数据类型在使用时存在一些限制。由于它属于数据字典的一部分,Base workspace不能直接访问(只能通过句柄访问),脚本中的一些函数(方法)在处理与它相关的数据时,会发生错误。例如函数:


    S
    imulink.Bus.createMATLABStruct

    Simulink.Bus.createObject

这两个函数常在脚本中用来生成总线的初值或参数对象,类似于上文介绍的Bus Editor工具中的两个按钮:




如果总线中包含了Simulink枚举数据类型,这两个函数不能直接在m脚本中对总线生成结构体数据或对象。

Tips:或许是我使用的方法不对,但只要总线存在Simulink枚举数据类,这两个函数总是出错。欢迎知道正确方法的读者和我交流。

这也是上一期中不推荐Simulink枚举数据,而是使用系统枚举数据。系统枚举数据可以解决该问题。

2.2 系统枚举数据

那么何为系统枚举数据?先看如下.m脚本:
%autoMBD示例脚本%展示系统枚举数据的基本创建方法%创建时间2023-02-24
classdefmySysEnum < Simulink.IntEnumTypeenumerationenum0(0)enum1(1)enum2(2)enum3(3)enum4(4)endendTips:上述脚本可以在临时资源分享中找到,资源序号tA35。创建一个包含上述内容的.m脚本,并把该脚本放在MATLAB或Simulink能访问的有效路径中(Active Path),那么该枚举类型对所有.m脚本和模型都起作用。

相当于在MATLAB和Simulink全局定义了一个枚举类型,所以把它称为系统枚举类型。

Tips:实际上它是一种自定义类,引用了内置的类Simulink.IntEnumType,这里不介绍相关内容,感兴趣的可以自行了解。

它也有一些限制,例如不能放在数据字典中,只能以.m文件的形式存在。但脚本的各种函数处理系统枚举类型是没有限制的。

总体而言,Simulink枚举类和系统枚举类在使用上差别并不大,某些限制也可以有其他办法解决。但为了.m脚本能更好的处理枚举数据,建议使用系统枚举数据类型。

3  本期小结

由于总线数据类型和枚举数据类型比较重要,所以又单独开了一篇文章进行介绍。
MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w10.jpg
         同一主题附件:
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w3.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w4.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w5.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w6.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w7.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w8.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w9.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w10.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w13.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w16.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w17.jpg
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w18.jpg

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

GMT+8, 9-5-2024 07:02 , Processed in 0.339908 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.