主要内容

在生成的代码中创建可调校准参数

一个校准参数是存储在全局内存中的值,算法读取该值以便在计算中使用,但不会对其写入。校正参数为可调因为您可以在算法执行期间更改存储值。您可以创建校准参数,以便:

  • 通过在执行过程中调整参数和监视信号值来确定最佳参数值。

  • 通过覆盖存储在内存中的参数值,有效地使算法适应不同的执行条件。例如,通过在每辆车的发动机控制单元中存储不同的参数值,可以对不同质量的多辆车使用相同的控制算法。

在仿真金宝app软件®,创建一个金宝app仿真软件。参数对象表示校准参数。可以使用参数对象设置块参数值,例如获得a参数获得块。要在生成的代码中控制参数对象的表示,可以对对象应用存储类。

要使块参数在默认情况下可在生成的代码中访问,例如快速原型,设置默认参数行为(见默认参数行为)可调.有关更多信息,请参见在生成代码中保留变量

将块参数表示为可调全局变量

这个例子展示了如何在生成的代码中通过将块参数表示为全局变量来创建可调参数数据。

使用参数对象配置块参数

打开示例模型rtwdemo_paraminline并配置它以显示生成的块名称。

load_system (“rtwdemo_paraminline”) set_param (“rtwdemo_paraminline”“HideAutomaticNames”“关闭”) open_system (“rtwdemo_paraminline”)

建模选项卡上,单击模型数据编辑器

在模型数据编辑器中,检查参数选项卡。

在模型中,单击G1获得块。类对应的行突出显示模型数据编辑器获得块的参数。

在模型数据编辑器中价值列,更改增益值2myGainParam

旁边myGainParam,单击动作按钮(有三个垂直点)并选择创建

在“创建新数据块”对话框中,设置价值金宝appSimulink.Parameter (2).点击创建.一个金宝app仿真软件。参数对象myGainParam存储参数值,2,在模型工作区中。

在myGainParam对话框中,在代码生成选项卡上,单击在Coder App中配置

在“代码映射”编辑器中,设置存储类myGainParamExportedGlobal.这个存储类使参数对象作为可调全局变量出现在生成的代码中。

另外,要创建参数对象并配置模型,可以在命令提示符处使用以下命令:

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生成和编译的代码生成信息文件不存在。构建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)
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 *引用:'/G1' */ real_T myOtherGain = -2.0;/*变量myOtherGain *引用:'/G2'

模型中生成的代码算法一步函数使用myGainParam而且myOtherGain为计算。

rtwdemodbtype(文件,...'/*模型阶跃函数*/''/*模型初始化函数, 1,0)
/*模型步长函数*/ void rtwdemo_paraminline_step(void) {/* Outport: '<根>/Out1'合并:*增益:'<根>/G1' *增益:'<根>/G2' *导入:'<根>/In1' * Sum: '<根>/Sum' */ rtwdemo_paraminline_Y。Out1 = myGainParam * rtwdemo_paraminline_U. Out1 = myGainParam * rtwdemo_paraminline_U. Out1In1 + myOtherGain * -75.0;}

当块参数引用数值时应用存储类MATLAB变量

如果使用数值变量设置块参数的值,则不能对该变量应用存储类。作为一种解决方法,您可以将变量转换为参数对象,然后将存储类应用于对象。要将变量转换为参数对象,请选择以下技术之一:

  • 在模型数据编辑器上参数选项卡,改变观点设置为代码,找到与变量对应的行。在存储类列,从下拉列表中选择转换为参数对象.模型数据编辑器将变量转换为参数对象。然后,使用存储类列将存储类应用于对象。

    您还可以在Model Explorer中使用此技术。

  • 使用数据对象向导(参见使用数据对象向导为模型创建数据对象).在向导中,选择参数复选框。向导将变量转换为对象。然后,将存储类应用到对象,例如,通过使用模型数据编辑器或模型资源管理器。

创建表示校准参数的存储类(嵌入式编码器)

