主要内容

编译代码有条件地对所有变量参数的值相同和不同的维度

这个例子展示了如何生成一个包含所有活跃的和不活跃的C代码的值变异参数。预处理条件的值是封闭的#如果# elif有条件地允许您编译代码基于评估的条件真正的

在这个例子中,您将学习如何:

  • 使用存储类控制外观、位置、变异参数变量的声明和定义,在生成的代码。

  • 使用符号维度传播不同维度的变量参数的符号生成的代码。代表维度作为符号使代码之间灵活切换维度值给定的主动选择不重新生成代码每次你改变变异控制变量的值。

变异参数的概述

变异参数可以有多个值。每个值的变异参数变异条件表达式。在仿真中,变量的值参数与条件评估真正的是参数的积极价值。与条件评估相关联的值是变量参数的不活跃的价值。有关更多信息,请参见使用变量参数重用块参数不同的值

在生成的代码中,活跃的和不活跃的变量参数的值包含在C预处理条件#如果# elif。预处理器条件使您能够有条件地编译代码值对于一个给定的活跃。你只有一次生成代码。然后您可以选择积极的变异参数通过改变变量控制变量的值在运行代码之前。你不需要重新生成代码参数选择不同的变体。

  • 参数变量表示的变体:表示为内联或可调变量值在生成的代码。表示是由你指定的存储类中的变量参数模型。变异参数使用默认存储类汽车表示为内联变量。变异参数以外的存储类汽车在生成的代码中表示为可调变量。有关不同的存储类的更多信息在生成的代码中,表示明白了选择存储类数据表示控制生成的代码(金宝app仿真软件编码器)

  • 表示参数维度的变体:如果变量参数的值有不同的维度,那么尺寸是用符号表示。这些符号在传播模型在仿真,然后进入生成的代码。代表维度作为符号,必须设置建模>模型设置>诊断>先进的参数>允许象征性的尺寸规格。符号维度的更多信息,请参阅允许象征性的尺寸规格

先决条件

在你开始这个例子中,我们建议您完成选项代表变异参数生成的代码(嵌入式编码)

探索模型

1。打开模型。

open_system (“slexVariantParametersCC”)

模型包含块变异参数指定为金宝appSimulink.VariantVariable对象。中定义的对象slexVariantParameterCCData.m文件。

  • 常数:常数参数恒定的块变量参数。指定的参数作为变量变量对象MAX_LIFTSLIDER_POS

  • 表数据断点集:表数据断点集一天的查找表块变异参数。指定的参数作为变量变量对象T1Break1,T1Data,T2Break,T2Data

2。打开slexVariantParameterData.m。观察这些设置的文件:

  • 在此文件中,VCtrl金宝appSimulink.VariantControl对象,确定变异参数对象的活跃值MAX_LIFT,SLIDER_POS,T1Break1,T1Data,T2Break,T2Data。的价值VCtrl被设置为1,它被指定为激活时间代码编译。在仿真过程中,条件VCtrl = = 1计算结果为真正的。所有相关的值VCtrl = = 1变得活跃,与相关联的值VCtrl = = 2变得不活跃。当你从这个模型生成代码,所有活跃的和不活跃的值包含在预处理条件#如果# elif

  • 变异参数对象MAX_LIFTSLIDER_POS有标量数值默认存储类汽车。当您生成代码时,的值常数参数是内联宏。变异参数对象T1Break1,T1Data,T2Break,T2Data金宝appSimulink.Parameter与存储类指定为类型ExportedGlobal。生成代码时,符号名称为可调变量所代表的值是在生成的代码。

  • 变异参数对象T1Break1T1Data有值和不同的维度。当您生成代码时,这些参数表示为符号的尺寸。

设置活动变量参数的选择

1。在仿真软件上®金宝app将来发布,点击运行。在模拟中,VCtrl = = 1计算结果为真正的。所有相关的值VCtrl = = 1分配给变量对象和相应的变体,随后,变异参数,使用这些对象。例如,当VCtrl = = 1计算结果为真正的的价值,MAX_LIFT被设置为10。随着常数参数的Constant1块设置为MAX_LIFT,的值常数参数也将10

2。改变积极的价值观,改变的价值VCtrl2,然后再次模拟模型。

VCtrl。值= 2;

在仿真中,相关的所有值VCtrl = = 2分配给变量变量对象,然后这些值是使用这些对象分配给变量参数。

使用嵌入式编码器生成代码

来生成代码对于不同维度的变量参数的值,使用嵌入式编码器。

从模型生成代码之前,确保您拥有写权限在当前文件夹。生成代码,应用程序模型的画廊将来发布,点击嵌入式编码器。在C代码选项卡上,单击构建。有关更多信息,请参见使用嵌入式编码器生成代码(嵌入式编码)

在生成的代码审查内联和可调参数

1。在C代码选项卡上,选择开放的报告

2。选择slexVariantParametersCC_types.h文件从生成的代码报告的窗格。这个文件定义了不同控制变量的值VCtrl作为1。不同控制变量决定了变种的活跃值参数。

的ifndef VCtrl #定义VCtrl 1 # endif

