主要内容

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

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

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

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

在仿真金宝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”对话框中,在代码生成选项卡上,单击在编码器应用程序中配置

在代码映射编辑器中,设置存储类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构建摘要构建的顶级模型目标:模型动作重建原因==================================================================================================== 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.的定义参数而且信号稍后用于将存储类应用于模型中的数据元素的类。稍后,包还存储存储类的定义和关联的内存段。

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

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

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

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

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

    方法函数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. 在“应用程序”库中,单击嵌入式编码器

  4. 控件的下面,打开模型数据编辑器模型数据编辑器选项卡。

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

    控件使用的工作区变量对应的行获得block(表示控制器的P、I和D参数)。

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

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

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

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

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

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

  10. 存储类选择某一行的列CalParam

生成和检查代码

  1. 从模型生成代码。

  2. 在代码生成报告中,检查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声明参数。

  3. 检查接口文件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

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

  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通过使用表达式numvessel * vesInitVol.要指定生成的代码保留表达式,请使用slexpr函数。

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

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

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

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

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

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

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

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

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

    有关数据所有权的详细信息,请参见控制在生成的文件中全局数据定义和声明的放置(嵌入式编码)

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

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

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

配置信号数据的可访问性

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

用于调优参数的编程接口

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

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

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

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

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

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

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

对其他建模目标的考虑

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

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

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

如果你有嵌入式编码器,使用存储类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许可证,要生成包含自定义pragmas的代码,请使用存储类和内存部分。看到通过插入Pragmas控制数据和函数在内存中的位置(嵌入式编码)

另请参阅

||

相关的话题