文件

通过应用自定义存储类控制数据表示

要在生成的代码中控制变量的声明和定义,请使用嵌入式编码器可用的自定义存储类®.您可以使用自定义存储类将多个定义或声明导出到单个生成的文件,创建结构和位字段,并将存储类型限定符附加到声明。

要使用自定义存储类,可以:

  • 将它们应用于数据对象,例如金宝appSimulink.Parameter.金宝appsimulink.signal.,您将与信号线,块参数和状态相关联。看数据对象(金宝appSimulink)

    您还可以将自定义存储类应用于金宝appSimulink.LookupTable金宝appsimulink.breakpoint.您使用根据ASAP2和AutoSAR标准包装查找表数据的对象。

  • 通过模型数据编辑器、特性检查器、对话框和嵌入的信号对象为信号线和块状态指定它们。这些技术不需要在工作区中存储数据对象。

然后,自定义存储类确定生成的代码如何表示信号、参数和状态。

为了实现一系列目标,例如将变量分组为扁平结构,或控制声明和定义文件放置,请使用内置包中的自定义存储类金宝app.有关这些自定义存储类的功能的详细信息,请参阅金宝appSimulink包自定义存储类

的自定义存储类金宝app包不满足您的要求,可以定义自己的自定义存储类。有关定义自己自定义存储类的基本信息,请参阅设计自定义存储类和内存部分

从中应用自定义存储类金宝app使用数据对象包

从内置包应用自定义存储类的步骤金宝app到数据项(信号,块参数或状态):

  1. 在模型中,选择看法>模型数据

  2. 在模型数据编辑器中,选择与目标数据项类型对应的选项卡。

  3. 在模型中,选择目标信号线或块(对于参数或状态)。模型数据编辑器突出显示相应的行。

  4. 开始将目标数据项与数据对象关联。

    • 对于块参数,在其中价值列中,将参数值设置为希望数据对象具有的名称(例如,mycalparam.).然后,点击按钮在参数值旁边选择创建

    • 对于信号或状态,在名称列,为信号或状态命名(例如,mysig).然后,点击按钮旁边的名字和选择创建和解决

  5. 在“创建新数据”对话框中,设置价值金宝appSimulink.Parameter.(对于块参数)或金宝appsimulink.signal.(对于信号或状态)。

  6. (可选)使用位置下拉列表,以选择存储数据对象的工作区。默认值为为基本工作空间

  7. 点击创建.新对象显示在目标工作区中。将打开对象的“属性”对话框。

  8. 使用“属性”对话框配置对象。例如,指定一个值(价值)的参数对象。使用。应用目标自定义存储类存储类

为数据对象创建和指定自定义存储类

您可以在没有型号的情况下创建和配置数据对象。使用Model Explorer。

  1. 在模特资源管理器中模型层次结构窗格,选择要包含数据对象的工作空间。

  2. 点击添加参数创建金宝appSimulink.Parameter.对象。创建一个金宝appsimulink.signal.对象,点击添加信号

  3. 在里面内容窗格中,单击名为的新数据对象帕纳或者s默认情况下。

  4. 在里面对话窗格,在下拉列表中存储类, 选择ExportTofile(自定义)

  5. 在下面自定义属性,指定自定义存储类所需的其他代码生成设置。例如,指定标题文件作为mydatahdr.h.

以编程方式为数据对象创建和指定自定义存储类

%创建数据对象。例如,创建一个%s金宝appimulink.parameter对象。myParam = 金宝appSimulink.Parameter (15.23);%指定称为ExportTofile的自定义存储类。myparam.coderinfo.storageclass ='风俗'; myParam.CoderInfo.CustomStorageClass=“ExportToFile”%指定该数据对象的自定义属性。myParam.CoderInfo.CustomAttributes.HeaderFile='mydatahdr.h'

使用数据对象创建并应用您自己的自定义存储类

要创建自己的自定义存储类,必须创建数据类包并在包中定义自定义存储类。之后,您可以将自定义存储类应用于信号、块参数和状态:

  1. 从数据类包中创建数据对象。例如,如果您为您的包命名mypackage.,您可以创建数据对象,例如mypackage.Parameter.mypackage.signal.

  2. 配置数据对象属性,包括代码生成设置。指定您定义的自定义存储类。

  3. 将数据对象与模型中的信号、块参数或状态关联。例如,在“块参数”对话框中指定参数对象的名称,或使用信号对象的名称命名模型中的信号。

