在生成的代码中创建可调校准参数
一个校准参数是存储在全局内存中的值,算法读取该值以用于计算,但不写入该值。校准参数为可调因为您可以在算法执行期间更改存储的值。您可以创建校准参数,以便:
通过在执行过程中调整参数和监测信号值来确定最佳参数值。
通过覆盖存储在内存中的参数值,有效地使算法适应不同的执行条件。例如,通过在每辆车的发动机控制单元中存储不同的参数值,可以对不同质量的多辆车使用相同的控制算法。
在仿真金宝app软件®,创建金宝app仿真软件。参数
对象来表示校准参数。可以使用参数对象设置块参数值,例如获得a的参数获得块。要在生成的代码中控制参数对象的表示,可以对该对象应用存储类。
要使块参数在默认情况下可在生成的代码中访问,例如用于快速原型,请设置默认参数行为(见默认参数行为)可调
.有关更多信息,请参见保留生成代码中的变量.
将块参数表示为可调全局变量
这个例子展示了如何通过在生成的代码中将块参数表示为全局变量来创建可调参数数据。
通过参数对象配置块参数
打开示例模型rtwdemo_paraminline
并配置它以显示生成的块的名称。
load_system (“rtwdemo_paraminline”) set_param (“rtwdemo_paraminline”,“HideAutomaticNames”,“关闭”) open_system (“rtwdemo_paraminline”)
在建模选项卡上,单击模型数据编辑器.
在模型数据编辑器中,检查参数选项卡。
在模型中,单击G1
获得块。模型数据编辑器突出显示与获得块参数。
在模型数据编辑器中价值列,将增益值从2
来myGainParam
.
旁边myGainParam
,点击操作按钮(有三个垂直点)并选择创建.
在“创建新数据块”对话框中,设置价值来金宝appSimulink.Parameter (2)
.点击创建.一个金宝app仿真软件。参数
对象myGainParam
存储参数值,2
,在模型工作区中。
在“myGainParam”对话框中,在代码生成选项卡上,单击在编码器应用程序中配置.
在代码映射编辑器中,设置存储类的myGainParam
来ExportedGlobal
.这个存储类使参数对象作为可调全局变量出现在生成的代码中。
或者,要创建参数对象并配置模型,可以在命令提示符处使用以下命令:
set_param (“rtwdemo_paraminline / G1”,“获得”,“myGainParam”MWS = get_param(“rtwdemo_paraminline”,“modelworkspace”);mws.assignin (“myGainParam”S金宝appimulink.Parameter (2));Cm = code .mapping.utils.create(“rtwdemo_paraminline”);setModelParameter(厘米,“myGainParam”,“StorageClass”,“ExportedGlobal”);
使用模型数据编辑器创建一个参数对象,myOtherGain
,用于G2
获得块。应用存储类ExportedGlobal
.
或者,在命令提示符下使用这些命令:
set_param (“rtwdemo_paraminline / G2”,“获得”,“myOtherGain”) mws.assignin (“myOtherGain”S金宝appimulink.Parameter (2));setModelParameter(厘米,“myOtherGain”,“StorageClass”,“ExportedGlobal”);
生成和检查代码
从模型生成代码。
slbuild (“rtwdemo_paraminline”)
###开始构建过程:rtwdemo_paraminline构建过程成功完成:rtwdemo_paraminline构建摘要构建的顶级模型目标:模型动作重建原因==================================================================================================== rtwdemo_paraminline生成和编译的代码生成信息文件不存在。构建1 / 1模型(0个模型已经更新)构建持续时间:0h 0m 9.502s
生成的文件rtwdemo_paraminline.h
包含走读生
全局变量的声明myGainParam
而且myOtherGain
.你可以包括(# include
)这个头文件,这样你的代码就可以在执行过程中读写变量的值。
文件= fullfile(“rtwdemo_paraminline_grt_rtw”,“rtwdemo_paraminline.h”);rtwdemodbtype(文件,…'extern real_T myGainParam;',引用:“<根>/G2””, 1, 1)
extern real_T myGainParam;/*变量:myGainParam *引用:'/G1' */ extern real_T myOtherGain;/*变量:myOtherGain *引用对象:' /G2'
该文件rtwdemo_paraminline.c
分配内存并初始化myGainParam
而且myOtherGain
.
文件= fullfile(“rtwdemo_paraminline_grt_rtw”,“rtwdemo_paraminline.c”);rtwdemodbtype(文件,…'/*导出块参数*/',引用:“<根>/G2””, 1, 1)
*/ real_T myGainParam = 2.0;/*变量:myGainParam *引用by: '/G1' */ real_T myOtherGain = -2.0;/*变量:myOtherGain *引用对象:' /G2'
生成的代码算法在模型中一步
函数使用myGainParam
而且myOtherGain
为计算。
rtwdemodbtype(文件,…'/*模型阶跃函数*/',/*模型初始化函数*/, 1,0)
/*模型步函数*/ void rtwdemo_paraminline_step(void){/*输出端口:'<根>/Out1'合并:*增益:'<根>/G1' *增益:'<根>/G2' *输入:'<根>/In1' * Sum: '<根>/Sum' */ rtwdemo_paraminline_Y。Out1 = myGainParam * rtwdemo_paraminline_U。In1 + myOtherGain * -75.0;}
当块参数为数值时应用存储类MATLAB变量
如果使用数值变量设置块参数的值,则不能将存储类应用于该变量。作为一种变通方法,您可以将变量转换为参数对象,然后将存储类应用于该对象。要将变量转换为参数对象,请选择以下技术之一:
在模型数据编辑器上参数选项卡,改变观点设置为
代码
,找到变量对应的行。在存储类列中,从下拉列表中选择转换为参数对象
.模型数据编辑器将变量转换为参数对象。然后,使用存储类列将存储类应用于对象。您还可以在Model Explorer中使用这种技术。
使用数据对象向导(请参阅使用数据对象向导为模型创建数据对象).在向导中,选择参数复选框。向导将变量转换为对象。然后,应用存储类到对象,例如,通过使用模型数据编辑器或模型资源管理器。
创建表示校准参数的存储类(嵌入式编码器)
此示例演示如何创建在生成的代码中生成校准参数的存储类。存储类导致每个参数对象(金宝app仿真软件。参数
)显示为具有特殊装饰(如关键字和pragmas)的全局变量。
在生成的代码中,校准参数必须作为全局变量出现,定义在一个名为calPrms.c
并在calPrms.h
.变量定义必须如下所示:
#pragma SEC(CALPRM) const volatile float param1 = 3.0F;const volatile float = 5.0F;const volatile float = 7.0F;# pragma交会()
变量使用关键字常量
而且挥发性
.的编译指示# pragma交会(CALPRM)
控制变量在内存中的位置。要实现pragma,变量定义必须出现在连续的代码块中。
此外,生成的代码必须包括ASAP2 (a2l
)每个参数的说明。
创建用于存储存储类和内存段定义的包
现在,通过复制示例包在当前文件夹中创建一个包+金宝app SimulinkDemos
.的定义参数
而且信号
稍后用于将存储类应用于模型中的数据元素的类。稍后,包还存储存储类的定义和关联的内存段。
设置当前的MATLAB®文件夹到可写位置。
复制
+金宝app SimulinkDemos
将文件夹打包到当前文件夹中。命名副本+ myPackage
.拷贝文件(fullfile (matlabroot,…“工具箱”,“金宝app模型”,“simdemos”,“dataclasses”,' 金宝app+ SimulinkDemos '),…' + myPackage ',“f”)
在
+ myPackage
文件夹到文件Signal.m
控件的定义信号
类。取消的
方法
定义方法的部分setupCoderInfo
.在函数调用中useLocalCustomStorageClasses
、替换“packageName”
与“myPackage”
.当你完成后,该部分看起来像这样:方法函数setupCoderInfo (h)使用此包中的自定义存储类useLocalCustomStorageClasses (h,“myPackage”);结束结束%的方法
保存并关闭文件。
在
+ myPackage
文件夹到文件Parameter.m
控件的定义参数
类。取消的方法
定义方法的部分setupCoderInfo
和替换“packageName”
与“myPackage”
.保存并关闭文件。
创建存储类和内存部分
将当前文件夹设置为包含包文件夹的文件夹
+ myPackage
.打开自定义存储类设计器。
cscdesigner (“myPackage”)
在“自定义存储类设计器”中记忆的部分选项卡上,单击新.
对于新的内存部分,根据表格设置属性。
财产 价值 的名字 CalMem
语句包围 变量组
之前的声明 # pragma交会(CALPRM)
发布声明 # pragma交会()
是常量 选择 是不稳定的 选择 点击应用.
在自定义存储类选项卡上,单击新.
对于新的存储类,根据表设置属性。
财产 价值 的名字 CalParam
信号 清晰的 数据范围 出口
头文件 calPrms.h
定义文件 calPrms.c
记忆的部分 CalMem
点击好吧.为了响应关于保存更改的消息,单击是的.
设置默认参数对象为myPackage。参数
为了使应用存储类更容易,使用Model Explorer更改默认参数对象金宝app仿真软件。参数
来myPackage。参数
.
在命令提示符下,打开Model Explorer。
daexplr
在模型资源管理器模型层次结构窗格中,选择基本工作空间.
的工具栏中,单击旁边的箭头添加Si金宝appmulink参数按钮。在下拉列表中选择自定义类列表.
在自定义类列表对话框,在参数类,选中右侧的复选框myPackage。参数.点击好吧.
的工具栏中,单击旁边的箭头添加Si金宝appmulink参数按钮。在下拉列表中选择myPackage参数.
一个
myPackage。参数
对象出现在基本工作区中。可以删除该对象。
现在,当您使用Model Data Editor等工具创建参数对象时,Simulink将创建金宝appmyPackage。参数
对象而不是金宝app仿真软件。参数
对象。
应用存储类
在示例模型中rtwdemo_roll
,BasicRollMode
子系统代表PID控制器。配置P、I、D参数为校准参数。
打开模型。
rtwdemo_roll
模型中,导航到
BasicRollMode
子系统。在“应用程序”库中,单击嵌入式编码器.
控件的下面,打开模型数据编辑器模型数据编辑器选项卡。
在模型数据编辑器中,选择参数选项卡并更新方框图。
控件使用的工作区变量对应的行获得block(表示控制器的P、I和D参数)。
在模型数据编辑器中内容过滤框,激活使用选择筛选按钮。
在模型中,选择这三个获得块。
在内容过滤框中,输入
模型的工作空间
.这些变量获得块的使用在模型工作区中。
在数据表中,选择三行和存储类选择某一行的列
转换为参数对象
.模型数据编辑器将工作区变量转换为
myPackage。参数
对象。现在,您可以将存储类应用于对象。在存储类选择某一行的列
CalParam
.
生成和检查代码
从模型生成代码。
在代码生成报告中,检查
calPrms.c
文件。该文件定义了校准参数。/*导出数据定义*/ #pragma SEC(CALPRM) /*自定义存储类定义:CalParam */ const volatile real32_T disgain = 0.75F;real32_T intGain = 0.5F;const volatile real32_T rateGain = 2.0F;# pragma交会()
该文件
calPrms.h
声明参数。检查接口文件
rtwdemo_roll.a2l
.该文件包含关于每个参数的信息,例如fordispGain
./begin CHARACTERISTIC /*名称*/ distgain /*长标识符*/ "" /*类型*/ VALUE /* ECU地址*/ 0x0000 /* @ECU_Address@dispGain@ */ /*记录布局*/ Scalar_FLOAT32_IEEE /*最大差值*/ 0 /*转换方法*/ rtwdemo_roll_CM_single /*下限*/ -3.4E+38 /*上限*/ 3.4E+38 /end CHARACTERISTIC . /
从系统常量或其他宏初始化参数值(嵌入式编码器)
您可以生成代码,使用从某些系统常量(宏)计算的值初始化可调参数。例如,您可以生成这样的代码,它初始化一个可调参数totalVol
使用从宏计算的值numVessels
而且vesInitVol
:
#define numvessel 16 #define vesInitVol
这种初始化技术保留了可调参数和系统常数之间的数学关系,这可以使生成的代码更易于阅读和维护。生成以下代码:
创建表示系统常量的参数对象。
numvessel = S金宝appimulink.Parameter(16);vesInitVol = 金宝appSimulink.Parameter(18.2);
配置对象以使用存储类
定义
,这会在生成的代码中产生一个宏。numVessels.CoderInfo.StorageClass =“自定义”;numVessels.CoderInfo.CustomStorageClass =“定义”;vesInitVol.CoderInfo.StorageClass =“自定义”;vesInitVol.CoderInfo.CustomStorageClass =“定义”;
创建另一个表示可调参数的参数对象。配置对象以使用存储类
ExportedGlobal
,它会在生成的代码中产生一个全局变量。totalVol = 金宝appSimulink.Parameter;totalVol.CoderInfo.StorageClass =“ExportedGlobal”;
设置的值
totalVol
通过使用表达式numvessel * vesInitVol
.要指定生成的代码保留表达式,请使用slexpr
函数。totalVol。价值= slexpr(' numvessel * vesInitVol');
使用
totalVol
在模型中设置块参数值。从模型生成的代码使用基于系统常量的值初始化可调参数。
有关使用表达式设置值的详细信息和限制金宝app仿真软件。参数
对象,看到使用数学表达式设置变量值.
参数对象存储位置对代码生成的影响
您可以在基本工作区、模型工作区或数据字典中创建参数对象。但是,当您结束MATLAB会话时,基本工作区中的变量将被删除。若要确定在何处存储模型使用的参数对象和其他变量,请参见确定在哪里存储Simulink模型的变量和对象金宝app.
参数对象的位置会影响生成代码中相应数据定义的文件位置。
如果在基本工作空间或数据字典中放置参数对象,代码生成器假定相应的参数数据(例如,全局变量)属于从中生成代码的系统,而不是系统中的特定组件。例如,如果模型引用层次结构中的模型使用存储类以外的参数对象
汽车
,数据定义出现在为层次结构中的顶层模型生成的代码中,而不是在为使用对象的模型生成的代码中。但是,如果你有嵌入式编码器®,一些存储类允许您指定拥有一段数据的模型的名称。指定所有者模型时,为该模型生成的代码定义数据。有关数据所有权的详细信息,请参见控制在生成的文件中全局数据定义和声明的放置(嵌入式编码).
如果在模型工作区中放置参数对象,代码生成器假定模型拥有数据。如果从包含包含模型的引用层次结构生成代码,则数据定义将出现在为包含模型生成的代码中。
有关数据所有权的详细信息,请参见控制在生成的文件中全局数据定义和声明的放置(嵌入式编码).
如果应用的存储类不是
汽车
对于参数对象,该对象在生成的代码中作为全局符号出现。因此,在模型引用层次结构中,不同模型工作区或字典中的两个这样的对象不能具有相同的名称。在整个模型层次结构中,每个对象的名称必须是唯一的。但是,如果你有嵌入式编码器,你可以使用存储类
FileScope
防止不同模型工作区中参数对象之间的名称冲突。看到使用结构存储类将参数数据组织到结构中(嵌入式编码).
如果你存储AUTOSAR。参数
对象,则代码生成器会忽略您为该对象指定的存储类。
配置信号数据的可访问性
当您在算法执行期间调优参数值时,您将监视或捕获输出信号值以分析调优结果。为了将生成的代码中的信号表示为可访问的数据,您可以使用测试点和存储类等技术。看到保留生成代码中的变量.
用于调优参数的编程接口
您可以配置生成的代码,包括:
用于独立于外部模式调优参数的C应用程序编程接口(API)。生成的代码包括额外的代码,以便您可以编写自己的代码来访问参数值。看到使用C API在生成代码和外部代码之间交换数据.
目标语言编译器API,用于独立于外部模式调优参数。看到参数的函数.
设置可调参数最小值和最大值
为可调参数指定最小值和最大值是一种最佳实践。
你可以指定这些最小值和最大值:
在使用参数对象的块对话框中。使用此技术在模型中存储最小和最大的信息。
通过使用a的性质
金宝app仿真软件。参数
用于设置参数值的对象。使用这种技术可以在模型之外存储最小和最大的信息。
有关更多信息,请参见指定块参数的最小值和最大值.
对其他建模目标的考虑
目标 | 注意事项及更多信息 |
---|---|
应用存储类型限定符常量 而且挥发性 |
如果使用嵌入式编码器,要生成存储类型限定符,请参见使用const和volatile类型限定符保护全局数据(嵌入式编码). |
通过应用关键字,防止不同组件中参数之间的名称冲突静态 |
如果你有嵌入式编码器,使用存储类 |
生成ASAP2 (a2l )描述 |
您可以生成 |
生成AUTOSAR XML (ARXML)描述 | 如果您拥有Embedded Coder,则可以生成一个ARXML文件,该文件描述为AUTOSAR标准配置的模型所使用的校准参数。看到模型AUTOSAR校准参数和查找表(AUTOSAR Blockset). |
存储用于校准的查找表数据 | 要根据ASAP2或AUTOSAR标准(例如,STD_AXIS、COM_AXIS或CURVE)存储查找表数据以进行校准,您可以使用 但是,也有一些限制。看到 有关更多信息,请参见为参数和信号定义ASAP2信息而且为AUTOSAR校准和测量配置查找表(AUTOSAR Blockset). |
使用pragmas将参数数据存储在特定的内存位置 | 如果您有嵌入式Coder许可证,要生成包含自定义pragmas的代码,请使用存储类和内存部分。看到通过插入Pragmas控制数据和函数在内存中的位置(嵌入式编码). |
另请参阅
金宝app仿真软件。参数
|金宝app仿真软件。LookupTable
|金宝app仿真软件。断点