配置C代码生成参数
在为代码生成配置模型时,您可以识别并配置可调性参数,例如校准参数。可配置的参数类型列在该表中。
参数类型 | 描述 |
---|---|
模型参数参数 | 块参数在您配置为模型参数的模型工作区中。包含模型参数实参的模型的每个实例都可以将实参设置为唯一的值。 |
模型参数 | 在模型中定义的参数,例如模型工作区中的参数。 |
外部参数 | 在基本工作区或数据字典中定义为对象的参数。 |
常数 | 常数参数。 |
若要配置用于代码生成的参数,必须将参数与数据对象关联。例如,在为代码生成配置MATLAB变量之前,在Model Explorer中,将变量转换为参数对象。
当你打开一个模型嵌入式编码器App、模型参数、模型参数参数和常量与数据对象相关联的代码显示在代码映射编辑器中。在编辑器中,您可以配置代码生成的参数。如果模型使用外部参数,您可以通过单击代码映射编辑器将它们添加到刷新
链接到参数名称的右侧。该链接启动一个更新图,并在编辑器视图中添加模型使用的外部参数。
将参数数据配置为:
在执行生成的代码时,使数据可用于交互。
尽量减少存储在内存中的数据量。
控件,代码生成器在内存中放置参数数据的位置。
将参数数据提升到模型接口,以便其他组件和系统可以访问该数据。
提高生成代码的可读性和可追溯性。
为了控制整个模型的参数是否可调,您可以获得对模型配置参数的访问默认参数行为通过使用'Auto'是可调/内联的
代码映射编辑器上的链接数据默认值选项卡。例如,在以下情况下,你可以使用该链接使参数可调:
在快速成型过程中优化参数设置
校准参数
优化生产代码的参数
对于代码生成,示例展示了如何为模型配置模型参数和模型参数参数rtwdemo_configinterface
.方法可以配置代码映射代码映射编辑器或代码映射API (代码映射编辑器).
“参数”选择“自定义选项”
默认情况下,模型中的参数以字段的形式出现在生成的代码中命名为:
对于模型参数模型
_P
对于模型参数参数模型
_InstP
对于常参数模型
_ConstP
根据代码接口需求,决定是否自定义参数数据的生成。如果不配置自定义,代码生成器将决定是否消除或更改生成代码中的参数表示,以达到优化目的。如果您配置了自定义,请决定:
是否设置默认配置
如果一个模型包含一个类别的大量必须是可调的参数(例如,超过10个),那么通过使用默认设置来配置该类别的参数,然后针对特殊情况覆盖该设置会更有效。如果模型包含给定类别的一些参数,这些参数具有惟一的来源、命名或位置要求,请考虑单独配置这些参数。
如何在生成的代码中声明和处理模型参数数据
作为单独的全局变量
从外部代码中定义的全局变量读取模型参数数据
作为访问函数的调用。需要嵌入式编码器®
有关这些选项的更多信息,请参见生成代码中的控制数据和函数接口.
模型参数的其他考虑因素包括:
通过使用模型中的参数名称或使用惟一的代码标识符来命名生成代码中的参数。
金宝app支持编译器标志或选项定义的预处理器条件。需要嵌入式编码器。看到使用可变模型生成使用C预处理器条件的代码.
包括
静态
例如,在全局变量定义和声明中键入限定符,以防止名称冲突。需要嵌入式编码器。看到通过将数据项配置为静态防止名称冲突.包括
常量
,挥发性
,或常量
而且挥发性
全局变量定义和声明中的类型限定符。需要嵌入式编码器。看到使用const和volatile类型限定符保护全局数据.生成宏(
#定义
)或使用外部头文件中定义的宏的代码。需要嵌入式编码器。看到宏定义(#define).生成具有指定名称的全局数据结构。需要嵌入式编码器。看到在生成的代码中将数据组织成结构.
将参数数据放入内存的特定区域。需要嵌入式编码器。看到通过插入语法在内存中放置控制数据和函数.
有关与具有相应存储类和存储类属性的参数相关的接口需求列表,请参见为数据存储选择“存储类”和“存储类属性”.
参数要求为示例模型rtwdemo_configinterface
是:
默认情况下,在生成的代码中保留模型参数以进行调优。不要通过内联参数来优化代码。
类定义并声明的独立全局变量表示模型参数
常量
而且挥发性
类型限定符。应用前缀
mp_
表示模型参数的变量的名称。启用常量参数
上
而且较低的
为模型的每个实例拥有不同的值。默认情况下,对于模型参数实参的每个实例,分配一个内存区域,表示为导出结构中唯一命名的字段。
模型参数参数在生成的代码中作为单独的模型函数参数出现。使代码生成器能够优化模型中未被块使用的模型参数参数。
对于本例,配置模型参数和模型参数参数在rtwdemo_configinterface
以满足这些代码生成需求。
配置参数的默认代码生成设置
参数的默认代码生成设置可以减少为代码生成准备模型的工作,特别是当模型具有大量的参数时,您需要在执行生成的代码时与这些参数进行交互。只选择一次配置设置,代码生成器就会将这些设置应用到整个模型的参数中。金宝app动态仿真模块®将默认配置存储为模型的一部分。
如果您的模型为相同的类别使用多个没有惟一需求的参数,那么可以考虑为模型参数配置默认的代码生成设置或者使用共享的嵌入式编码器字典.
的用法代码映射编辑器为模型参数配置默认设置和模型参数参数对于模型rtwdemo_configinterface.配置模型参数,使它们是可调的,并在生成的代码中定义和声明为独立的全局变量具有类型限定符的常量
而且挥发性
.配置模型参数实参以使用默认设置,其中代码生成器为每个实参实例分配一个表示为导出结构中唯一命名字段的内存区域。
开放模式rtwdemo_configinterface.将模型的副本保存到可写的位置。
打开嵌入式编码器应用程序。
在C代码选项卡上,选择代码接口>默认代码映射.
在代码映射编辑器中,选择模型参数参数.将存储类设置为
默认的
.代码生成器为每个参数实例分配一个单独的内存区域。在“代码映射”编辑器中参数,选择类别模型参数.链接文本
'Auto'将被内联
指示默认情况下将代码生成器配置为内联模型参数。本例的一个要求是模型参数是可调的。点击'Auto'将被内联
.在“型号配置参数”对话框中,设置型号配置参数默认参数行为来
可调
.保存更改并关闭对话框。在代码映射编辑器中,链接文本更改为'Auto'是可调的
.在代码映射中,使用模型参数类别仍然选中,将存储类设置为
ConstVolatile
.保存模型。
配置单个参数的代码生成
您可以为代码生成配置单独的参数。例如,如果一个模型有两个具有独特代码生成需求的相同类别的参数,那么分别配置这些参数。或者,如果为一类参数配置默认设置,则可以为特定参数覆盖这些设置。
如果你的模型至少满足其中一个条件,考虑为参数单独配置代码生成设置:
使用具有惟一来源、命名或位置要求的同一类别的多个参数。
使用同一类别的几个参数。
具有参数类别的默认配置,您需要覆盖某些特定参数的配置。
这个例子展示了如何使用Code Mappings编辑器将模型参数的默认存储类设置应用到参数K1
,表1
,表二
在模型rtwdemo_configinterface
.为这些参数配置代码标识符和模型参数参数较低的
而且上
.您可以指定代码生成标识符,例如用于集成,而无需修改模型设计。
如果您还没有这样做,请完成下面的步骤配置参数的默认代码生成设置.
在代码映射编辑器中,单击参数选项卡。扩大模型参数参数.默认情况下,每个模型参数的存储类设置为
汽车
,这意味着代码生成器可能为了优化目的而消除或更改相关代码的表示。如果不可能进行优化,代码生成器将应用模型默认配置。对于本例,将存储类设置为汽车
.扩大模型参数.默认情况下,每个参数的存储类设置为
汽车
.使用模型默认配置,它指定存储类ConstVolatile
.为了避免优化并强制代码生成器使用默认配置,请将存储类设置为
模型的默认
.若要覆盖默认配置,请为该参数指定满足代码生成要求的存储类。
在“代码映射”编辑器中模型参数,选择参数
K1
,表1
,表二
.将存储类设置为模型默认值:ConstVolatile
.配置名称包含前缀的模型参数的代码标识符
mp_
.在代码映射编辑器中,选择模型参数K1
.在属性检查器中,展开代码节点。设置存储类属性标识符来mp_K1
.为参数表1
而且表二
,设置标识符来mp_Table1
而且mp_Table2
.保存模型。
生成并查看代码。例如,找到模型参数的数据定义
mp_K1
在rtwdemo_configinterface.c
.mp_K1 = 2;
找出参数在步骤入口点函数中的使用位置。
if (mode) {output = (real_T)mp_K1 * dout_Table1;} else{输出= dstate_X;}
将参数数据组织成一个结构结构体
存储类
的用法结构体
存储类来将块参数值组织到生成代码中的结构中。您可以直接将存储类应用于模型中的各个数据项。
要在生成的代码中创建参数数据的自定义结构,请考虑在Simulink中创建相应的结构。金宝app看到在生成的代码中将数据组织成结构.
创建示例模型
创建这个带有三个的示例模型常数街区和三外港块。命名模型ex_struct_param
.
设置常量参数
打开模型数据编辑器。在建模选项卡上,单击模型数据编辑器.
在模型数据编辑器中,选择参数选项卡。
在模型中,选择鞋面常数块。
在模型数据编辑器中,使用价值列要将常量值设置为
p1
.旁边p1
,单击操作按钮并选择创建.
在“创建新数据”对话框中,设置价值来
金宝appSimulink.Parameter (1.0)
并点击创建.金宝appSimulink添加了
金宝app仿真软件。参数
对象命名p1
到模型工作区。的属性对话框中
p1
,点击好吧.如果您不需要设置其他参数,则可以单击代码生成选项卡。然后,单击在Coder App中配置按钮,该按钮将打开嵌入式编码器app和代码映射编辑器。
使用Model Data Editor通过使用命名的参数对象来设置其他常量值
p2
(值2.0
),p3
(值3.0
).
为代码生成配置常量参数
打开嵌入式编码器应用程序。
在C代码选项卡上,选择代码接口>单个元素代码映射.
在代码映射编辑器中,单击参数选项卡。
扩大模型参数.
为参数设置存储类
p1
,p2
,p3
来结构体
.选择参数
p1
.在属性检查器中,在代码,设置属性StructName来my_struct
.为参数p2
而且p3
,设置StructName来my_struct
.保存模型。
生成和检查代码
生成并检查代码。
该文件ex_struct_param.h
定义结构类型,my_struct_type
.
/*自定义存储类的类型定义:Struct */ typedef Struct my_struct_tag {real_T p1;real_T p2;real_T p3;} my_struct_type;
该文件ex_struct_param.c
定义全局变量my_struct
.
/*自定义存储类:Struct */ my_struct_type my_struct = {/* p1 */ 1.0, /* p2 */ 2.0, /* p3 */ 3.0};
以编程方式为参数配置代码生成设置
要自动配置代码生成的参数,请使用代码映射的编程接口。例如,在创建自定义块库或应用程序测试环境的一部分时,使用编程接口来自动化数据配置。
这个例子展示了如何配置模型参数的默认设置和模型参数参数为模型rtwdemo_configinterface.配置模型参数,使它们是可调的,并在生成的代码中定义和声明为独立的全局变量具有类型限定符的常量
而且挥发性
.配置模型参数实参以使用默认设置,其中代码生成器为每个实参实例分配一个表示为导出结构中唯一命名字段的内存区域。将模型参数的默认存储类设置应用于参数K1
,表1
,表二
.为这些参数配置代码标识符。
打开示例模型。
open_system(“rtwdemo_configinterface”);
设置模型配置参数默认参数行为来
可调
.模型=“rtwdemo_configinterface”;
set_param(模型、“DefaultParameterBehavior”可调);
创建对象
厘米
通过调用函数coder.mapping.api.get
.对象存储数据元素的代码生成配置和功能在模型rtwdemo_configdefaults
.Cm = code .mapping.api.get('rtwdemo_configinterface');
通过调用函数来配置模型参数的默认设置
setDataDefault
.对于参数,指定这些值:返回的对象
coder.mapping.api.get
ModelParameters
对于默认类别属性名
StorageClass
具有财产价值ConstVolatile
setDataDefault (cm,‘ModelParameters’,‘StorageClass’,‘ConstVolatile’);
为模型参数参数配置默认设置。在呼唤
setDataDefault
,为参数指定这些值:返回的对象
coder.mapping.api.get
.ModelParameterArguments
默认类别。属性名
StorageClass
具有财产价值默认的
.
setDataDefault (cm,‘ModelParameterArguments’,‘StorageClass’,‘默认’);
验证模型参数的默认配置和模型参数参数.发出呼叫
getDataDefault
返回的对象coder.mapping.api.get
、类别ModelParameters
或ModelParameterArguments
,StorageClass
.getDataDefault(cm, 'ModelParameters', 'StorageClass') ans = 'ConstVolatile'
getDataDefault(cm, 'ModelParameterArguments', 'StorageClass') ans = 'Default'
对参数应用模型参数的默认配置
K1
,表1
,表二
.默认情况下,Simuli金宝appnk将单个参数的存储类设置为
汽车
.当存储类为汽车
,代码生成器:确定是否为优化目的从生成的代码中删除数据。
如果保留数据,则确定如何在生成的代码中有效地表示数据,同时考虑默认配置设置。
配置代码生成器,将默认模型参数设置应用于参数
K1
,表1
,表二
.对于每个参数,调用函数setModelParameter
.指定返回的对象coder.mapping.api.get
,参数名称,属性名称StorageClass
,以及物业价值模型的默认
.setModelParameter (cm, K1, StorageClass,默认模式);setModelParameter(厘米,“表1”、“StorageClass”,“默认模式”);setModelParameter(厘米,“表”、“StorageClass”,“默认模式”);
验证参数的配置更改
K1
,表1
,表二
通过调用函数getModelParameter
.getModelParameter(cm,'K1','StorageClass') ans = '型号默认' getModelParameter(cm,'Table1','StorageClass') ans = '型号默认' getModelParameter(cm,'Table2','StorageClass') ans = '型号默认'
配置模型参数的代码标识符。对于每个参数,调用函数
setModelParameter
.指定返回的对象coder.mapping.api.get
,参数名称,属性名称标识符
,以及其中一个属性值。模型参数 代码标识符 K1
mp_K1
表1
mp_Table1
表二
mp_Table2
setModelParameter (cm, K1,“标识符”,“mp_K1”);setModelParameter(厘米,“表1”,“标识符”,“mp_Table1”);setModelParameter(厘米,“表”,“标识符”,“mp_Table2”);
通过调用函数来验证模型参数的配置更改
getModelParameter
.getModelParameter(cm,'K1','Identifier') ans = 'mp_K1' getModelParameter(cm,'Table1','Identifier') ans = 'mp_Table1'
保存模型。
生成并查看代码。例如,找到模型参数的数据定义
mp_K1
在rtwdemo_configinterface.c
.mp_K1 = 2;
找出参数在步骤入口点函数中的使用位置。
if (mode) {output = (real_T)mp_K1 * dout_Table1;} else{输出= dstate_X;}
为模型参数选择存储类和存储类属性
根据您的代码生成需求,从这些存储类中选择,为模型参数配置代码生成。对于常数,只有默认的
适用。对于模型参数参数,仅为汽车
,默认的
,模型的默认
适用。
需求 | 存储类 |
---|---|
启用优化,可能生成更高效的代码。 | 汽车(仅限单个映射) |
对于无法优化的数据元素,将数据表示为标准数据结构的字段。 | 默认的(仅默认映射) |
防止优化消除数据元素的存储,并对数据元素类别使用默认映射。 | 模型的默认(仅限单个映射),词典默认 (仅限单个映射) |
生成一个将布尔数据存储在指定位域中的结构。 | 设置(只适用于个别地图) |
金宝app支持使用编译器标志或选项定义的预处理器条件。 | CompilerFlag |
属性生成全局变量定义和声明常量 ,挥发性 ,或常量 而且挥发性 类型限定符。 |
Const, Volatile和ConstVolatile |
生成宏(#定义 指令)或使用外部代码中头文件中定义的宏的代码。 |
定义、ImportedDefine |
生成一个全局变量定义和声明。 | ExportedGlobal |
生成指定文件的全局变量定义和声明。 | ExportToFile |
属性生成全局变量定义和声明静态 类型限定符。 |
FileScope(仅限本地和共享本地数据存储映射) |
通过调用自定义访问器函数生成与数据交互的代码。 | GetSet |
生成从外部代码定义的全局变量或全局变量指针进行读写的代码。 | ImportedExtern, ImportedExternPointer |
生成从外部头文件定义的全局变量中读取和写入的代码。 | ImportFromFile |
生成具有名称的全局结构,您可以指定名称。 | 结构体(仅限单个映射) |
可用的存储类列表可能包括在嵌入式编码器字典中定义的其他特定于项目的存储类。如果您有列出的存储类无法满足的特殊需求,并且您有Embedded Coder软件,那么您可以定义一个存储类。看到为软件体系结构定义存储类、内存部分和函数模板.
对于单个模型参数,请使用标识符存储类属性来为表示生成代码中的参数的变量配置名称。使用Embedded Coder,您还可以配置这些属性,具体取决于您选择的存储类。
财产 | 描述 | 存储类 |
---|---|---|
DefinitionFile |
包含全局数据定义的源定义文件,由参数和外部代码读取 | ExportToFile 而且挥发性 |
GetFunction |
参数在生成的代码中作为对指定的得到 函数 |
GetSet |
HeaderFile |
包含全局数据声明的源头文件,由参数和外部代码读取全局数据 | ExportToFile ,GetSet ,ImportFromFile ,挥发性 |
记忆的部分 (仅默认参数配置) |
内存部分,包含由参数读取的数据 | 默认的 |
老板 |
代码生成器将参数的定义放在为共享定义的模型层次结构中的多个模型之一生成的代码中。您必须选择模型配置参数使用数据对象的所有者来放置数据定义.看到在生成的文件中控制全局数据定义和声明的位置. | ExportToFile 而且挥发性 |
PreserveDimensions |
代码生成器保留在生成的代码中表示为多维数组的参数数据的维度。必须设置模型配置参数阵列布局来行 .看到在生成的代码中保留多维数组的维度. |
ExportToFile ,FileScope ,ImportFromFile ,可以定位的 而且挥发性 |
SetFunction |
参数在生成的代码中作为对指定的集 函数。 |
GetSet |
StructName |
为参数生成的代码中结构的名称。 | 设置 而且结构体 |