TA的每日心情 | 无聊 1-7-2015 18:46 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
本期是数据对象(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 本期小结
由于总线数据类型和枚举数据类型比较重要,所以又单独开了一篇文章进行介绍。
|
|