主要内容

创建存储类通过使用自定义存储类设计师

控制数据的出现在生成的代码中,您可以使用内置的存储类等ExportToFile(见参数数据组织成一个结构通过使用结构体存储类)。如果内置的存储类不符合您的需求,您可以创建自己的存储类。创建一个存储类,您可以应用数据对象,创建一个包的存储类使用自定义存储类设计师。看到定义存储类、内存部分,为软件架构和功能模板

定义一个存储类,您可以应用在模型中通过使用映射编辑器的代码,使用嵌入式编码字典。或创建存储类的包,把包从嵌入编码字典。

一个包还定义了信号参数数据类。看到数据对象。一个数据对象从一个包等金宝app可以使用在这个包中定义的存储类而不是其他包中定义的存储类。

使用自定义信息存储类设计器创建内存部分,明白了控制数据和函数放置在内存中插入语法

创建和应用存储类

这个例子展示了如何控制生成的代码从一个模型通过创建和应用自己的存储类数据对象。

探索模型示例

打开模型rtwdemo_cscpredef。你可以控制生成的代码从这个模型通过定义您自己的数据类和创建自己的存储类。

在本例中,您出口的声明和定义多个信号和参数模型中的一个声明头文件和一个定义文件。

创建数据类包

要创建存储类,您首先创建一个数据类包包含存储类定义。从你的包可以使用数据对象创建包定义的存储类。

  1. 创建您自己的数据类包通过复制示例包文件夹+金宝app SimulinkDemos。导航到示例包文件夹。

    %记住当前文件夹的路径currentPath = pwd;%导航到示例包文件夹demoPath =“\工具箱\仿真软件金宝app\ simdemos \ dataclasses”;cd ([matlabroot demoPath])

  2. 复制+金宝app SimulinkDemos文件夹到您的剪贴板。

  3. 回到你的工作文件夹。

    cd (currentPath)

  4. 粘贴+金宝app SimulinkDemos从剪贴板到你的工作目录文件夹。重命名复制的文件夹+ myPackage

  5. 内导航+ myPackage文件夹的文件Signal.m编辑的定义信号类。

  6. 取消的方法部分定义了方法setupCoderInfo。在调用函数useLocalCustomStorageClasses、替换“packageName”“myPackage”。当您完成时,部分出现如下:

    方法函数setupCoderInfo (h)从这个包%使用自定义存储类useLocalCustomStorageClasses (h,“myPackage”);结束结束%的方法

    这个函数useLocalCustomStorageClasses允许您应用的存储类myPackage定义数据对象创建myPackage

  7. 保存并关闭该文件。

  8. 内导航+ myPackage文件夹的文件Parameter.m编辑的定义参数类。取消的方法部分定义了方法setupCoderInfo和替换“packageName”“myPackage”

  9. 保存并关闭该文件。

创建存储类

您可以使用自定义存储类设计器来创建或编辑数据的存储类类包定义。

  1. 设置当前文件夹的文件夹包含包myPackage

  2. 打开自定义存储类设计师。

    cscdesigner (“myPackage”)
  3. 选择存储类ExportToFile

  4. 的名字场,重命名的存储类ExportToGlobal

  5. 头文件从下拉列表中,改变选择具体的实例指定。在新的领域,提供的头文件名称global.h

  6. 定义文件从下拉列表中,改变选择具体的实例指定。在新的领域,提供定义文件名称global.c

  7. 点击好吧。点击是的将更改保存到数据类包myPackage

应用存储类

