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

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

  • 确定通过调谐参数和执行期间监测的信号值的最佳参数值。

  • 通过重写存储在存储器中的参数值有效地适应算法来不同执行条件。例如,可以通过在每个车辆的发动机控制单元,其存储不同的参数值用于不同质量的多个车辆相同的控制算法。

在Si万博1manbetxmulink®, 创建一个万博1manbetxSimulink.Parameter对象来表示校准参数。您可以使用参数对象来设置块参数值,如获得一个参数获得块。要在生成的代码中控制参数对象的表示,可以将存储类应用于该对象。

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

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

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

配置块参数通过使用参数对象

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

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

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

在模型数据编辑器中,检查参数标签。

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

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

旁边的myGainParam单击动作按钮(三个垂直圆点),然后选择创建

在创建新的数据块对话框中,设置价值万博1manbetxSimulink.Parameter(2)。点击创建。一个万博1manbetxSimulink.Parameter对象myGainParam存储参数值,2,在基本工作区中。

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

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

set_param('rtwdemo_paraminline / G1','获得',“myGainParam”) myGainParam = 万博1manbetxSimulink.Parameter(2);myGainParam.CoderInfo。StorageClass ='ExportedGlobal';

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

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

set_param('rtwdemo_paraminline / G2','获得',“myOtherGain”)myOtherGain = S万博1manbetximulink.Parameter(-2);myOtherGain.CoderInfo.StorageClass ='ExportedGlobal';

生成和检查代码

从模型中生成代码。

rtwbuild(“rtwdemo_paraminline”)
###启动构建过程:rtwdemo_paraminline ###的构建过程的顺利完成:rtwdemo_paraminline

