主要内容

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

这个例子展示了如何生成包含变量参数的所有激活和非激活值的C代码。这些值包含在预处理器条件中#如果而且# elif这使您能够根据求值为的条件有条件地编译代码真正的

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

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

  • 在生成的代码中,使用符号维将变量参数的不同维作为符号传播。将维度表示为符号使代码能够灵活地在给定主动选择的维度值之间切换,而不必在每次更改变量控制变量的值时重新生成代码。

变量参数概述

可变参数可以有多个值。变量参数的每个值都与一个变量条件表达式相关联。在模拟过程中,与计算为的条件相关联的变量参数的值真正的是该参数的活动值。与计算为的条件相关联的值是该变量参数的非活动值。有关更多信息,请参见使用可变参数重用具有不同值的块参数

在生成的代码中,变量参数的激活值和非激活值都包含在C预处理器条件中#如果而且# elif.预处理器条件使您能够有条件地编译给定活动值的代码。只需生成一次代码。然后,您可以在运行代码之前通过更改变量控制变量的值来选择变量参数的主动选择。您不需要为不同的变量参数选择重新生成代码。

  • 可变参数变量的表示:值在生成的代码中表示为内联变量或可调变量。表示形式由您为模型中的变量参数指定的存储类决定。具有默认存储类的变量参数汽车表示为内联变量。存储类不是的变量参数汽车在生成的代码中表示为可调变量。有关如何在生成的代码中表示不同的存储类的更多信息,请参见选择在生成的代码中控制数据表示的存储类(金宝app仿真软件编码器)

  • 不同参数维度的表示:如果变量参数的值有不同的维数,则维数用符号表示。在模拟过程中,这些符号在整个模型中传播,然后进入生成的代码。若要将维度表示为符号,必须设置建模>模型设置>诊断>先进的参数>允许符号维度规范.有关符号维度的更多信息,请参见允许符号维度规范

先决条件

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

探索模型

1.打开模型。

