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

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

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

  • 120查看
  • 0回复

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

[复制链接]
  • TA的每日心情
    无聊
    1-7-2015 18:46
  • 签到天数: 1 天

    [LV.1]初来乍到

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

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


    本期是数据对象(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窗口如下所示:
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w3.jpg

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

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

    Bus Editor窗口 - From autoMBD
    前面提到:“总线”是一种灵活的自定义数据类型。下图以常数模块为例,展示总线数据类型的使用。
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w5.jpg

    常数模块 - From autoMBD

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

    设置常数模块的数据类型为总线数据类型 - From autoMBD
    实际上任何数据,包括总线的子元素,都可以设置为“总线数据类型”,即总线数据类型是可以嵌套使用的。要实现总线数据类型的嵌套,只需要将子元素的Data Type设置为嵌套的总线数据类型即可。如下所示:
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w7.jpg

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

    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w9.jpg
    ),如下所示:

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

    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窗口时,会提示保存总线数据(如下图所示)。如果不保存,创建的总线数据在关闭软件后会丢失,所以切记要保存数据。

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

    保存总线数据 - From autoMBD

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

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

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

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



    )是不一样的。按钮生成的是Simulink.Parameter数据对象和结构数据的脚本,而这里生成的是Bus总线。
    也可以使用模型管理器编辑总线数据类型,语句如下:sfexplr;
    MBD的Simulink使用技巧?:详解数据对象与数据字典(中)w16.jpg

    模型管理器窗口 - 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对象是类似的。如下图所示:

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

    新建Simulink枚举类型 - From autoMBD

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

    编辑和管理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  本期小结

    由于总线数据类型和枚举数据类型比较重要,所以又单独开了一篇文章进行介绍。

    快速发帖

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

    本版积分规则

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

    GMT+8, 1-5-2024 11:30 , Processed in 0.508074 second(s), 30 queries .

    Powered by Discuz! X3.5

    © 2001-2013 Comsenz Inc.