部署代码生成定义
如在为软件体系结构定义存储类、内存部分和函数模板,您可以创建您和其他用户可以应用到模型元素(如数据和函数)的代码生成定义。代码定义控制生成代码中这些元素的外观。
在拥有多个模型和用户的大型组织中,您可以通过将代码生成定义存储在一个相互可访问的位置来共享它们。共享代码定义的过程被称为部署.
在多个模型和用户之间共享代码生成定义
当您创建自定义代码生成定义时,在模型和其他用户之间共享定义:
当您使用自定义存储类设计器在包中创建定义时,对于每个用户,将包含包文件夹的文件夹放在MATLAB上®路径。有关更多信息,请参见什么是MATLAB搜索路径?(MATLAB)。
在嵌入式编码器字典中创建定义时,请将定义存储在Simulink中金宝app®数据字典。然后,将每个模型链接到单独的数据字典。配置每个单独的字典以引用包含代码生成定义的字典。示例请参见在模型之间共享嵌入式编码器字典定义.
用不同版本的Simulink创建的模型的字典用法金宝app
金宝appSimulink为嵌入式Coder提供版本处理®字典。当这些事件发生时,Simulink将同步数据字典中金宝app的数据,包括嵌入式编码器字典,以便与模型一起使用,而不管用于创建模型的Simulink版本是什么。
您将模型链接到保存在以前版本的Simulink中的数据字典(例如,您将在R2018b中开发的模型链接到保存在R2018a中的字典)。金宝app
您在一个比当前版本更老的Simulink版本中打开一个具有本地嵌入式编码器字典的模型(例如,您开发了一个在R2018a中使用本地字典的模型,并在R2018b中金宝app打开该模型以继续开发)。
您还可以选择导出(保存)一个嵌入式编码器字典,以便与使用不同版本(以前的或更老的)代码生成器创建的模型一起使用。
有关更多信息,请参见用不同版本的Simulink创建的模型的字典用法金宝app(金宝app模型)。
在共享字典中配置默认代码映射
在设置一个旨在由多个模型共享的嵌入式编码器字典时,您可以映射模型数据和函数类别的默认代码定义。在本例中,您将嵌入式编码器字典的默认代码定义映射到exSharedCodeDefs.sldd
.
如果尚未定义,请在数据字典中定义代码定义(存储类、函数自定义模板和内存部分)。对于本例,在数据字典中定义代码定义
exSharedCodeDefs.sldd
.将此文件的副本放在可写位置。在当前文件夹窗格的MATLAB命令窗口,双击您的拷贝的文件名
exSharedCodeDefs.sldd
.在模型层次结构窗格中的模型资源管理器,右键单击字典节点并选择显示空区域.模型资源管理器列出节点设计数据,配置,嵌入式编码器词典,其他数据.
打开嵌入式编码器字典。在模型层次结构窗格中,单击嵌入式编码器词典.然后,在右窗格中单击打开嵌入式编码器字典.
在“嵌入式编码器字典”工具栏中,单击配置默认值.
在“配置字典默认值”对话框中,配置数据和函数类别的默认代码定义。
在数据默认值选项卡,为这些数据类别配置存储类,如果适用,还配置内存部分,
模型元素类别 描述 港口 模型的根级输入端口。 外港 模型的根级输出端口。 模型参数 在模型中定义的参数,例如模型工作区中的参数。排除模型参数。 模型参数参数 在您配置为模型参数的模型工作区中阻塞参数。这些参数在模型块中公开,以使每个模型实例能够提供自己的值。要将参数指定为模型参数,请选择模型数据编辑器+参数+论点复选框。 外部参数对象 在基本工作区或数据字典中定义为对象的参数。应用程序中的多个模型可以使用这些参数。 共享本地数据存储 数据存储内存块与block参数跨模型实例共享集。这些数据存储只能在定义它们的模型中访问。数据存储值在模型的实例之间共享。 全局数据存储 由基本工作区中的信号对象或数据字典中定义的数据存储。应用程序中的多个模型可以使用这些数据存储。 内部数据 本地数据,如数据存储、离散块状态、块输出信号和过零信号。 常量 模型中恒定值的块输出和恒定参数。 在功能默认值选项卡,为以下功能类别配置功能定制模板和内存部分(如果适用):
型号功能分类 描述 初始化和终止 用于初始化和终止的入口点函数 执行 用于启动执行和重置的入口点函数 共享效用 共享实用功能
在整个模型中,类别的默认映射应用于类别中的元素。
对于本例,设置数据类别的存储类港口,外港,全局数据存储来
ExportedGlobal
.应用更改并关闭对话框。点击应用.然后,单击好吧.
关闭嵌入式编码器字典和模型资源管理器。
在模型之间共享嵌入式编码器字典定义
这个例子展示了如何创建一个存储类,在生成的代码中生成单独的全局变量,并在两个模型之间共享存储类,rtwdemo_roll
而且rtwdemo_advsc
.然后,配置每个模型以使用存储类作为内部数据的默认代码生成设置,其中包括块状态。
将共享代码生成定义存储在独立的数据字典中是一种最佳实践,这意味着没有模型直接链接到字典。然后,您可以将目标模型链接到一个或多个附加的中间字典,您可以配置它们以引用独立字典。使用这种模块化字典层次结构,每个模型都可以独立于代码生成定义存储其他数据,例如设计数据。
该图显示了一个字典层次结构示例。图中:
modelOne.slx
而且modelTwo.slx
是不同的模型文件。dataForModelOne.sldd
而且dataForModelTwo.sldd
是数据字典。每个字典都存储设计数据,例如某一模型的数值MATLAB变量。coderDefs.sldd
是一个共享数据字典,用于存储两个模型的代码生成定义。其他词典参考coderDefs.sldd
.
在独立数据字典中创建代码生成定义
创建数据字典。然后,在字典中创建存储类。
在命令提示符下,打开Model Explorer。
daexplr
在模型资源管理器中,选择文件>新>数据字典.
说出字典的名字
coderDefs.sldd
.在模型浏览器中模型层次结构窗格中,右键单击
coderDefs
并选择显示空区域.在模型层次结构窗格中,选择嵌入式编码器词典节点。
在对话框窗格(右窗格)中,单击打开嵌入式编码器字典.
在“嵌入式编码器字典”对话框中,单击添加.
对于新的存储类,在属性检查器窗格中,设置的名字来
internalsInFile
.在模型浏览器中模型层次结构窗格中,右键单击
coderDefs
并选择保存更改.
将模型链接到数据字典
将每个模型链接到单独的数据字典。配置每个字典以引用独立字典(coderDefs.sldd
).
打开模型。
rtwdemo_advsc rtwdemo_roll
在
rtwdemo_roll
,在建模选项卡,在设计画廊,点击链接到数据字典.在“模型属性”对话框中,单击新.
创建一个名为
rtwdemo_roll_data.sldd
使用“创建新的数据字典”对话框。在“模型属性”对话框中,单击好吧.
金宝appSimulink将模型链接到新字典。字典不包含任何数据,因为模型不使用基本工作区中的数据。
在Model Explorer中打开字典。在模型的左下角,单击模型数据徽章,然后单击数据字典链接。
在“对话框”窗格中,在引用字典,点击添加.
在“打开数据字典”对话框中,双击
coderDefs.sldd
.使用模型层次结构窗格以保存所做的更改
rtwdemo_roll_data.sldd
.链接
rtwdemo_advsc
一本名为rtwdemo_advsc_data.sldd
.rtwdemo_advsc
使用基本工作区中的变量。要将变量迁移到字典中,请在“模型属性”对话框中单击迁移数据.然后按照说明将模型链接到字典并复制引用的变量。配置
rtwdemo_advsc_data.sldd
参考coderDefs.sldd
.
在模型中应用代码生成定义
通过将共享定义应用为内部数据的默认设置并检查生成的代码,确认共享定义可以在模型中使用。
在
rtwdemo_roll
,按C代码选项卡。如果工具条没有显示C代码选项卡,打开嵌入式编码器应用程序。下代码的映射>数据默认值,为内部数据行,设置存储类来
internalsInFile
.在
rtwdemo_advsc
,使用Code透视图设置存储类来internalsInFile
为内部数据行。生成代码
rtwdemo_roll
.在代码查看、检查生成的文件
rtwdemo_roll.c
.该文件定义了与模型中的状态数据对应的全局变量,例如积分器阻塞在BasicRollMode
子系统。/*存储类'internalsInFile' */ real32_T rtwdemo__FixPtUnitDelay1_DSTATE;real32_T rtwdemo_roll_Integrator_DSTATE;int8_T rtwde_Integrator_PrevResetState;
生成代码(可选)
rtwdemo_advsc
并确认代码按预期显示。
将定义从模型文件迁移到共享数据字典
如果您在模型的嵌入式编码器字典中创建代码生成定义,那么定义将存储在模型文件中。如果你想在模型之间共享定义:
创建一个共享数据字典,如在模型之间共享嵌入式编码器字典定义.在进行下一步之前,请确保所有目标模型都可以访问共享字典。
使用
coder.dictionary.move
函数将定义从源模型文件迁移到共享数据字典。要迁移单个定义,请在“嵌入式编码器字典”对话框中使用减少而且粘贴快速访问工具栏上的按钮。
可选地,通过使用Code Mappings编辑器的编程接口,将Code Mappings编辑器设置从源模型复制到其他模型以编程方式配置默认数据和功能代码生成).
在本例中,您将在模型的嵌入式编码器字典中创建一个存储类,并在代码映射编辑器中使用该存储类。然后,将子系统转换为引用模型。为了对第一个模型和被引用的模型使用相同的Code Mappings编辑器设置,您必须将存储类提取到共享数据字典(.sldd
).
创建和应用存储类
打开示例模型
rtwdemo_roll
.rtwdemo_roll
单击C代码选项卡。如果工具条没有显示C代码选项卡,打开嵌入式编码器应用程序。
在框图下面的代码映射编辑器中,单击嵌入式编码器词典按钮.
在“嵌入式编码器字典”对话框中,在存储类选项卡上,单击添加.
对于新的存储类,设置这些属性值:
的名字来
internalsInFile
.头文件来
R_internal.h美元
.定义文件来
R_internal.c美元
.
在模型中,在代码映射编辑器中,用于数据默认值>内部数据行,设置存储类来
internalsInFile
.
创建引用模型
在模型中,右键单击
BasicRollMode
子系统和选择子系统与模型参考>转换为>引用模型.在模型引用转换顾问中,单击转换.
新的参考模型,
BasicRollMode
,打开。模型文件在您当前的文件夹中。
默认情况下,被引用的模型不能访问父模型的嵌入式编码器字典中的代码生成定义。现在,将存储类移出父模型并移到共享数据字典中。
将存储类移动到共享数据字典
作为最佳实践,将每个模型链接到单独的数据字典(.sldd
),创建一个共享的、独立的数据字典来存储代码生成定义(存储类),并配置字典引用,以便所有模型都可以使用代码生成定义。
要将模型链接到单独的字典:
在
rtwdemo_roll
,在建模选项卡,在设计画廊,点击链接到数据字典.在“模型属性”对话框中,单击新.
使用“创建新的数据字典”对话框创建名为
rtwdemo_roll_data.sldd
.在“模型属性”对话框中,单击好吧.
在“链接模型到数据字典”对话框中,单击只更改此模型.
在
BasicRollMode
模型时,使用“模型属性”对话框将模型链接到名为basicRollMode_data.sldd
.点击,好吧.
要创建共享的、独立的字典,并将代码生成定义存储在其中:
在两个模型中,在模型资源管理器中打开字典。在框图的左下角,单击模型数据标识,然后单击数据字典链接。
在模型资源管理器中,选择文件>新>数据字典.
创建一个名为
coderDefs.sldd
.在模型浏览器中模型层次结构窗格中,选择rtwdemo_roll_data节点。
在对话框窗格(右窗格)中,在引用字典,点击添加.
添加引用
coderDefs.sldd
.配置
basicRollMode_data.sldd
参考coderDefs.sldd
.在模型层次结构窗格中,右键单击rtwdemo_roll_data节点并选择保存更改.
在命令提示符处,将代码生成定义从
rtwdemo_roll
的模型文件coderDefs.sldd
数据字典。coder.dictionary.move (“rtwdemo_roll”,“coderDefs.sldd”)
现在,两个模型都可以访问存储类internalsInFile
.
将代码映射编辑器设置从父模型复制到引用模型
默认情况下,新的引用模型不使用父模型使用的代码映射编辑器设置。要将设置从父模型复制到引用模型,请使用代码映射编辑器的编程接口。
在命令提示符下,复制的存储类设置内部数据从rtwdemo_roll
来BasicRollMode
.
Roll_sc = code .mapping.defaults.get(“rtwdemo_roll”,“InternalData”,“StorageClass”);coder.mapping.create (“BasicRollMode”);coder.mapping.defaults.set (“BasicRollMode”,“InternalData”,“StorageClass”, roll_sc);
现在,两个模型都使用相同的Code Mappings编辑器设置。有关代码映射编辑器的编程接口的更多信息,请参见以编程方式配置默认数据和功能代码生成.
使数据字典中的共享定义对新模型可用
从Simulink开始页或使用金宝appnew_system
函数没有链接到Simulink数据字典。金宝app新模型不能访问存储在数据字典中的代码生成定义。
要使新模型可以使用开箱即用的代码定义,可以编写回调和其他立即将模型链接到数据字典的代码。
有关显示如何以编程方式将模型链接到数据字典的简单示例,以及有关以编程方式配置字典引用的信息,请参见以编程方式将数据存储在字典中(金宝app模型)。
如果您使用一个项目,请考虑创建一个项目快捷方式来创建一个模型,并立即将新模型链接到数据字典。有关项目和项目快捷方式的信息,请参见什么是项目?(金宝app模型)。
使用数据字典来存储代码定义,而不是设计数据
一个金宝appSimulink数据字典可以存储设计数据,如MATLAB变量和金宝app仿真软件。AliasType
对象(见全局和共享数据:数据字典(金宝app模型))。然而,将大型模型或多个模型的设计数据从基本工作区迁移到数据字典可能需要时间和仔细的计划。
的共享代码生成定义存储在数据字典中,但不希望迁移模型的设计数据,请在“模型属性”对话框中数据选项卡,选择启用对基本工作区的访问财产。该模型可以使用来自基本工作区的设计数据和来自字典或引用字典的代码生成定义。有关更多信息,请参见继续在基本工作区中使用共享数据(金宝app模型)。
打开代码透视图会产生错误
在引用数据字典的层次结构中(参见字典引用(金宝appSimulink)),只有一个字典可以在嵌入式编码器字典中存储代码生成定义。当您在通过引用的数据字典访问多个嵌入式编码器字典的模型中打开代码透视图时,Simulink会生成一个错误。金宝app要解决此错误,请使用coder.dictionary.move
而且coder.dictionary.remove
传输和删除嵌入式编码器字典,直到字典层次结构中只存在一个。如有必要,将嵌入式编码器字典存储在独立的共享数据字典中在模型之间共享嵌入式编码器字典定义.