3所示。选择slexVariantParametersCC_private.h文件。这个文件包括宏(#定义)对应于所有变量参数的值与默认的存储类汽车。变体的活跃值参数MAX_LIFTSLIDER_POS在C预处理器封闭条件语句(#如果)宏rtCP_Constant_MAX_LIFTrtCP_Constant1_SLIDER_POS

#如果VCtrl = = 1 | | VCtrl = = 2 / *变量:MAX_LIFT *引用:“< Root > /常数”* / #如果VCtrl = = 1 #定义rtCP_Constant_MAX_LIFT (10.0) # elif VCtrl = = 2 # define rtCP_Constant_MAX_LIFT (20.0) # endif # endif
#如果VCtrl = = 1 | | VCtrl = = 2 / *变量:SLIDER_POS *引用:“< Root > / Constant1”* / #如果VCtrl = = 1 #定义rtCP_Constant1_SLIDER_POS (0.0) # elif VCtrl = = 2 # define rtCP_Constant1_SLIDER_POS (0.5) # endif # endif

4所示。选择slexVariantParametersCC.h文件。这个文件包含所有变量的值的符号名称和存储类设置为参数ExportGlobal。变量被定义为走读生变量。

/ *输出全局参数#如果VCtrl = = 1 | | VCtrl = = 2走读生real_T T1Break [T1Break_dim0];/ *变量:T1Break *引用:“< Root > / 1 d查找”* / # endif
#如果VCtrl = = 1 | | VCtrl = = 2走读生real_T T1Data [T1Data_dim0];/ *变量:T1Data *引用:“< Root > / 1 d查找”* / # endif
#如果VCtrl = = 1 | | VCtrl = = 2走读生real_T T2Break [3];/ *变量:T2Break *引用:“< Root > / 2 d查找”* / # endif
#如果VCtrl = = 1 | | VCtrl = = 2走读生real_T T2Data [9];/ *变量:T2Data *引用:“< Root > / 2 d查找”* / # endif

5。选择slexVariantParametersCC.c文件。所有的变量参数的值都包含在C预处理程序条件语句#如果# elif。当你编译这段代码,仿真软件评价预处理条件和编译的代码只活金宝app跃的变量参数的值。您可以指定一个不同的值VCtrl重新编译相同的代码,其他活动变量参数的值。

/ *输出块参数* / #如果VCtrl = = 1
real_T T1Break [T1Break_dim0] = {-5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0};/ *变量:T1Break *引用:“< Root > / 1 d查找”* /
real_T T1Data [T1Data_dim0] = {-0.99990920426259511, -0.999329299739067, -0.99505475368673046, -0.9640275800758169, -0.76159415595576485, 0.0, 0.76159415595576485, 0.9640275800758169, 0.99505475368673046, 0.999329299739067, 0.99990920426259511};/ *变量:T1Data *引用:“< Root > / 1 d查找”* /
real_T T2Break [3] = {-10.0, 0.0, 10.0};/ *变量:T2Break *引用:“< Root > / 2 d查找”* /
real_T T2Data [9] = {4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0};/ *变量:T2Data *引用:“< Root > / 2 d查找”* /
# elif VCtrl = = 2
real_T T1Break [T1Break_dim0] = {-10.0, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};/ *变量:T1Break *引用:“< Root > / 1 d查找”* /
real_T T1Data [T1Data_dim0] = {-0.99999999587769273, -0.999999969540041, -0.99999977492967584, -0.99999833694394469, -0.99998771165079559, -0.99990920426259511, -0.999329299739067, -0.99505475368673046, -0.9640275800758169, -0.76159415595576485, 0.0, 0.76159415595576485, 0.9640275800758169, 0.99505475368673046, 0.999329299739067, 0.99990920426259511, 0.99998771165079559, 0.99999833694394469, 0.99999977492967584, 0.999999969540041, 0.99999999587769273};/ *变量:T1Data *引用:“< Root > / 1 d查找”* /
real_T T2Break [3] = {-20.0, 0.0, 20.0};/ *变量:T2Break *引用:“< Root > / 2 d查找”* /
real_T T2Data [9] = {8.0, 32.0, 20.0, 10.0, 38.0, 36.0, 12.0, 40.0, 46.0};/ *变量:T2Data *引用:“< Root > / 2 d查找”* /
# endif

在此文件中,每个变量的阶跃函数调用是条件编译。阶跃函数,宏和象征的名字变体参数用于方程形式。

阶跃函数* / / *模型
空白slexVariantParameters_step {slexVariantParametersCC_Y(无效)。着干活= look2_binlx (rtCP_Constant_MAX_LIFT look1_binlx (rtCP_Constant1_SLIDER_POS、T1Break T1Data, T1Data_dim0 - 1 u), T2Break, T2Break, T2Data, slexVariantParametersCC_ConstP。uDLookup_maxIndex 3 u) * -2.0 + 2.0 * slexVariantParametersCC_U.In1;}

审查尺寸符号生成的代码

选择slexVariantParametersCC.c文件从生成的代码报告的窗格。在此文件中,变异的尺寸参数T1BreakT1Data符号表示为T1Break_dim0T1Data_dim0条件语句和封闭在C预处理器#如果# elif。当你编译这段代码,仿真软件评价预处理条件和保存的代码只活金宝app跃的变量参数的值。如果指定的值VCtrl作为1,条件VCtrl = = 1计算结果为真正的,封闭的值V = = 1代码编译期间变得活跃。您可以指定一个不同的值VCtrl重新编译相同的代码,其他积极的价值观T1BreakT1Data

另请参阅