文件

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

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

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

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

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

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

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

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

通过参数对象配置块参数

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

load_system('rtwdemo_paraminline')set_param('rtwdemo_paraminline''hideautomantnames'“关闭”) open_system ('rtwdemo_paraminline'

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

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

在模型中,单击G1.增益块。“模型数据编辑器”(Model Data Editor)高亮显示与模型相对应的行获得块的参数。

在模型数据编辑器中价值柱,改变从增益值2myGainParam

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

在创建新的数据块对话框中,设置价值金宝appSimulink.Parameter (2). 点击创建.一种金宝appSimulink.参数目的myGainParam存储参数值,2,在基本工作区中。

在myGainParam对话框中,设置存储类ExportedGlobal并点击好的. 该存储类使参数对象作为可调全局变量出现在生成的代码中。

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

set_param (“rtwdemo_paraminline/G1”'获得'“myGainParam”)mygainparam = s金宝appimulink.parameter(2);mygainparam.coderinfo.storageclass =.“ExportedGlobal”;

使用模型数据编辑器创建参数对象,myOtherGain,供G2.增益块。应用存储类ExportedGlobal

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

set_param (“rtwdemo_paraminline / G2”'获得''myothergain')myOtherGain = S金宝appimulink.Parameter(-2);myOtherGain.CoderInfo.StorageClass =“ExportedGlobal”;

生成和检查代码

从模型生成代码。

rtwbuild ('rtwdemo_paraminline'
为模型###开始构建过程:rtwdemo_paraminline ###为模型的构建过程的顺利完成:rtwdemo_paraminline

生成的文件rtwdemo_paraminline.h包含外部全局变量的声明myGainParammyOtherGain.你可以包括(#包括)此头文件使您的代码可以在执行期间读取和写入变量的值。

file = fullfile(“rtwdemo_paraminline_grt_rtw”'rtwdemo_paraminline.h'); rtwdemodbtype(文件,......“extern real\u T myGainParam;”'被引用:“”/G2'',1,1)
extern real_T myGainParam;/*变量:myGainParam*引用:'/G1'*/extern real\T myOtherGain;/*变量:myOtherGain*由“/G2”引用

文件rtwdemo_paraminline.c分配内存和初始化myGainParammyOtherGain

file = 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 *引用by: '/G2'

在模型中生成的代码算法一步功能用途myGainParammyOtherGain用于计算。

RTWDEMODBTYPE(文件,......'/ *型号阶跃函数* /''/ *型号初始化函数* /',1,0)
/*模型步长函数*/void rtwdemo\U paraminline\U步长(void){/*输出端口:'/Out1'包含:*增益:'/G1'*增益:'/G2'*输入端口:'/In1'*求和:'/Sum'*/rtwdemo\U paraminline\U Y.Out1=mygainparm*rtwdemo\U paraminline\U.In1+myOtherGain*-75.0;}

应用存储类块参数指的是数字MATLAB变量

如果您使用的数值变量设置块参数的值,你不能存储类应用到变量。作为一种变通方法,您可以将变量转换为参数对象,然后应用存储类的对象。要将变量转换为参数对象,选择这些技术之一:

  • 在模型数据编辑器上参数标签,有改变看法着手代码,查找与变量对应的行。在存储类列,从下拉列表中选择转换为参数对象.模型数据编辑器将变量转换为参数对象。然后,使用存储类列将存储类应用于对象。

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

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

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

此示例显示如何创建存储类,该存储类在生成的代码中产生校准参数。存储类导致每个参数对象(金宝appSimulink.参数)显示为具有特殊装饰品的全局变量,如关键字和Pragmas。

在生成的代码中,校准参数必须显示为名为的文件中定义的全局变量calPrms.c并宣布calPrms.h.变量定义必须如下所示:

#pragma sec(calprm)const volatile float param1 = 3.0f;Const挥发性浮动PARAM2 = 5.0f;const volatile float param3 = 7.0f;#pragma sec()

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

另外,所生成的代码必须包括ASAP2(A2L)的说明。

存储中存储存储级和内存条的定义创建包

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

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

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

    Copyfile(FullFile(Matlabroot,......“工具箱”'金宝appSIMULINK'“simdemos”“数据类”'+金宝app simulinkdemos'),......“+myPackage”“f”

  3. 导航里面的+ myPackage文件夹到文件signal.m.编辑。的定义信号班级。

  4. 取消注释方法定义方法的节setupCoderInfo. 在对函数的调用中USELOCALCUSTOMSTORAGECLASSES.代替“packageName”具有“myPackage”.当你完成时,这部分看起来像这样:

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

  5. 保存并关闭文件。

  6. 导航里面的+ myPackage文件夹到文件参数.M.编辑。的定义范围班级。取消注释方法定义方法的节setupCoderInfo和替换“packageName”具有“myPackage”

  7. 保存并关闭文件。

创建存储类和内存条

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

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

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

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

    财产 价值
    姓名 平静
    语句环绕 变量组
    之前的声明 # pragma交会(CALPRM)
    事后声明 #pragma sec()
    这是常数 选择
    不稳定 选择

  5. 点击申请

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

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

    财产 价值
    姓名 CalParam
    信号 清除
    数据范围 出口
    头文件 calPrms.h
    定义文件 calPrms.c
    存储器部分 平静

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

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

为了使应用存储类更容易,请使用模型资源管理器将默认参数对象从金宝appSimulink.参数myPackage.Parameter

  1. 在命令提示符下,打开模型资源管理器。

    daexplr

  2. 在Model Explorer模型层次结构窗格,选择基地工作区

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

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

  5. 在“模型资源管理器”工具栏中,单击旁边的箭头添加模型金宝app参数按钮在下拉列表中,选择myPackage参数

    一种myPackage.Parameter对象出现在基础工作区中。您可以删除此对象。

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

应用存储类

在示例模型中rtwdemo_卷, 这BasicRollMode子系统表示的PID控制器。配置P,I和d参数校准参数。

  1. 打开模型。

    rtwdemo_卷

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

  3. 在应用程序库中,单击嵌入式编码器

  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 dispGain=0.75F;常数volatile real32_T intGain=0.5F;常数可变real32\u T rateGain=2.0F#pragma SEC()

    文件calPrms.h声明参数。

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

    / / *开始特征名字* / dispGain / *长标识符  */ "" /* 价值类型* / / * ECU地址* / 0 x0000 / * @ECU_Address@dispGain@ * / / *记录* /布局Scalar_FLOAT32_IEEE / *最大区别* / 0 / *转换方法* / rtwdemo_roll_CM_single / * * /下限-3.4 e+38 / * * /上限3.4 e+38 /结束的特点

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

您可以生成使用从某些系统常量(宏)计算的值初始化可调参数的代码。例如,您可以生成此代码,它初始化一个可调参数总体积使用从宏计算的值numVesselsvesInitVol

的#define numVessels 16的#define vesInitVol 18.2双totalVol = numVessels * 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. 设置总体积通过使用表达式numVessels * vesInitVol.要指定生成的代码保留表达式,请使用slexpr功能。

    totalVol。价值= slexpr('numvessels * vesinitvol');

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

有关使用表达式设置a的值的更多信息和限制金宝appSimulink.参数对象时,看到使用数学表达式设置变量值(金宝appSimulink)。

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

可以创建在基工作区的参数对象中,模型工作区,或一个数据字典。但是,当您结束MATLAB会话,在基础工作空间的变量被删除。要确定在何处存储参数对象和其他变量的模型使用,看见确定存储变量和对象为Simulink模型金宝app(金宝appSimulink)。

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

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

    然而,如果你有嵌入式编码器®一些存储类,您可以指定拥有一块数据的模型的名称。当你指定所有者的模式,该模型生成的代码定义的数据。有关数据所有权的详细信息,请参阅控制全局数据定义和声明在生成文件中的位置(嵌入式编码)。

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

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

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

    但是,如果您有嵌入式编码器,则可以使用存储类FileScope防止不同模型工作区中的参数对象之间的名称冲突。看将内置和自定义存储类应用于数据元素(嵌入式编码)。

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

配置信号数据的可访问性

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

用于调整参数的编程接口

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

  • C应用程序编程接口(API),用于调整与外部模式无关的参数。生成的代码包括额外代码,以便您可以编写自己的代码来访问参数值。看Exchange数据之间产生和外部代码使用C API

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

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

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

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

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

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

有关更多信息,请参阅指定块参数最小值和最大值(金宝appSimulink)。

其他建模目标的考虑

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

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

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

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

生成ASAP2(A2L)描述

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

生成AUTOSAR XML(arxml)描述

如果您有嵌入式编码器,您可以生成arxml文件,描述为AUTOSAR标准配置的模型所使用的校准参数。看模型AUTOSAR校准参数和查找表(AutoSar SlockSet)。

存储用于校准的查找表数据

要根据ASAP2或AutoSAR标准存储查找表数据以进行校准(例如,STD_AXIS,COM_AXIS或曲线),您可以使用金宝appSimulink.LookupTable金宝appsimulink.breakpoint.查找表块中的对象。

但是,也存在一些限制。看见金宝appSimulink.LookupTable.要解决的局限性金宝appSimulink.LookupTable金宝appsimulink.breakpoint.对象,使用金宝appSimulink.参数对象。

有关更多信息,请参阅定义ASAP2参数和信号的信息为AUTOSAR测量和校准配置查找表(AutoSar SlockSet)。

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

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

也可以看看

||

相关话题