此示例演示如何在生成的代码中创建生成校准参数的存储类。存储类导致每个参数对象(金宝app仿真软件。参数)以全局变量的形式出现,带有特殊的修饰,如关键字和语法。

在生成的代码中,校准参数必须作为全局变量出现,定义在一个名为calPrms.c并在calPrms.h.变量的定义必须像这样:

#pragma SEC(CALPRM) const volatile float param1 = 3.0F;const volatile float param2 = 5.0F;const volatile float param3 = 7.0F;# pragma交会()

变量使用关键字常量而且挥发性.的编译指示# pragma交会(CALPRM)控制变量在内存中的位置。要实现pragma,变量定义必须出现在连续的代码块中。

此外,生成的代码必须包含ASAP2 (a2l)每个参数的描述。

创建用于存储存储类和内存段定义的包

现在,通过复制示例包在当前文件夹中创建一个包+金宝app SimulinkDemos.的定义参数而且信号类,稍后用于将存储类应用于模型中的数据元素。稍后,包还存储存储类的定义和相关的内存段。

  1. 设置当前的MATLAB®文件夹到可写的位置。

  2. 复制+金宝app SimulinkDemos将文件夹打包到当前文件夹中。命名副本+ myPackage

    拷贝文件(fullfile (matlabroot,...“工具箱”“金宝app模型”“simdemos”“dataclasses”' 金宝app+ SimulinkDemos '),...' + myPackage '“f”)

  3. 导航到+ myPackage文件夹到文件Signal.m的定义信号类。

  4. 取消的方法定义方法的部分setupCoderInfo.在函数的调用中useLocalCustomStorageClasses、替换“packageName”“myPackage”.当你完成后,这个section看起来像这样:

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

  5. 保存并关闭该文件。

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

  7. 保存并关闭该文件。

创建存储类和内存部分

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

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

    cscdesigner (“myPackage”)
  3. 在自定义存储类设计器中记忆的部分选项卡上,单击

  4. 对于新的内存部分,根据表设置属性。

    财产 价值
    的名字 CalMem
    语句包围 变量组
    之前的声明 # pragma交会(CALPRM)
    发布声明 # pragma交会()
    是常量 选择
    是不稳定的 选择

  5. 点击应用

  6. 自定义存储类选项卡上,单击

  7. 对于新的存储类,根据表设置属性。

    财产 价值
    的名字 CalParam
    信号 清晰的
    数据范围 出口
    头文件 calPrms.h
    定义文件 calPrms.c
    记忆的部分 CalMem

  8. 点击好吧.在响应关于保存更改的消息时,单击是的

“默认参数对象”设置为myPackage。参数

为了使应用存储类更容易,使用Model Explorer从更改默认参数对象金宝app仿真软件。参数myPackage。参数

  1. 在命令提示符下,打开Model Explorer。

    daexplr

  2. 在模型浏览器中模型层次结构窗格中,选择基本工作空间

  3. 在模型资源管理器工具栏中,单击添加Si金宝appmulink参数按钮。在下拉列表中选择自定义类列表

  4. 自定义类列表对话框,在参数类,选中前的复选框myPackage。参数.点击好吧

  5. 在模型资源管理器工具栏中,单击添加Si金宝appmulink参数按钮。在下拉列表中选择myPackage参数

    一个myPackage。参数对象出现在基本工作区中。您可以删除该对象。

现在,当您使用诸如Model Data Editor之类的工具来创建参数对象时,Simulink会创建金宝appmyPackage。参数对象而不是金宝app仿真软件。参数对象。

应用存储类