open_system ([matlabroot' / / simul金宝appink_variants /主/例子slexVariantParametersCC”])

该模型包含具有指定为的不同参数的块金宝app仿真软件。VariantVariable对象。对象定义在slexVariantParameterCCData.m文件。

  • 常数:常数常量块的参数为变参数。参数被指定为可变变量对象MAX_LIFT而且SLIDER_POS

  • 表数据而且断点集:表数据而且断点集n-D查找表块的每一个都是变量参数。参数被指定为可变变量对象T1Break1T1DataT2Break,T2Data

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

  • 在这个文件中,VCtrl金宝app仿真软件。VariantControl对象,该对象确定变量参数对象的活动值MAX_LIFTSLIDER_POST1Break1T1DataT2Break,T2Data.的价值VCtrl设置为1,激活时间为代码编译.在模拟过程中,条件VCtrl = = 1计算结果为真正的.所关联的所有值VCtrl = = 1变得活跃,与价值观相关联VCtrl = = 2变得不活跃。当您从这个模型生成代码时,所有的活动值和非活动值都包含在预处理器条件中#如果而且# elif

  • 变量参数对象MAX_LIFT而且SLIDER_POS具有默认存储类的标量数值汽车.类的值在生成代码时常数参数内联为宏。变量参数对象T1Break1T1DataT2Break,T2Data金宝app仿真软件。参数类型,存储类指定为ExportedGlobal.在生成代码时,这些值在生成的代码中以可调变量的符号名表示。

  • 变量参数对象T1Break1而且T1Data拥有不同维度的价值。在生成代码时,这些参数的维度以符号表示。

设置可变参数的主动选择

1.在“Simul金宝appink®”工具条上,单击运行.在模拟中,VCtrl = = 1计算结果为真正的.所关联的所有值VCtrl = = 1赋值给相应的变量对象,然后赋值给使用这些对象的变量参数。例如,当VCtrl = = 1计算结果为真正的的值。MAX_LIFT设置为10.随着常数参数。Constant1Block被设置为MAX_LIFT的值常数参数也设置为10

2.要更改活动值,请更改的值VCtrl2,然后再次模拟模型。

VCtrl。Value = 2;

在模拟过程中,与VCtrl = = 2赋值给变量对象,然后使用这些对象将这些值赋值给变量参数。

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

要为具有不同维度值的变量参数生成代码,请使用Embedded Coder。

在您从模型生成代码之前,请确保您在当前文件夹中拥有写权限。中生成代码应用程序模型工具条的图库,单击嵌入式编码器.在C代码选项卡上,单击构建.有关更多信息,请参见使用嵌入式编码器生成代码(嵌入式编码)

检查生成代码中的内联和可调参数

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

2.选择slexVariantParametersCC_types.h文件来自生成的代码报表的窗格。这个文件定义了变量控制变量的值VCtrl作为1.变量控制变量决定变量参数的有效值。

定义VCtrl 1 #endif

3.选择slexVariantParametersCC_private.h文件。此文件包括宏(#定义)对应于所有具有默认存储类的变量参数的值汽车.变量参数的活动值MAX_LIFT而且SLIDER_POS都包含在C预处理器条件语句(#如果)rtCP_Constant_MAX_LIFT而且rtCP_Constant1_SLIDER_POS

#if VCtrl == 1 || VCtrl == 2 /*变量:MAX_LIFT *引用:'/Constant' */ #if VCtrl == 1 #define rtCP_Constant_MAX_LIFT (10.0) #elif VCtrl == 2 #define rtCP_Constant_MAX_LIFT (20.0) #endif #endif
#if VCtrl == 1 || VCtrl == 2 /*变量:SLIDER_POS *引用:'<根>/Constant1' */ #if VCtrl == 1 #定义rtCP_Constant1_SLIDER_POS (0.0) #elif VCtrl == 2 #定义rtCP_Constant1_SLIDER_POS (0.5) #endif #endif

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

/*导出全局参数#if VCtrl == 1 || VCtrl == 2 extern real_T T1Break[T1Break_dim0];/*变量:T1Break *引用对象:'<根>/1D Lookup' */ #endif . / / #
#if VCtrl == 1 || VCtrl == 2 extern real_T T1Data[T1Data_dim0];/*变量:T1Data *引用对象:'<根>/1D Lookup' */ #endif . T1Data
#if VCtrl == 1 || VCtrl == 2 extern real_T T2Break[3];/*变量:T2Break *引用对象:'<根>/2D查找' */ #endif . txt
#if VCtrl == 1 || VCtrl == 2 extern real_T T2Data[9];/*变量:T2Data *引用对象:'<根>/2D查找' */ #endif . / #

5.选择slexVariantParametersCC.c文件。所有可变参数的值都包含在C预处理器条件语句中#如果而且# elif.在编译此代码时,Simulink将计算预处理器条件,并仅金宝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 *引用对象:'<根>/1D Lookup' */
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 *引用对象:'<根>/1D Lookup' */
real_T T2Break[3] = {-10.0, 0.0, 10.0};/*变量:T2Break *引用对象:'<根>/2D Lookup' */
real_T T2Data [9] = {4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0};/*变量:T2Data *引用对象:'<根>/2D Lookup' */
#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 *引用对象:'<根>/1D Lookup' */
real_T T1Data[T1Data_dim0] = {-0.99999999587769273, - 0.99999999969540041, -0.99999977492967584, - 0.999999833694394469, - 0.99998971165079559, - 0.9999990920426259511, -0.9640275800758169, - 0.999915475365576485, 0.0, 0.76159415595576485, 0.9640275800758169, 0.99505475365576485, 0.99929299733046, 0.99929299733046, 0.999999877120426259511, 0.9999877669, 0.99999836969540084, 0.9999999999999695400441, 0.9999999999587769273};/*变量:T1Data *引用对象:'<根>/1D Lookup' */
real_T T2Break[3] = {-20.0, 0.0, 20.0};/*变量:T2Break *引用对象:'<根>/2D Lookup' */
real_T T2Data [9] = {8.0, 32.0, 20.0, 10.0, 38.0, 36.0, 12.0, 40.0, 46.0};/*变量:T2Data *引用对象:'<根>/2D Lookup' */
# endif

在这个文件中,对每个变量的step函数的调用都是有条件编译的。在阶跃函数中,使用变量参数的宏和符号名来形成方程。

/*模型阶跃函数*/
void slexVariantParameters_step(void) {slexVariantParametersCC_Y。Out1 = look2_binlx(rtCP_Constant_MAX_LIFT, look1_binlx(rtCP_Constant1_SLIDER_POS, T1Break, T1Data, T1Data_dim0 - 1U), T2Break, T2Break, T2Data, slexVariantParametersCC_ConstP。uDLookup_maxIndex, 3U) * -2.0 + 2.0 * slexVariantParametersCC_U.In1;}

检查生成代码中的维度符号

选择slexVariantParametersCC.c文件来自生成的代码报表的窗格。在此文件中,尺寸变量参数T1Break而且T1Data用符号表示T1Break_dim0而且T1Data_dim0和包含在C预处理器条件语句中#如果而且# elif.在编译此代码时,Simulink计算预处理器条件并仅为变金宝app量参数的活动值保留代码。的值VCtrl作为1,条件VCtrl == 1计算结果为真正的中所包含的值V == 1在代码编译期间变为活动状态。然后可以为指定不同的值VCtrl的任何其他活动值重新编译相同的代码T1Break而且T1Data

另请参阅