有关如何通过创建和应用自定义存储类来控制生成的代码的示例,请参见通过创建自定义存储类来控制数据代码

为数据对象指定自定义存储类

假设您定义了数据类包mypackage.和自定义存储类exportdeftofile.在那个包裹里。

  1. 在模特资源管理器中模型层次结构窗格,选择要包含数据对象的工作空间。

  2. 单击旁边的箭头添加参数.在下拉列表中,选择定制类列表

  3. 在对话框中,下参数类,选中旁边的复选框mypackage.Parameter..点击好的

  4. 单击旁边的箭头添加参数再次。在下拉列表中,选择mypackage参数

    一个新的数据对象出现在工作区中。默认对象名称为帕纳

  5. 在里面内容窗格,选择新的数据对象。在里面对话窗格,在下拉列表中存储类, 选择ExportDeftofile(定制)

  6. 在下面自定义属性,指定自定义存储类所需的其他代码生成设置。例如,假设使用的数据对象exportdeftofile.要求您指定定义文件。您可以指定DefinitionFile作为mydatasrc.c.

以编程方式为数据对象指定自定义存储类

假设您定义了数据类包mypackage.和自定义存储类exportdeftofile.在那个包裹里。

%从包中创建数据对象。例如,创建一个%mypackage.parameter对象。myparam = mypackage.parameter(15.23);%指定自定义存储类exportdeftofile。myparam.coderinfo.storageclass ='风俗'; myParam.CoderInfo.CustomStorageClass='exportdeftofile'%指定该数据对象的自定义属性。例如,假设%ExportDeftoFile需要每个数据对象的定义文件。myparam.coderinfo.customattributes.definitionFile =.“myDataSrc.c”

将自定义存储类直接应用到信号线、块状态和外港

通过对话框和模型数据编辑器(参见使用模型数据编辑器配置数据属性(金宝appSimulink)),您可以直接应用自定义存储类到信号线和块状态。您不需要存储在工作区或数据字典中的数据对象。但是,您不能在工作空间中使用信号对象来指定信号或状态的其他特征,例如数据类型。

从内置包应用自定义存储类的步骤金宝app通过使用对话框,对于信号,请使用“信号属性”对话框。对于块状态,使用状态属性选项卡在“块”对话框中。

  1. 打开代码生成“信号属性”对话框中的选项卡,或状态属性选项卡在块对话框中。

  2. 指定名称信号名称框或州名称盒子。点击申请

  3. 在里面存储类下拉列表,选择自定义存储类。

要从其他包应用自定义存储类:

  1. 打开代码生成标签在信号属性中对话框或状态属性选项卡在块对话框中。

  2. 指定名称信号名称框或州名称盒子。点击申请

  3. 在里面信号对象类下拉列表,通过选择目标包定义的信号对象类来选择一个包。例如,要从内置包应用自定义存储类金宝app, 选择金宝appsimulink.signal.

    如果所需的类未出现在列表中:

    1. 在下拉列表中选择定制类列表

    2. 在对话框中,下信号类,选中所需类旁边的复选框。例如,要从内置包中使用自定义存储类邮电部,选中旁边的复选框mpt.signal..点击好的

      如果您创建了自己的包,只有在当前文件夹中或Matlab上的包文件夹中才会在对话框中显示包定义的类®路径

    3. 从下拉列表中,选择与所选内容对应的选项。例如,选择mpt.signal.

  4. 在里面存储类下拉列表,选择自定义存储类。

将自定义存储类应用于根级外港块,使用模型数据编辑器。还可以使用“模型数据编辑器”(Model Data Editor)通过可以排序、分组和筛选的列表将自定义存储类应用于信号。看见使用Model Data Editor配置数据接口

以编程方式将自定义存储类直接应用于信号,状态和外港使用嵌入式信号对象的块

