您可以使用变异来源和变体水槽块感知多个实现的模型在一个单一的、统一的框图。每个实现取决于您所设置的条件变异来源和变体水槽块。金宝app动态仿真模块®传播这些条件包括上游和下游块根输入和输出端口。
您可以生成:
从仿真软件模型包含的代码金宝app变体水槽和变异来源块。
代码包含预处理控制每个变体的活化条件的选择。
预处理条件,允许没有活跃的变体的选择。
这个例子展示了如何变异源块模型元素的条件。
从模型块库,加1金宝app正弦波函数块,两个添加三块,获得块,两个外港,两个变异来源块到一个新的模型。
打开正弦波函数块。为正弦类型参数,选择基于样本
。为时间(t)参数,选择利用仿真时间
。为样品时间参数,插入的值0.2
。
四份正弦波函数块。
连接和名称块如图所示。
插入的值2
,3
,4
在Gain2
,Gain3
,Gain4
块,分别。
为模型的名称inline_variants_example
。
打开参数对话框变异来源
。
在版本控制端口1列,替换Choice_1
与V = = 1
。端口2,取代Choice_2
与V = = 2
。
打开参数对话框变体Source1
。
在版本控制列,取代Choice_1
与W = = 1
。端口2,取代Choice_2
与W = = 2
。
在MATLAB命令窗口,使用这些命令来定义V
和W
作为金宝appSimulink.Parameter
对象。
V = 金宝appSimulink.Parameter;V。Value = 1; V.DataType=“int32”;V.CoderInfo。StorageClass =“自定义”;V.CoderInfo。CustomStorageClass =“定义”;V.CoderInfo.CustomAttributes.HeaderFile =“inline_importedmacro.h”W = 金宝appSimulink.Parameter;W。Value = 2; W.DataType=“int32”;W.CoderInfo。StorageClass =“自定义”;W.CoderInfo。CustomStorageClass =“定义”;W.CoderInfo.CustomAttributes.HeaderFile =“inline_importedmacro.h”
在这个示例中,变量控制变量金宝appSimulink.Parameter
对象。对于代码生成,如果你使用金宝appSimulink.Variant
对象指定变量控制,使用金宝appSimulink.Parameter
对象或MATLAB变量来指定他们的条件。。
变量定义为控制变量金宝appSimulink.Parameter
对象可以有一个这样的存储类:
定义
指定头文件
ImportedDefine
指定头文件
CompilerFlag
SystemConstant (AUTOSAR)
用户定义的自定义存储类,它定义了数据作为一个宏指定头文件
如果你使用标量变量控制变量来模拟模型,您可以将这些变量转换成金宝appSimulink.Parameter
对象。看到不同控制变量转换成仿真软件。金宝app参数对象。
模拟模型。
输入端口1的主动选择变异来源
因为不同控制变量的值V
是1
。输入端口2的积极选择变体Source1
因为不同控制变量的值W
是2。不活跃的选择从执行,和他们的路径是灰色显示的图。
您可以生成代码中每个变量的选择是C预处理器内封闭条件#如果
和# endif
。编译器在编译时选择积极的变异和预处理条件确定哪些部分代码的执行。
在建模仿真软件将来发布的选项金宝app卡,单击模型设置。
在代码生成面板,设置系统目标文件来ert.tlc
。
在解算器窗格中,设置类型参数固定步
。
在你的模型中,打开参数对话框变异来源
。
设置变体激活时间参数代码编译
。在一个更新图或模拟,当你设置该参数值,仿真软件分析所有变体的选择。金宝app这种分析提供了代码生成的早期验证准备变体的选择。在代码生成,当你设置该参数值,代码生成器生成预处理器控制每个变体的活化条件的选择。
清除允许控制零活跃的变体参数。
打开参数对话框变异来源1
。重复步骤5 - 7所示。
构建的模型。当完成代码生成,生成的代码显示在代码视图。
在代码视图中,选择inline_variants_example.c
文件。
在inline_variants_example.c
文件,调用inline_variants_example_step
函数是有条件地编译如图所示:
/ *模型阶跃函数* /空白inline_variants_example_step (void) {real_T rtb_VariantMerge_For_Variant_So;real_T rtb_VariantMerge_For_Variant__e;/ *罪:“< Root > / Sine2”包含:*罪:“< Root > / Sine3”*金额:< Root > /添加的* / #如果V = = 2 rtb_VariantMerge_For_Variant_So =罪(inline_variants_example_DW (real_T)。反* 2.0 * 3.1415926535897931/10.0)+罪(inline_variants_example_DW (real_T)。counter_g * 2.0 * 3.1415926535897931/10.0);# endif / *罪结束:“< Root > / Sine2”* / / *罪:“< Root > / Sine4”包含:*罪:“< Root > / Sine5”*总和:“< Root > / Add1”* / #如果W = = 2 rtb_VariantMerge_For_Variant__e =罪(inline_variants_example_DW (real_T)。counter_c * 2.0 * 3.1415926535897931/10.0) +罪(inline_variants_example_DW (real_T)。counter_i * 2.0 * 3.1415926535897931/10.0);# endif / *罪结束:“< Root > / Sine4”* / / *罪:“< Root > / Sine1”* / #如果V = = 1 rtb_VariantMerge_For_Variant_So =罪(inline_variants_example_DW (real_T)。counter_m * 2.0 * 3.1415926535897931/10.0);# endif / *罪结束:“< Root > / Sine1”* / / *外港:“< Root > /外港”包含:*获得:“< Root > / Gain1”* / inline_variants_example_Y。外港= 3.0 * rtb_VariantMerge_For_Variant_So;/ *获取:“< Root > /增益”* / #如果W = = 1 rtb_VariantMerge_For_Variant__e = 2.0 * rtb_VariantMerge_For_Variant_So;# endif / *获得结束:“< Root > /增益”* / / *外港:“< Root > / Outport1”包含:*获得:“< Root > / Gain2”* / inline_variants_example_Y。Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e;/ *更新为罪:“< Root > / Sine2”包含:*罪:“< Root > / Sine3”* / #如果V = = 2 inline_variants_example_DW.counter + +;如果(inline_variants_example_DW。counter == 10) { inline_variants_example_DW.counter = 0; } inline_variants_example_DW.counter_g++; if (inline_variants_example_DW.counter_g == 10) { inline_variants_example_DW.counter_g = 0; } #endif /* End of Update for Sin: '/Sine2' */ /* Update for Sin: ' /Sine4' incorporates: * Sin: ' /Sine5' */ #if W == 2 inline_variants_example_DW.counter_c++; if (inline_variants_example_DW.counter_c == 10) { inline_variants_example_DW.counter_c = 0; } inline_variants_example_DW.counter_i++; if (inline_variants_example_DW.counter_i == 10) { inline_variants_example_DW.counter_i = 0; } #endif /* End of Update for Sin: ' /Sine4' */ /* Update for Sin: ' /Sine1' */ #if V == 1 inline_variants_example_DW.counter_m++; if (inline_variants_example_DW.counter_m == 10) { inline_variants_example_DW.counter_m = 0; } #endif /* End of Update for Sin: ' /Sine1' */ }
的变量rtb_VariantMerge_For_Variant_So
和rtb_VariantMerge_For_Variant_e
持有的输入值变异来源块。请注意,这些变量的代码是有条件的。的变量inline_variants_example_Y.Outport
和inline_variants_example_Y.Outport1
持有的输出值变异来源块。请注意,这些变量的代码不是条件。
您可以生成代码块连接到输入和输出块变异来源的条件。
为变异来源
,打开参数对话框。选择的参数允许控制零活跃的变体。
为变异来源1
,打开参数对话框。选择的参数允许控制零活跃的变体。
当您选择允许控制零活跃的变体参数,您可以为一个模型,其中包含生成代码变异来源和变体水槽块即使你指定一个值变异控制变量不允许一个活跃的变体。选择一个值变异控制变量不允许一个活跃的变种,而不是选择允许控制零活跃的变体参数,产生一个错误。
生成的代码inline_variants_example
。注意到的inline_variants_example.c
文件,变量的代码inline_variants_example_Y.Outport1
和inline_variants_example_Y.Outport2
是有条件的。
/ *模型阶跃函数* /空白inline_variants_example_step (void) {…#如果V = = 1 | | inline_variants_example_Y V = = 2。外港= 3.0 * rtb_VariantMerge_For_Variant_So;# endif……#如果(V = = 1 & & W = = 1) | | (V = = 2 & & W = = 1) | | inline_variants_example_Y W = = 2。Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e;# endif……