主要内容

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

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

  • 通过在执行期间调整参数和监视信号值来确定最优参数值。

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

在Si金宝appmulink.®, 创建一个金宝appSimulink.Parameter.对象表示校准参数。使用参数对象设置块参数值,例如获得A.参数获得块。要在生成的代码中控制参数对象的表示,需要对对象应用存储类。

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

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

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

通过参数对象配置块参数

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

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

在这一点建模选项卡上,单击模型数据编辑器

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

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

在模型数据编辑器中价值列,从而改变增益值2mygainparam.

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

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

在MygainParam对话框中,在代码生成选项卡上,单击在编码器应用程序中配置

在代码映射编辑器中,设置存储类mygainparam.ExportedGlobal.此存储类使参数对象显示在生成的代码中作为可调全局变量。

或者,要创建参数对象并配置模型,请在命令提示符下使用这些命令:

set_param('rtwdemo_paraminline / g1''获得''mygainparam')mws = get_param(“rtwdemo_paraminline”“modelworkspace”);mws.assignin('mygainparam'S金宝appimulink.Parameter (2));厘米= coder.mapping.utils.create (“rtwdemo_paraminline”);setmodelparameter(cm,'mygainparam''storageeclass''ExportedGlobal');

使用模型数据编辑器创建参数对象,迈运人, 为了G2增益块。应用存储类ExportedGlobal

或者,在命令提示符下使用这些命令:

set_param('rtwdemo_paraminline / g2''获得'“myOtherGain”)mws.assignin(“myOtherGain”,金宝appsimulink.parameter(-2));setmodelparameter(cm,“myOtherGain”'storageeclass''ExportedGlobal');

生成和检查代码

从模型生成代码。