您可以使用嵌入式信号对象将自定义存储类应用于信号线和块状态。嵌入式信号对象不会出现在工作区中,因此您无需在单独的文件中保存对象。但是,您可以使用嵌入式信号对象仅指定自定义存储类,关联的自定义属性和对象的别名。您必须在源块对话框中指定其他信号或状态特征,例如数据类型。

如果为信号或状态创建嵌入式信号对象,则无法在工作区中使用信号对象来指定信号或状态的其他特征。信号或状态名称仅解析为嵌入式信号对象。

将嵌入的信号对象附加到一个信号或状态:

  1. 在工作区(如基本工作区)中创建临时信号对象。

  2. 指定自定义存储类和关联的自定义属性。

  3. 以编程方式将对象赋值为:

    • 如果目标是信号,则相应的块出口

    • 如果目标是状态,则相应的块状态

  4. (可选)从工作区中删除临时信号对象。

此示例显示如何将嵌入的信号对象附加到模型中的信号。

  1. 打开示例模型RTWDEMO_SECONDorDordersystem.

    RTWDEMO_SECONDorDordersystem.

  2. 为块命名为力的输出创建句柄:f(t)。

    porthandles = get_param(“rtwdemo_第二订单系统/强制:f(t)”...“PortHandles”); outportHandle=portHandles.Outport;

  3. 将相应信号的名称设置为强调

    set_param(OutportHandle,'姓名''forightnignal'

  4. 在基本工作空间中,创建信号对象并指定自定义存储类和相关自定义属性。

    tempobj = 金宝appsimulink.signal;tempobj.coderinfo.storageclass ='风俗';tempObj.CoderInfo.CustomStorageClass =“ExportToFile”;tempObj.CoderInfo.CustomAttributes.HeaderFile ='myhdrfile.h'

    可以从数据类包创建对象金宝app,或来自任何其他包,例如您创建的包。

  5. 通过附加临时工作区对象的副本,将信号对象嵌入到目标信号线中。

    set_param(OutportHandle,'signalObject', tempObj);

  6. 清除基础工作区的对象。该信号现在使用对象的嵌入式副本。

    清晰的坦波布

若要修改现有的嵌入式信号对象,请将对象复制到基本工作空间中,修改副本,并重新附加副本。例如,更改附加到信号的嵌入式信号对象的自定义存储类强调

  1. 将现有的嵌入式信号对象复制到基础工作区中。

    tempObj = get_param (outportHandle,'signalObject');

  2. 修改工作区中对象的属性。

    tempobj.coderinfo.customstorageclass =“ImportFromFile”;tempObj.CoderInfo.CustomAttributes.HeaderFile ='myotherhdrfile.h'

  3. 重新附加信号对象的副本。

    set_param(OutportHandle,'signalObject',tempObj);清楚的坦波布

将嵌入式信号对象附加到根级别外港块,使用该功能set_param.,指定块参数SignalName命名块表示的信号。使用参数signalObject.嵌入信号对象。

要将嵌入式信号对象附加到块状态,请使用set_param.函数,指定块参数attnename.命名国家。使用参数StateSignalObject嵌入信号对象。

将嵌入式信号对象附加到使用a定义的数据存储数据存储内存Block,使用Block参数StateSignalObject.您不需要指定状态名称,因为数据存储已经有名称。

指定特定于实例的属性

自定义存储类可以具有定义特定于该CSC的属性的属性。调用此类属性实例特定属性. 例如,如果指定结构体自定义存储类,则必须指定将存储数据的C语言结构的名称。该名称是的实例特定属性结构体CSC。

数据对象具有调用的属性CoderInfo,它存储类的一个对象金宝appsimulink.coderinfo.. 实例特定的属性存储在金宝appsimulink.coderinfo.财产CustomAttributes..此属性最初定义如下:

金宝appSimulinkCSC.AttribClass\u Simulink\u默认1x1结构数组,不带字段

指定自定义存储类时,Simulink金宝app®自动填充CoderInfo.CustomAttributes使用字段表示该CSC的特定于实例的属性。例如,如果您设置数据对象的存储类MyObj结构体,然后输入:

MyObj.CoderInfo.CustomAttributes

MATLAB显示:

金宝appsimulinkcsc.attribclass_simulink_struct structname:''

指明structname.我的结构, 进入:

MyObj.CoderInfo.CustomAttributes.StructName =“MyStruct”

MATLAB显示:

金宝appsimulinkcsc.attribclass_simulink_struct structname:'mystruct'

表列出了自定义存储类从内置包中的特定于实例属性金宝app定义。当数据对象使用其中一个自定义存储类时,您可以在对象中指定相应的实例特定属性值。

自定义存储类名 实例特定属性 目的
位菲尔德 customattributes.structname.structname. 位域的名称塑造代码生成器将对象的布尔数据包装到其中。
ExportToFile CustomAttributes.HeaderFile 标题名称(。H)包含导出的变量声明和对象导出指令的文件。
GetSet CustomAttributes.HeaderFile 标题名称(。H)归档#包括在生成的代码中。看见通过自定义存储类GetSet函数访问数据
customAttributes.getFunction. 指定函数调用以读取数据的名称。
customAttributes.setfunction. 指定要写入数据的函数调用的名称。
ImportedDefine CustomAttributes.HeaderFile 定义代码变量预处理器条件值的头文件。看见为变量系统生成预处理器条件
ImportFromFile CustomAttributes.HeaderFile 标题名称(。H)包含全局变量声明的文件,代码生成器导入对象。
结构体 customattributes.structname.structname. 的名字塑造代码生成器将对象的数据打包到其中。

如果你使用分组自定义存储类,您无法在特定于实例的基础上指定其许多属性。分组的自定义存储类将多条数据组合成单个数据结构。使用此格式的数据必须具有相同的属性,例如标题文件数据范围, 和数据初始化.例如,自定义存储类位菲尔德结构体通过使用单个结构变量表示生成的代码中的多个数据对象。

使用自定义存储类生成代码

此示例显示如何通过使用自定义存储类和数据对象来控制生成代码中的数据表示。

在为使用自定义存储类的模型生成代码之前,请清除配置参数>忽略自定义存储类型号选项。否则,代码生成器忽略自定义存储类规范,并将数据对象视为它们的数据对象存储类金宝appSimulinkGlobal

上述模型包含三个命名信号:AA.BB., 和CC.. 使用结构体自定义存储类,示例生成代码将这些信号打包到塑造命名为mysignals..这塑造声明然后导出到外部编写的代码。

指定塑造, 你提供金宝appsimulink.signal.指定的对象结构体自定义存储类,并将对象与如下所述的信号相关联使用数据对象从Simulink包中应用自定义存储类金宝app.三个物体具有相同的属性。要查看属性,请双击工作区浏览器(基本工作区)中的一个对象。

命名相同的模型信号和信号对象之间的关联形成于符号解析(金宝app模型)。在这个例子中,符号AA.BB., 和CC.解析到信号对象AA.BB., 和CC.,有自定义存储类结构体.在生成的代码中,三个信号的存储将分配到塑造命名为mysignals.

要在模型中显示信号的存储类,请选择展示>信号和港口>存储类在Simuli金宝appnk编辑器中。下图显示了具有信号数据类型和信号存储类的框图。

通过定义模型的信号对象并将其与信号关联起来,您可以生成使用自定义存储类来为信号生成所需数据结构的代码。在代码生成之后,相关的定义和声明位于三个文件中:

  • 模型_types.h定义以下内容塑造用于存储三个信号的类型:

    typedef struct mysignals_tag {boolean_t bb;UINT8_T AA;UINT8_T CC;mysignals_type;
  • 模型。C(或者.cpp)定义变量mysignals.,如特定于对象实例的规定structname.属性。为交换机块生成的代码引用变量:

    /*自定义存储类的定义:Struct*/mySignals\u type mySignals={/*cc*/FALSE,/*bb*/0,/*aa*/0};../*开关:'/Switch1'*/if(mySignals.cc){rtb_Switch1=mySignals.aa;}else{rtb_Switch1=mySignals.bb;}
  • 模型。H出口mySignals结构多变的:

    / *自定义存储类声明:struct * / extern mysignals_type mysignals;

使用Model Data Editor配置数据接口

使用模型数据编辑器将存储类应用于inport.外港块,信号线,数据存储和块状态。使用此技术应用存储类而不在模型中定位块和信号并通过使用单个列表来配置模型的数据接口。

要从特定包应用自定义存储类,请使用模型资源管理器从目标包创建信号对象。然后,当您打开模型数据编辑器时,存储类列显示来自目标包的自定义存储类。

  1. 在模特资源管理器中模型层次结构窗格中,选择为基本工作空间

  2. 在工具栏中,单击旁边的箭头添加信号按钮。

  3. 在下拉列表中,选择定制类列表

  4. 在里面定制类列表对话框,从目标包中选择一个信号类。点击好的

  5. 在“模型资源管理器”工具栏中,单击旁边的箭头添加信号按钮。

  6. 在下拉列表中,选择目标信号类。

    目标信号类的对象出现在基本工作区中。(可选)删除此不必要的对象。

  7. 使用模型数据编辑器将自定义存储类从目标包应用于其他数据项。在模型数据编辑器中,在存储类列时,下拉列表允许您从目标包中选择自定义存储类。

要了解如何使用模型数据编辑器配置数据接口,请参见使用模型数据编辑器配置数据接口

使用自定义存储类别声明和接口数据

自定义存储类允许您使用几乎任何类型的数据声明和接口。该模型显示了具有嵌入式编码器提供的若干预定义的自定义存储类中的三个。在此示例中,通过“信号属性...”对话框指定自定义存储类,并通过MATLAB工作空间中的Simulink参数对象的“信号属性...”对话框指定信号。金宝app

打开示例模型rtwdemo_cscpredef

open_system ('RTWDEMO_CSCPREDEF'

  • 输入信号使用自定义存储类结构体

  • 常量参数使用自定义存储类植物

  • 输出信号使用自定义存储类位菲尔德

您可以使用自定义存储类设计器:

  • 创建新的自定义存储类

  • 来自其他包的引用自定义存储类

要启动自定义存储类设计器,请键入CSCDesigner.在命令提示符下。

指定默认值#包括数据头文件的语法

要控制生成代码中数据项(如信号线或块状态)的文件位置,可以对数据项应用自定义存储类(参见自定义存储类简介).然后你使用标题文件自定义属性指定包含数据声明的生成或自定义头文件。

以减少维护工作和数据输入,当您指定标题文件,你可以省略分隔符(或者<>)仅使用文件名。然后,您可以控制生成的代码用于相应的默认分隔符#包括指令。若要默认使用尖括号,请设置配置参数>代码生成>代码放置>#include文件分隔符#include

代码生成存储位置对参数对象的影响

您可以在基础工作区,模型工作区或数据字典中创建参数对象。但是,当您将存储类或自定义存储类应用于对象时,对象的位置可能会影响生成的代码中的相应数据定义的文件放置。看参数对象的存储位置的影响

自定义存储类限制

  • 数据对象不能具有自定义存储类和多字数据类型。

  • Fcn块不支持在代码生成中具有自定义金宝app存储类的参数。

  • 对于使用引用模型的模型中的自定义存储类:

    • 如果将分组的自定义存储类应用于多个数据项,则自定义存储类数据范围财产必须设置为进口并且,您必须在自定义标题文件中提供数据声明。分组自定义存储类在生成的代码中使用单个变量来表示多个数据对象。例如,自定义存储类位菲尔德结构体分组自定义存储类。

    • 如果你储存一个金宝appSimulink.Parameter.对象,如果任何引用的模型使用该对象,则不能应用自定义存储类文件镜对该对象。

      但是,如果模型引用层次结构中只有一个模型使用参数对象,则可以将该对象存储在该模型的模型工作空间中,然后应用该对象文件镜

    • 假设模型引用层次结构中的两个模型工作区包含每个模型金宝appSimulink.Parameter.具有相同名称的对象。如果对象使用除此之外的存储类汽车,由于标识符冲突,您无法生成代码。您无法应用自定义存储类文件镜防止标识符冲突。

  • 您无法应用自定义存储类文件镜到数据交换接口(C API、外部模式或ASAP2)或mat文件日志所使用的数据项。文件范围的数据不能从外部访问。

  • 如果你存储一个自动搜索参数对象在模型工作区中,代码生成器忽略您为对象指定的存储类。

相关话题

这个主题有用吗?