应用自己的存储类,你从包创建数据对象和配置使用您的存储类的对象。

  1. 创建数据对象来表示一些模型参数和信号的例子。使用数据类包创建的对象myPackage

    %的参数templimit = myPackage.Parameter (202);pressurelimit = myPackage.Parameter (45.2);O2limit = myPackage.Parameter (0.96);rpmlimit = myPackage.Parameter (7400);%的信号tempalarm = myPackage.Signal;pressurealarm = myPackage.Signal;O2alarm = myPackage.Signal;rpmalarm = myPackage.Signal;
  2. 设置每个对象的存储类ExportToGlobal

    %的参数templimit.CoderInfo。StorageClass =“自定义”;templimit.CoderInfo。CustomStorageClass =“ExportToGlobal”;pressurelimit.CoderInfo。StorageClass =“自定义”;pressurelimit.CoderInfo。CustomStorageClass =“ExportToGlobal”;O2limit.CoderInfo。StorageClass =“自定义”;O2limit.CoderInfo。CustomStorageClass =“ExportToGlobal”;rpmlimit.CoderInfo。StorageClass =“自定义”;rpmlimit.CoderInfo。CustomStorageClass =“ExportToGlobal”;%的信号tempalarm.CoderInfo。StorageClass =“自定义”;tempalarm.CoderInfo。CustomStorageClass =“ExportToGlobal”;pressurealarm.CoderInfo。StorageClass =“自定义”;pressurealarm.CoderInfo。CustomStorageClass =“ExportToGlobal”;O2alarm.CoderInfo。StorageClass =“自定义”;O2alarm.CoderInfo。CustomStorageClass =“ExportToGlobal”;rpmalarm.CoderInfo。StorageClass =“自定义”;rpmalarm.CoderInfo。CustomStorageClass =“ExportToGlobal”;
  3. 选择信号仿真软件名称必须决心信号对象金宝app选项为每个模型中目标信号。您可以选择的选项通过使用信号属性对话框,解决列在模型数据编辑器,或者使用命令行。

    %信号tempalarmportHandles = get_param (“rtwdemo_cscpredef / RelOp1”,“PortHandles”);outputPortHandle = portHandles.Outport;set_param (outputPortHandle“MustResolveToSignalObject”,“上”)%信号pressurealarmportHandles = get_param (“rtwdemo_cscpredef / RelOp2”,“PortHandles”);outputPortHandle = portHandles.Outport;set_param (outputPortHandle“MustResolveToSignalObject”,“上”)%信号O2alarmportHandles = get_param (“rtwdemo_cscpredef / RelOp3”,“PortHandles”);outputPortHandle = portHandles.Outport;set_param (outputPortHandle“MustResolveToSignalObject”,“上”)%信号rpmalarmportHandles = get_param (“rtwdemo_cscpredef / RelOp4”,“PortHandles”);outputPortHandle = portHandles.Outport;set_param (outputPortHandle“MustResolveToSignalObject”,“上”)

生成代码

  1. 生成的代码示例模型。

    slbuild (“rtwdemo_cscpredef”)
  2. 在代码视图模型、视图生成的头文件global.h。该文件包含了走读生声明模型的信号和参数,使用存储类ExportToGlobal

    / *自定义存储类的声明:ExportToGlobal * /走读生boolean_T O2alarm;走读生real_T O2limit;走读生boolean_T pressurealarm;走读生real_T pressurelimit;走读生boolean_T rpmalarm;走读生real_T rpmlimit;走读生boolean_T tempalarm;走读生real_T templimit;

  3. 查看生成的文件global.c。文件包含的定义模型信号和参数,使用存储类ExportToGlobal

    / *定义自定义存储类:ExportToGlobal * / boolean_T O2alarm;real_T O2limit = 0.96;boolean_T pressurealarm;real_T pressurelimit = 45.2;boolean_T rpmalarm;real_T rpmlimit = 7400.0;boolean_T tempalarm;real_T templimit = 202.0;

修改一个内置的存储类

您不能直接修改内置存储类,如ExportToFile金宝app包,但您可以创建一个副本,然后修改副本。当您创建一个新的包,没有csc_registration.m文件,然后打开自定义存储类设计师首次在这个包中,仿真软件内置的存储类的定义复制到包中。金宝app然后,在自定义存储类设计器中,您可以修改复制定义。另外,保持可用的内置存储类包,复制其中一个点击复制,然后修改生成的副本。

控制数据表示通过配置存储类属性

自定义存储类设计程序是一个工具,用于创建和管理存储类和记忆的部分。打开自定义存储类设计为一个特定的计划,例如,+ mypkg在命令提示符处,使用cscdesigner功能:

cscdesigner (“mypkg”)

文件夹的名称代表一个包开始+。当你使用这个函数cscdesigner,省略了+从目标包的名称。

控制影响存储类数据模型中,您指定的属性存储类的自定义存储类设计师。来决定如何生成一种特殊的代码,使用信息表中。

类型的数据在生成的代码 技术
结构 类型FlatStructure。看到生成结构化数据
数据初始化和明确的信号。看到生成一个宏
指针 数据访问指针数据范围汽车,进口,或具体的实例。外部代码必须定义的指针变量。
静态数据(file-scoped数据) 数据范围文件
常量挥发性数据 记忆的部分指定的内存区常量,挥发性,或两者兼而有之。例如,使用一个内置的内存区域MemConst,MemVolatile,MemConstVolatile。创建自己的内存部分,明白了控制数据和函数放置在内存中插入语法
调用外部函数来读取和写入数据 看到调用自定义访问器函数或宏变量而不是阅读和写作

