在生成的代码创建可调校准参数
一个校准参数一个值存储在全局内存的算法读取用于计算但不写。校准参数可调因为你可以改变算法执行过程中存储的值。您创建的校准参数,以便您可以:
确定一个最优参数值通过调优参数和监控信号值在执行期间。
有效地覆盖算法适应不同的执行条件的参数值存储在内存中。例如,您可以使用相同的控制算法对多个车辆不同的质量不同的参数值存储在每辆车的发动机控制单元。
在仿真金宝app软件®,创建一个金宝appSimulink.Parameter
对象代表一个校准参数。使用参数对象设置参数值,如获得参数的获得块。控制参数对象的表示在生成的代码中,你申请一个存储类的对象。
使参数可以在生成的代码块在默认情况下,例如快速原型,集默认参数的行为(见默认参数的行为)可调
。有关更多信息,请参见保存生成的代码中的变量。
块参数表示为可调的全局变量
这个例子显示了如何创建可调参数数据代表参数作为全局变量在生成的代码块。
块参数通过参数配置对象
打开示例模型rtwdemo_paraminline
并配置它来显示生成的块的名字。
load_system (“rtwdemo_paraminline”)set_param (“rtwdemo_paraminline”,“HideAutomaticNames”,“关闭”)open_system (“rtwdemo_paraminline”)
在建模选项卡上,单击模型数据编辑器。
在模型数据编辑器,检查参数选项卡。
在模型中,单击G1
获得块。模型编辑器的数据显示对应的行获得块的参数。
在模型中数据编辑器价值列,改变增益值2
来myGainParam
。
旁边myGainParam
,点击操作按钮(三个垂直点)和选择创建。
在创建新的数据块对话框中,设置价值来金宝appSimulink.Parameter (2)
。点击创建。一个金宝appSimulink.Parameter
对象myGainParam
存储参数值,2
在模型中,工作区。
在myGainParam对话框,代码生成选项卡上,单击在编码器配置应用程序。
在代码映射编辑器中,集存储类的myGainParam
来ExportedGlobal
。这个存储类导致参数对象出现在生成的代码作为一个可调的全局变量。
另外,创建参数对象和配置模型,使用这些命令在命令提示符:
set_param (“rtwdemo_paraminline / G1”,“获得”,“myGainParam”)多工作站系统= get_param (“rtwdemo_paraminline”,“modelworkspace”);mws.assignin (“myGainParam”S金宝appimulink.Parameter (2));厘米= coder.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”);
生成和检查代码
从模型中生成代码。
rtwbuild (“rtwdemo_paraminline”)
# # #开始构建过程:rtwdemo_paraminline # # #为“rtwdemo_paraminline”所生成的代码是最新的,因为没有结构,参数或代码替换库的变化被发现。# # #成功完成构建过程:rtwdemo_paraminline构建总结0 1模型的建立(1模型已经更新)构建持续时间:0 h 0米3.222秒
生成的文件rtwdemo_paraminline.h
包含走读生
全局变量的声明myGainParam
和myOtherGain
。您可以包括(# include
)这个头文件代码可以读和写变量的值在执行期间。
文件= fullfile (“rtwdemo_paraminline_grt_rtw”,“rtwdemo_paraminline.h”);rtwdemodbtype(文件,…的走读生real_T myGainParam;”,引用:“< Root > / G2”,1,1)
走读生real_T myGainParam;/ *变量:myGainParam *引用:“< Root > / G1”* /走读生real_T myOtherGain;/ *变量:myOtherGain *引用:“< Root > / G2”
该文件rtwdemo_paraminline.c
分配内存并初始化myGainParam
和myOtherGain
。
文件= fullfile (“rtwdemo_paraminline_grt_rtw”,“rtwdemo_paraminline.c”);rtwdemodbtype(文件,…“/ *导出块参数* /”,引用:“< Root > / G2”,1,1)
* / / *导出块参数real_T myGainParam = 2.0;/ *变量:myGainParam *引用:“< Root > / G1”* / real_T myOtherGain = -2.0;/ *变量:myOtherGain *引用:“< Root > / G2”
生成的代码的算法模型一步
函数使用myGainParam
和myOtherGain
为计算。
rtwdemodbtype(文件,…“/ *模型阶跃函数* /”,“/ *模型初始化函数* /”,1,0)
/ *模型阶跃函数* /空白rtwdemo_paraminline_step (void){/ *外港:“< Root > /着干活”包含:*获得:“< Root > / G1”*获得:< Root > / G2的*尺寸:“< Root > / In1”*金额:< Root > /笔的* / rtwdemo_paraminline_Y。着干活= myGainParam * rtwdemo_paraminline_U。三机一体+ myOtherGain * -75.0;}
应用存储类当块参数指的是数字MATLAB变量
如果你使用一个数值变量设置一块参数的值,不能应用的存储类变量。作为一个解决方案,你可以将变量转换为一个参数对象,然后应用存储类的对象。将变量转换为一个参数对象,选择其中一个技术:
在模型数据编辑器参数选项卡,改变观点设置为
代码
,找到对应的连续变量。在存储类列,从下拉列表中,选择转换为参数对象
。模型数据编辑器将变量转换为一个参数对象。然后,使用存储类列应用存储类的对象。您还可以使用该技术在模型浏览器中。
使用数据对象向导(参见创建数据对象模型使用数据对象向导)。在向导中,选择参数复选框。该向导将变量转换为对象。然后,应用存储类的对象,例如,通过使用模型数据编辑器或Model Explorer。
创建存储类代表校准参数(嵌入式编码器)
这个例子展示了如何创建一个收益率校准参数的存储类生成的代码。存储类原因每个参数对象(金宝appSimulink.Parameter
)显示为一个全局变量有特殊关键字和语法等装饰。
在生成的代码中,必须出现的校准参数作为全局变量定义在一个文件命名calPrms.c
并宣布在calPrms.h
。变量定义必须看起来像这些定义:
# pragma交会(CALPRM) const波动浮动param1 = 3.0 f;const波动浮动param2 f = 5.0;const波动浮动param3 f = 7.0;# pragma交会()
变量使用关键词常量
和挥发性
。的编译指示# pragma交会(CALPRM)
控制变量在内存的位置。为了实现编译指示,变量定义必须出现在一个连续的代码块。
同时,生成的代码必须包括一个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.Parameter
简化应用存储类,使用Model Explorer来改变默认的参数对象金宝appSimulink.Parameter
来myPackage.Parameter
。
在命令提示符处,打开Model Explorer。
daexplr
在模型浏览器中模型层次结构窗格中,选择基本工作空间。
在模型浏览器的工具栏,单击旁边的箭头添加模型金宝app参数按钮。在下拉列表中,选择定制类列表。
在定制类列表对话框,在参数类,选择旁边的复选框myPackage.Parameter。点击好吧。
在模型浏览器的工具栏,单击旁边的箭头添加模型金宝app参数按钮。在下拉列表中,选择myPackage参数。
一个
myPackage.Parameter
对象出现在基地工作空间。你可以删除这个对象。
现在,当你使用工具,如模型数据编辑器来创建对象参数,模型创建金宝appmyPackage.Parameter
对象,而不是金宝appSimulink.Parameter
对象。
应用存储类
在这个例子中模型rtwdemo_roll
,BasicRollMode
子系统是一个PID控制器。配置P, I, D参数校准参数。
打开模型。
rtwdemo_roll
在模型中,导航到
BasicRollMode
子系统。在应用画廊,单击嵌入式编码器。
下面的框图,打开模型数据编辑器通过选择模型数据编辑器选项卡。
在模型数据编辑器中,选择参数选项卡并更新框图。
现在,数据表包含行对应于工作区所使用的变量获得块(代表了P, I, D控制器的参数)。
在模型数据编辑器中,旁边内容过滤框,激活过滤器使用选择按钮。
在模型中,选择三个获得块。
在内容过滤框中,输入
模型的工作空间
。的变量获得块模型中使用的工作区。
在数据表中,选择三行,存储类列一行,选择
转换为参数对象
。模型数据编辑器将工作空间变量
myPackage.Parameter
对象。现在,你可以申请一个存储类的对象。在存储类列一行,选择
CalParam
。
ASAP2接口的配置生成
配置模型生成a2l
文件。选择配置参数>代码生成>接口>ASAP2接口。
生成和检查代码
从模型中生成代码。
在代码生成报告,检查
calPrms.c
文件。该文件定义了校准参数。/ *导出的数据定义* / # pragma交会(CALPRM) / *定义自定义存储类:CalParam * / const波动real32_T dispGain f = 0.75;const波动real32_T intGain f = 0.5;const波动real32_T rateGain f = 2.0;# pragma交会()
该文件
calPrms.h
声明的参数。检查接口文件
rtwdemo_roll.a2l
。文件包含每个参数的信息,例如,dispGain
。/特点/ *开始名字* / dispGain / *长标识符* /”“/ *类型* /价值/ * ECU地址* / 0 x0000 / * @ECU_Address@dispGain@ * / / *记录* /布局Scalar_FLOAT32_IEEE / *最大区别* / 0 / *转换方法* / rtwdemo_roll_CM_single / * * /下限-3.4 e+38 / * * /上限3.4 e+38 /结束的特点
从系统初始化参数值常数或其他宏观(嵌入式编码器)
您可以生成代码,初始化一个可调参数的值计算出一些系统常量(宏)。例如,您可以生成此代码,初始化一个可调参数totalVol
宏的值计算numVessels
和vesInitVol
:
#定义numVessels 16 # define vesInitVol 18.2双totalVol = numVessels * vesInitVol;
这种初始化技术保留了可调参数之间的数学关系和系统常数,使生成的代码可读性更强,更容易维护。生成此代码:
创建参数对象代表系统常量。
numVessels = 金宝appSimulink.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
通过使用表达式numVessels * vesInitVol
。指定生成的代码保存表达式,使用slexpr
函数。totalVol。价值= slexpr(“numVessels * vesInitVol”);
使用
totalVol
组块在你的模型参数值。从模型中生成的代码初始化的可调参数值根据系统常量。
更多信息和限制使用一个表达式的值金宝appSimulink.Parameter
对象,看到通过使用一个数学表达式设置变量值。
代码生成参数对象的存储位置的影响
您可以创建一个参数对象的基本工作空间,工作空间模型,或数据字典。然而,当你结束你的MATLAB会话、变量基地工作区中删除。确定在哪里存储参数模型使用的对象和其他变量,明白了确定在哪里存储变量和对象模型模型金宝app。
一个参数对象会影响文件的位置放置相应的数据定义生成的代码。
如果你把一个参数对象的基本工作空间或一个数据字典,代码生成器假设相应的参数数据(例如,一个全局变量)属于系统的生成代码,系统中一个特定的组件。例如,如果一个模型在模型层次结构使用一个参数对象的引用以外的存储类
汽车
的数据定义出现在生成的代码模型层次结构的顶部,而不是在代码生成的模型,使用对象。然而,如果你有嵌入式编码器®,一些存储类允许您指定的名称模型拥有一块数据。当你指定一个所有者模型,该模型定义了数据生成的代码。关于数据所有权的更多信息,请参阅控制位置的全局数据定义和声明生成的文件(嵌入式编码)。
如果你把一个参数对象模型的工作区中,代码生成器假设模型拥有数据。如果你从一个参考生成代码的层次结构,其中包括包含模型,数据定义出现在包含模型生成的代码。
关于数据所有权的更多信息,请参阅控制位置的全局数据定义和声明生成的文件(嵌入式编码)。
如果你申请一个存储类以外
汽车
一个参数对象,对象出现在生成的代码作为一个全球的象征。因此,在一个模型参考层次结构,两个这样的对象在不同的模型工作区或字典不能具有相同的名称。每个对象的名称必须是唯一的整个模型层次结构。然而,如果你有嵌入式编码,你可以使用存储类
FileScope
为了防止名称冲突在不同的模型参数对象之间工作区。看到参数数据组织成一个结构通过使用结构体存储类(嵌入式编码)。
如果你存储一个AUTOSAR.Parameter
对象模型的工作区中,代码生成器忽略了你指定的存储类的对象。
配置信号数据的可访问性
当你调整一个参数的值在算法执行过程中,监视或捕获输出信号值来分析优化的结果。来表示信号在生成的代码中访问数据,您可以使用技术,如测试点和存储类。看到保存生成的代码中的变量。
为调优参数编程接口
您可以配置生成的代码包括:
一个C应用程序编程接口(API)的调优参数独立外部模式。生成的代码包括额外的代码,这样您可以编写自己的代码来访问参数值。看到使用C API之间交换数据和外部代码生成。
目标语言编译器的API,用于调优参数独立于外部模式。看到参数的函数。
可调参数设置最小和最大的价值
这是一个最佳实践为可调参数指定最小值和最大值。
您可以指定这些最小值和最大值:
在块对话框中使用的参数对象。使用这种技术来存储中的最小和最大信息模型。
通过使用的属性
金宝appSimulink.Parameter
对象用来设置参数值。使用这种技术来存储之外的最小和最大信息模型。
有关更多信息,请参见为块参数指定最小值和最大值。
考虑其他建模的目标
目标 | 注意事项和更多的信息 |
---|---|
应用存储类型限定符常量 和挥发性 |
如果你有嵌入式编码,生成存储类型限定符,看到的保护全球数据常量和不稳定类型限定符(嵌入式编码)。 |
防止名称冲突通过应用关键字参数在不同的组件之间静态 |
如果你有嵌入式编码,使用存储类 |
生成ASAP2 (a2l )描述 |
你可以生成一个 |
生成AUTOSAR XML (ARXML)描述 | 如果你有嵌入式程序员,您可以生成一个ARXML文件描述所使用的校准参数模型对AUTOSAR标准的配置。看到AUTOSAR标定模型参数和查找表(AUTOSAR Blockset)。 |
存储查找表数据校准 | 存储查找表数据校准根据ASAP2或AUTOSAR标准(例如,STD_AXIS、COM_AXIS或曲线),您可以使用 然而,一些限制适用。看到 有关更多信息,请参见定义ASAP2信息参数和信号和为AUTOSAR测量和校准配置查找表(AUTOSAR Blockset)。 |
使用语法存储参数数据在特定的内存位置 | 如果你有嵌入式编码人员许可,来生成代码,包括自定义语法使用存储类和记忆的部分。看到控制数据和函数放置在内存中插入语法(嵌入式编码)。 |
另请参阅
金宝appSimulink.Breakpoint
|金宝appSimulink.LookupTable
|金宝appSimulink.Parameter