生成的文件rtwdemo_paraminline.h包含走读生全局变量的声明myGainParammyOtherGain。您可以包括(# include)这个头文件,以便您的代码可以在执行期间读写变量的值。

文件= fullfile ('rtwdemo_paraminline_grt_rtw','rtwdemo_paraminline.h');rtwdemodbtype(文件,...'的extern real_T myGainParam;',引用:“< Root > / G2”,1,1)
走读生real_T myGainParam;/*变量:myGainParam * by: '/G1' */ extern real_T myOtherGain;/*变量:myOtherGain *引用:‘<根>/G2’

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

文件= fullfile ('rtwdemo_paraminline_grt_rtw',“rtwdemo_paraminline.c”);rtwdemodbtype(文件,...'/ *导出块参数* /',引用:“< Root > / G2”,1,1)
/ *导出块参数* / real_T myGainParam = 2.0;/ *变量:myGainParam *引用的由: '<根> / G1' * / real_T myOtherGain = -2.0;/*变量:myOtherGain *引用:‘<根>/G2’

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

rtwdemodbtype(文件,...'/ *型号阶跃函数* /','/ *型号初始化函数* /',1,0)
/* Model step function */ void rtwdemo_paraminline_step(void) {/* Outport: '<根>/Out1'合并:* Gain: '<根>/G1' * Gain: '<根>/G2' * Inport: '<根>/In1' * Sum: '<根>/Sum' */ rtwdemo_paraminline_YOut1 = myGainParam * rtwdemo_paraminline_U。In1 + myOtherGain * -75.0;}

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

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

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

    您也可以在模型浏览器中使用这项技术。

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

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

这个示例展示了如何创建一个存储类,该存储类在生成的代码中生成一个校准参数。存储类导致每个参数对象(万博1manbetxSimulink.Parameter)以全局变量的形式出现,带有特殊的修饰,如关键字和pragmas。

在生成的代码,校准参数必须出现在一档名为定义为全局变量calPrms.c并宣布在calPrms.h。变量定义必须像这些定义:

const volatile float param1 = 3.0F;const浮动阀param2 = 5.0F;const浮动阀param3 = 7.0F;# pragma交会()

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

另外,所生成的代码必须包括ASAP2(A2L每个参数的)描述。

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

现在,通过复制的例子包创建在当前文件夹一个包+万博1manbetx SimulinkDemos。该软件包存储的定义参数信号稍后用于将存储类应用到模型中的数据元素的类。稍后,该包还存储存储类的定义和关联的内存部分。

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

  2. 复制+万博1manbetx SimulinkDemos将文件夹打包到当前文件夹中。名字复制+ mypackage的

    拷贝文件(fullfile (matlabroot,...“工具箱”,'万博1manbetxSIMULINK',“simdemos”,“数据类”,' 万博1manbetx+ SimulinkDemos '),...' + myPackage ','F')

  3. 导航里面的+ mypackage的文件夹复制到文件Signal.m编辑的定义信号类。

  4. 取消的方法定义方法的部分setupCoderInfo。在调用该函数useLocalCustomStorageClasses,更换'包裹名字''mypackage的'。当你完成,部分看起来是这样的:

    方法函数setupCoderInfo(H)从这个包%使用自定义存储类useLocalCustomStorageClasses (h,'mypackage的');结束结束%的方法

  5. 保存并关闭文件。

  6. 导航里面的+ mypackage的文件夹复制到文件Parameter.m编辑的定义参数类。取消的方法定义方法的部分setupCoderInfo和替换'包裹名字''mypackage的'

  7. 保存并关闭文件。

创建存储类和内存条

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

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

    cscdesigner('mypackage的')
  3. 在自定义存储类设计器中,对存储器部分选项卡上,单击

  4. 对于新的存储部,根据该表中设置属性。

    财产 价值
    名称 CalMem
    声明环绕 组变量
    前报告 的#pragma SEC(CALPRM)
    发布声明 # pragma交会()
    是常量 选择
    是不稳定的 选择

  5. 点击应用

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

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

    财产 价值
    名称 CalParam
    对于信号 明确
    数据范围 出口
    头文件 calPrms.h
    定义文件 calPrms.c
    内存部分 CalMem

  8. 点击。响应有关保存更改的消息,单击

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

为了使应用存储类更容易,使用Model Explorer来更改默认参数对象万博1manbetxSimulink.ParametermyPackage.Parameter

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

    daexplr

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

  3. 在模型资源管理器工具栏中,单击旁边的箭头添加Si万博1manbetxmulink的参数按钮。在下拉列表中,选择自定义类列表

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

  5. 在模型资源管理器工具栏中,单击旁边的箭头添加Si万博1manbetxmulink的参数按钮。在下拉列表中,选择myPackage参数

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

现在,当您使用诸如模型数据编辑器之类的工具来创建参数对象时,Simulink将创建万博1manbetxmyPackage.Parameter对象,而不是万博1manbetxSimulink.Parameter对象。

应用存储类

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

  1. 打开模型。

    rtwdemo_roll

  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 * /常量挥发性real32_T dispGain = 0.75F;常量挥发性real32_T intGain = 0.5F;常量挥发性real32_T rateGain = 2.0F;# pragma交会()

    文件calPrms.h声明参数。

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

    /开始特性/ *名称* / dispGain / *长标识符* / “”/ *类型* /价值/ * ECU地址* / 0×0000 / * @ ECU_Address @ dispGain @ * / / *记录布局* / Scalar_FLOAT32_IEEE / *最大区别* / 0 / *转换方法* / rtwdemo_roll_CM_single / *下限* / -3.4E + 38 / *上限* / 3.4E + 38 /端特性

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

您可以生成初始化与一些系统常数(宏)计算出的值的可调参数代码。例如,您可以生成这个代码,它初始化一个可调参数totalVol使用从宏计算的值numVesselsvesInitVol:

的#define numVessels 16的#define vesInitVol 18.2双totalVol = numVessels * vesInitVol;

这种初始化方法保留了可调参数和系统常数,它可以使所生成的代码的可读性和易于维护之间的数学关系。要生成这样的代码:

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

    numVessels = 万博1manbetxSimulink.Parameter (16);vesInitVol = 万博1manbetxSimulink.Parameter (18.2);

  2. 配置对象使用存储类定义,其产生在生成的代码的宏。

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

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

    totalVol = 万博1manbetxSimulink.Parameter;totalVol.CoderInfo。StorageClass ='ExportedGlobal';

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

    totalVol.Value = slexpr(“numVessels * vesInitVol”);

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

有关使用表达式设置的值的更多信息和限制,请参阅万博1manbetxSimulink.Parameter对象时,看到使用数学表达式设置变量值(万博1manbetx模型)。

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

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

一个参数对象的位置可以在生成的代码影响相应的数据定义的文件放置。

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

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

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

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

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

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

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

信号数据的配置辅助

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

用于调优参数的编程接口

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

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

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

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

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

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

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

  • 通过使用的属性万博1manbetxSimulink.Parameter对象,你用它来设置参数值。使用此技术来存储模型之外的最小值和最大值的信息。

欲了解更多信息,请参阅指定块参数最小值和最大值(万博1manbetx模型)。

注意事项其它建模目标

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

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

通过将关键字不同组件参数之间防止命名冲突静态

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

生成ASAP2(A2L)描述

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

生成AUTOSAR XML (ARXML)描述

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

存储查找表数据以便校准

要根据ASAP2或AUTOSAR标准(例如STD_AXIS、COM_AXIS或CURVE)存储查找表数据以便进行校准,可以使用万博1manbetxSimulink.LookupTable万博1manbetxSimulink.Breakpoint对象中的查找表的块。

然而,也有一些限制。看到万博1manbetxSimulink.LookupTable。要解决的局限性万博1manbetxSimulink.LookupTable万博1manbetxSimulink.Breakpoint对象,使用万博1manbetxSimulink.Parameter而不是对象。

欲了解更多信息,请参阅为参数和信号定义ASAP2信息为AUTOSAR测量和校准配置查找表(AUTOSAR Blockset)。

使用编译指示存储的参数数据在特定内存位置

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

另请参阅

||

相关话题