在示例模型中rtwdemo_roll,BasicRollMode子系统代表PID控制器。设置P、I、D参数为校准参数。

  1. 打开模型。

    rtwdemo_roll

  2. 在模型中,导航到BasicRollMode子系统。

  3. 在Apps库中,单击嵌入式编码器

  4. 在框图下面,通过选择模型数据编辑器打开模型数据编辑器选项卡。

  5. 在模型数据编辑器中,选择参数选项卡并更新框图。

    对象使用的工作空间变量对应的行获得块(表示控制器的P、I、D参数)。

  6. 在模型数据编辑器中,在内容过滤框,激活使用选择过滤器按钮。

  7. 在模型中,选择这三个获得块。

  8. 内容过滤框中,输入模型的工作空间

    变量获得块的使用在模型工作区中。

  9. 在数据表中,选择三行和存储类列作为行,选择转换为参数对象

    模型数据编辑器将工作区变量转换为myPackage。参数对象。现在,您可以对对象应用存储类。

  10. 存储类列作为行,选择CalParam

配置ASAP2接口生成

配置要生成的模型a2l文件。选择配置参数>代码生成>接口>ASAP2接口

生成和检查代码

  1. 从模型生成代码。

  2. 在代码生成报告中,检查calPrms.c文件。该文件定义了校准参数。

    /*导出数据定义*/ #pragma SEC(CALPRM) /*自定义存储类的定义:CalParam */ const volatile real32_T depgain = 0.75F;const volatile real32_T intGain = 0.5F;const volatile real32_T rateGain = 2.0F;# pragma交会()

    该文件calPrms.h声明参数。

  3. 检查接口文件rtwdemo_roll.a2l.该文件包含关于每个参数的信息,例如fordispGain

    /begin特性/*名称*/ disgain /*长标识*/ "" /*类型*/值/* ECU地址*/ 0x0000 /* @ECU_Address@dispGain@ */ /*记录布局*/ Scalar_FLOAT32_IEEE /*最大差值*/ 0 /*转换方法*/ rtwdemo_roll_CM_single /*下限*/ -3.4E+38 /*上限*/ 3.4E+38 /end特性

从系统常量或其他宏初始化参数值(嵌入式编码器)

您可以生成代码,用从某些系统常量(宏)计算出的值初始化可调参数。例如,您可以生成这段代码,它初始化一个可调参数totalVol使用从宏计算的值numVessels而且vesInitVol

#define numvessel * vesInitVol;

这种初始化技术保留了可调参数和系统常数之间的数学关系,这可以使生成的代码更可读,更容易维护。要生成此代码:

  1. 创建表示系统常量的参数对象。

    numvessel = S金宝appimulink.Parameter(16);vesInitVol = 金宝appSimulink.Parameter(18.2);

  2. 配置对象以使用存储类定义,这会在生成的代码中生成一个宏。

    numVessels.CoderInfo.StorageClass =“自定义”;numVessels.CoderInfo.CustomStorageClass =“定义”;vesInitVol.CoderInfo.StorageClass =“自定义”;vesInitVol.CoderInfo.CustomStorageClass =“定义”

  3. 创建另一个表示可调参数的参数对象。配置对象以使用存储类ExportedGlobal,这会在生成的代码中生成一个全局变量。

    totalVol = 金宝appSimulink.Parameter;totalVol.CoderInfo.StorageClass =“ExportedGlobal”

  4. 设置的值totalVol通过使用表达式numcontainers * vesInitVol . xml.要指定生成的代码保留表达式,请使用slexpr函数。

    totalVol。价值= slexpr(' numvessel * vesInitVol');

  5. 使用totalVol在模型中设置块参数值。从模型生成的代码使用基于系统常数的值初始化可调参数。

有关使用表达式设置值的详细信息和限制金宝app仿真软件。参数对象,看到用数学表达式设置变量值

参数对象存储位置对代码生成的影响

您可以在基本工作空间、模型工作空间或数据字典中创建参数对象。但是,当您结束MATLAB会话时,基本工作区中的变量将被删除。要确定在哪里存储模型使用的参数对象和其他变量,请参见确定在哪里存储Simulink模型的变量和对象金宝app