允许用户指定属性值的存储类

存储类的一些属性,比如数据范围指定一个值,而是在自定义存储类设计器中,您可以允许用户存储类指定值。您可以创建一个灵活的存储类代替多个存储类,只有几个属性值不同。

例如,假设您创建一个收益率一个全局变量的存储类生成的代码。您可以配置存储类,以便用户可以设置数据范围财产出口为一个信号模型和设置属性进口不同的信号。

每个属性的自定义存储类设计师,以这种方式,你想配置,设置属性值具体的实例。然后,当用户应用存储类数据项,呈现给用户的财产作为一个数据项的自定义属性。特定的自定义属性的信息,请参阅存储类属性

生成一个宏

创建一个存储类产生一个宏生成代码,设置数据初始化和明确的信号

当您设置数据初始化,定义文件没有意义。防止用户存储类指定一个毫无意义的定义文件,在自定义存储类设计师,集定义文件指定,把文本框为空。

  • 在头文件中定义宏(#定义),指定的头文件的名称头文件财产。

  • 提供宏定义的编译器选项或编译器标志,集数据访问进口头文件指定。离开头文件文本框为空。然后,生成的代码没有定义宏和不包括(# include一个头文件。

    指定编译器选项或标志,使用模型配置参数配置参数>代码生成>自定义代码>额外的构建信息>定义了。看到代码生成窗格:自定义代码:额外的构建信息:定义

生成结构化数据

创建一个存储类聚合数据项为平面结构(类似于内置的存储类结构体),设置类型FlatStructure。的结构属性选项卡出现了。

  • 控制全局结构变量的名称出现在生成的代码中,使用结构体名称属性和文本框。

  • 如果你设置结构体名称具体的实例,用户的存储类指定结构变量的名称。在这种情况下,代码生成器结构类型的名称来自变量的名称。

    更精确地控制的名称和其他结构类型的特点,集结构体名称指定。控制类型特点使用出现的附加属性。

  • 生成一个位域结构(类似于内置的存储类设置),选择Bit-pack布尔值。使用的数据类型的数据项布尔生成的代码中出现的一些字段结构。

控制分配初始值在生成的代码

  • 使用默认的金宝app®编码器™初始化策略,设置数据初始化默认值,汽车

    • 生成的代码静态初始化参数数据与一个赋值语句的顶部。c. cpp源文件以外的任何功能。

    • 动态生成的代码初始化信号和状态数据作为模型的初始化函数(命名模型_initialize默认情况下)。

  • 静态初始化数据集数据初始化静态

  • 动态初始化数据集数据初始化动态

  • 防止生成的代码初始化数据集数据初始化没有一个。当你的外部代码初始化数据,使用此设置防止生成的代码覆盖你的初始化。

调用自定义访问器函数或宏变量而不是阅读和写作

使用内置的存储类GetSet生成的代码,您可以调用您的外部,自定义函数而不是直接互动的变量。对于一般信息GetSet,请参阅通过与存储类GetSet函数访问数据

创建一个类似的存储类,集类型AccessFunction

  • 指定外部函数的名称。

    • 应用相同的得到函数命名方案使用的存储类数据项,设置获取函数集函数指定。然后,在文本框中,指定函数命名方案,例如,get_myData_ $ N。使用令牌$ N在一个命名方案来表示每个数据项的名称。如果你不使用令牌,每个数据项使用相同的指定得到函数名,所以该模型生成代码时生成一个错误。

    • 指定一个不同得到为每个数据项函数名,集获取函数集函数具体的实例。稍后,当您创建一个数据项和应用存储类,指定的函数名配置数据项的自定义属性。

  • 指定声明的头文件的名称得到功能与头文件财产。在这种情况下,定义文件没有意义。为了防止存储类的用户指定一个毫无意义的定义文件,设置定义文件指定,把文本框为空。

  • 如果你实现了得到标量或数组数据作为宏观机制而不是一个函数,你可以生成代码读取数据时省略了括号。在访问函数属性选项卡上,选择通过宏观获取数据(省略括号)

使用数据从外部代码生成代码

当你的外部代码定义了数据,为了避免产生重复的定义,您必须配置生成的代码来读写的现有数据。在自定义存储类设计师,集数据范围进口。代码生成器不生成定义全局变量或宏。

  • 如果您的代码定义了一个指针变量,生成的代码与指针,交互集数据访问指针

  • 如果你通过设置生成结构化数据类型FlatStructure,代码必须定义结构类型和全球结构变量。

  • 如果您的代码初始化状态或信号数据,可以防止生成的代码覆盖你的初始化设置数据初始化没有一个。看到防止重复全局变量的初始化代码

生成代码注释数据定义和声明

定制的评论出现在生成的代码中,在评论选项卡,设置评论规则指定。指定一个评论每个数据项的声明,使用声明发表评论盒子。指定的评论出现定义,使用定义注释盒子。

结构化数据(设置类型FlatStructure),指定一个评论,出现结构类型定义,使用类型的评论盒子。

避免错误在代码生成验证存储类配置

当你配置一个自定义存储类中存储类设计师,检查可能的错误配置,点击验证

例如,验证存储类警告你如果你不小心设置数据初始化信号选中。一个信号不能出现在生成的代码作为一个宏。

提供存储类以外的当前文件夹中

使用您创建的存储类,您必须定义包可用。要么设置当前文件夹的文件夹包含包或包含包文件夹的文件夹添加到MATLAB®路径(见MATLAB搜索路径是什么?)。将包添加到MATLAB路径使您能够使用存储类不管你在哪里设置当前文件夹。

提供存储类在代码映射编辑器

使用基于包的存储类在代码映射编辑器中,把包从嵌入式编码字典。配置嵌入式编码字典引用包,看到的参考代码生成定义在一个包中

包之间共享存储类

当你创建一个包,您可以参考另一个包中定义的存储类,如内置的包金宝app或创建一个不同的包。然后,定义包和任何引用包可以使用存储类。当你想要改变存储类,你只改变一次,在定义包。

配置一个包来引用一个定义另一个包的存储类:

  1. 在自定义存储类设计器中,选择定制的存储类选项卡。

  2. 使用选择包选择引用的包。包装必须是可写的。

  3. 自定义存储类定义窗格中,选择下面的现有定义你想插入的参考。

  4. 点击新参考

    一个新的引用缺省名称和属性出现在之前选择的定义。选择和一个新的参考参考选项卡,显示了初始属性。

  5. 使用的名字指定一个新的引用的名称。导入包的名称必须是惟一的,但可以复制在源代码包的名称。这个名字不能TLC关键字。

  6. 引用自定义存储类的包指定包包含存储类要参考。

  7. 自定义存储类来引用指定存储类的引用。

  8. 点击好吧应用。永久保存更改时,单击保存

控制存储类的下拉列表

当你申请一个存储类数据项,你从一个下拉列表中选择存储类。

  • 控制自定义存储类的顺序在列表中,在自定义存储类设计器中,使用向上下来按钮。下拉列表的存储类的顺序匹配订单中指定自定义存储类设计师。

  • 防止用户的存储类应用存储类参数数据或信号和状态数据,使用为参数信号复选框。当你清楚这些属性之一,相应的类型的数据,存储类不出现在下拉列表中。

    例如,如果您的存储类产生一个宏在生成的代码,因为您设置数据初始化,以防止用户应用信号数据的存储类,清晰信号

保护自定义存储类定义

当你点击保存在自定义存储类设计师,设计师可以节省内存部分和存储类定义放入csc_registration.m文件在包文件夹。确定这个文件的位置,在自定义存储类设计器中,检查的价值文件名

可以防止修改整个包的存储类定义转换csc_registration.m从MATLAB文件文件档案。使用pcode函数。

一个最佳实践是保持csc_registration.mcsc_registration.p在你的包文件夹。这样,如果你修改存储类通过使用设计师,您可以删除csc_registration.p你后来再生后完成修改。因为p代码版本的文件优先,当两个文件包中存在,存储类保护,您不能修改自定义存储类设计师。

通过编写TLC代码进一步定制生成的代码

如果创建自己的存储类通过操纵属性自定义存储类设计师不符合您的需求,您可以精确控制生成的代码编写TLC代码存储类。使用一个自定义存储类的高级模式设计,存储类的集合类型其他。看到精确控制数据表示通过编写TLC存储类的代码

相关的话题