SLBUILD(“rtwdemo_paraminline”
###成功完成rtwdemo_paraminline的构建过程:模型重建行动的原因  ==================================================================================================== rtwdemo_paraminline代码生成和编译代码生成信息文件不存在。建造时间:0小时0米9.502秒

生成的文件RTWDEMO_Paraminline.h.包含走读生全局变量的声明mygainparam.迈运人.你可以包括(# include)此头文件,以便您的代码可以在执行期间读取和写入变量的值。

文件= fullfile (“rtwdemo_paraminline_grt_rtw”“rtwdemo_paraminline.h”);rtwdemodbtype(文件,......'extern real_t mygainparam;''由以下命令率为:'' / g2'',1,1)
extern real_t mygainparam;/ *变量:mygainparam *由以下命令引用:' / g1'* / external real_t myothergain;/ *变量:Myothergain *由以下命令引用:' / g2'

文件RTWDEMO_Paraminline.c.分配内存并初始化mygainparam.迈运人

文件= 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.迈运人计算。

rtwdemodbtype(文件,......'/ *模型步骤功能* /''/ *模型初始化功能* /',1,0)
/ *模型步骤函数* / void RTWDEMO_ParaminLine_Step(void){/ * Outport:' / out1'包含:*增益:' / g1'*增益:' / g2'* Inport:' / in1'* sum:' / sum'* / rtwdemo_paraminline_y.out1 = mygainparam * rtwdemo_paraminline_u.in1 + myothergain * -75.0;}

当块参数指的是数字时,应用存储类MATLAB多变的

如果使用数字变量来设置块参数的值,则无法将存储类应用于变量。作为解决方法,您可以将变量转换为参数对象,然后将存储类应用于对象。要将变量转换为参数对象,请选择其中一个技术:

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

    您还可以在模型资源管理器中使用此技术。

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

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

这个例子展示了如何创建一个存储类,在生成的代码中生成一个校准参数。存储类导致每个参数对象(金宝appSimulink.Parameter.)显示为带有特殊修饰(如关键字和语用)的全局变量。

在生成的代码中,校准参数必须显示为名为的文件中定义的全局变量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,......'工具箱''金宝appsimulink''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交会()
    是const. 选择
    是挥发性的 选择

  5. 点击应用

  6. 在这一点自定义存储类选项卡上,单击新的

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

    财产 价值
    的名字 Calparam.
    信号 清除
    数据范围 出口
    标题文件 calprms.h.
    定义文件 calprms.c.
    记忆部分 CalMem

  8. 点击.响应关于保存更改的消息,请单击是的

将默认参数对象设置为mypackage.Parameter.

要使存储类更容易,请使用Model Explorer更改默认参数对象金宝appSimulink.Parameter.mypackage.Parameter.

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

    daexplr

  2. 在模特资源管理器中模型层次结构窗格中,选择基本工作空间

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

  4. 在里面自定义类列表对话框,在参数类,选中旁边的复选框mypackage.Parameter..点击

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

    一个mypackage.Parameter.对象出现在基本工作区中。可以删除该对象。

现在,当您使用诸如模型数据编辑器之类的工具来创建参数对象时,Simulink会创建金宝appmypackage.Parameter.对象而不是金宝appSimulink.Parameter.对象。

应用存储类

在示例模型中RTWDEMO_ROLL.,基础罗兰码子系统表示PID控制器。将P,I和D参数配置为校准参数。

  1. 打开模型。

    RTWDEMO_ROLL.

  2. 在模型中,导航到基础罗兰码子系统。

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

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

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

    现在,数据表包含与由此使用的工作区变量对应的行获得块(表示控制器的p,i和d参数)。

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

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

  8. 在里面过滤器件框中,输入模型工作区

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

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

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

  10. 在里面存储类列一行,选择Calparam.

配置ASAP2接口生成

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

生成和检查代码

  1. 从模型生成代码。

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

    / *导出数据定义* / #pragma sec(calprm)/ *定义存储类的定义:Calparam * / const volatile Real32_t Dieptain = 0.75f;const valatile neal32_t intgain = 0.5f;Const Volatile Real32_t Rategain = 2.0F;# pragma交会()

    文件calprms.h.声明参数。

  3. 检查接口文件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.具有从宏计算的值numVesselsvesInitVol

#define numvessel 16 #define vesInitVol 18.2 double totalVol = numvessel * vesInitVol;

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

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

    numVessels = 金宝appSimulink.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.通过使用表达式numvessels * vesinitvol..要指定生成的代码保留表达式,请使用Slexpr.函数。

    totalVol。价值= slexpr(“numVessels * vesInitVol”);

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

有关使用表达式设置值的更多信息和限制金宝appSimulink.Parameter.对象,参见使用数学表达式设置变量值

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

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

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

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

    但是,如果您有嵌入式编码器®,某些存储类使您可以指定拥有一条数据的模型的名称。指定所有者模型时,为该模型生成的代码定义了数据。有关数据所有权的更多信息,请参阅控制全局数据定义和声明在生成文件中的位置(嵌入式编码器)

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

    有关数据所有权的更多信息,请参阅控制全局数据定义和声明在生成文件中的位置(嵌入式编码器)

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

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

如果你储存AutoSar.Parameter.Parameter.对象在模型工作区中,代码生成器忽略您为对象指定的存储类。

配置信号数据的可访问性

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

调整参数的程序接口

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

  • 一个C应用程序编程接口(API),用于独立于外部模式的参数调优。生成的代码包括额外的代码,以便您可以编写自己的代码来访问参数值。看到使用C API将生成和外部代码之间的交换数据

  • 目标语言编译器API,用于独立于外部模式的参数调优。看到参数功能

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

为可调谐参数指定最小值和最大值是最佳做法。

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

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

  • 利用a的性质金宝appSimulink.Parameter.您用于设置参数值的对象。使用此技术存储模型外的最小和最大信息。

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

其他建模目标的考虑

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

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

通过应用关键字,避免不同组件的参数名称冲突静态

如果您有嵌入式编码器,请使用存储类丝锥或您创建的类似存储类。看到选择用于控制生成代码中的数据表示的存储类(嵌入式编码器)

生成ASAP2 (a2l) 描述

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

生成ARXML描述

如果您有嵌入式编码器,则可以生成一个ARXML文件,该文件描述了您为AutoSAR标准配置的模型使用的校准参数。看到模型AUTOSAR校准参数和查找表(AutoSAR块集)

存储查找表数据进行校准

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

但是,一些限制适用。看到金宝app仿真软件。LookupTable.解决局限性金宝app仿真软件。LookupTable金宝app仿真软件。断点对象,使用金宝appSimulink.Parameter.反对者。

有关更多信息,请参阅为参数和信号定义ASAP2信息为Autosar测量和校准配置查找表(AutoSAR块集)

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

如果您有Embedded Coder许可证,要生成包含自定义pragmas的代码,请使用存储类和内存段。看到通过插入语控制数据和函数在内存中的位置(嵌入式编码器)

另请参阅

||

相关话题