参数对象的位置会影响生成代码中相应数据定义的文件位置。

  • 如果将参数对象放在基本工作区或数据字典中,代码生成器假定对应的参数数据(例如,全局变量)属于生成代码的系统,而不是属于系统中的特定组件。例如,如果模型引用层次结构中的模型使用一个参数对象,而不是存储类汽车,数据定义出现在为层次结构中的顶层模型生成的代码中,而不是在为使用对象的模型生成的代码中。

    然而,如果你有嵌入式编码器®,一些存储类允许您指定拥有一段数据的模型的名称。当您指定所有者模型时,为该模型生成的代码将定义数据。有关数据所有权的更多信息,请参见在生成的文件中控制全局数据定义和声明的位置

  • 如果您在模型工作区中放置一个参数对象,代码生成器假定模型拥有数据。如果您从包含包含模型的引用层次结构生成代码,则数据定义将出现在为包含模型生成的代码中。

    有关数据所有权的更多信息,请参见在生成的文件中控制全局数据定义和声明的位置

  • 如果应用的存储类不是汽车对于参数对象,该对象在生成的代码中作为全局符号出现。因此,在模型引用层次结构中,不同模型工作区或字典中的两个这样的对象不能具有相同的名称。在整个模型层次结构中,每个对象的名称必须是惟一的。

    但是,如果您有嵌入式Coder,则可以使用存储类FileScope防止不同模型工作区中参数对象之间的名称冲突。看到使用结构存储类将参数数据组织到结构中

如果你存储一个AUTOSAR。参数对象,代码生成器将忽略您为对象指定的存储类。

配置信号数据的可访问性

当您在算法执行期间调优参数值时,您将监视或捕获输出信号值,以分析调优结果。要将生成代码中的信号表示为可访问的数据,可以使用测试点和存储类等技术。看到在生成代码中保留变量

用于调优参数的编程接口

你可以配置生成的代码包括:

设置可调参数的最小值和最大值

为可调参数指定最小值和最大值是最佳实践。

你可以指定这些最小值和最大值:

  • 在使用参数对象的块对话框中。使用这种技术在模型中存储最小和最大的信息。

  • 的性质金宝app仿真软件。参数对象,该对象用于设置参数值。使用这种技术可以在模型之外存储最小和最大的信息。

有关更多信息,请参见指定块参数的最小值和最大值

对其他建模目标的考虑

目标 注意事项和更多信息
应用存储类型限定符常量而且挥发性

如果您有嵌入式编码器,要生成存储类型限定符,请参见使用const和volatile类型限定符保护全局数据

通过应用关键字,防止不同组件中参数之间的名称冲突静态

如果您有嵌入式Coder,请使用存储类FileScope或者创建一个类似的存储类。看到为控制生成代码中的数据表示选择存储类

生成ASAP2 (a2l)描述

您可以生成a2l使用ASAP2标准描述校准参数的文件。有关更多信息,请参见为参数和信号定义ASAP2信息

生成AUTOSAR XML (ARXML)描述

如果您有Embedded Coder,您可以生成一个ARXML文件,该文件描述为AUTOSAR标准配置的模型所使用的校准参数。看到模型AUTOSAR校准参数和查找表(AUTOSAR Blockset)

存储查找表数据以便校准

要根据ASAP2或AUTOSAR标准(例如,STD_AXIS、COM_AXIS或CURVE)存储查找表数据进行校准,您可以使用金宝app仿真软件。LookupTable而且金宝app仿真软件。断点查找表块中的对象。

然而,也有一些限制。看到金宝app仿真软件。LookupTable.克服…的限制金宝app仿真软件。LookupTable而且金宝app仿真软件。断点对象,使用金宝app仿真软件。参数而不是对象。

有关更多信息,请参见为参数和信号定义ASAP2信息而且为AUTOSAR测量和校准配置查找表(AUTOSAR Blockset)

使用pragmas将参数数据存储在特定的内存位置

如果您有嵌入式Coder许可,要生成包含自定义语法的代码,请使用存储类和内存部分。看到通过插入语法在内存中放置控制数据和函数

另请参阅

||

相关的话题