在生成的代码中表示变量源和接收器块
你可以用变异来源而且变体水槽块在一个统一的框图中感知模型的多个实现。每个实现都取决于您设置的条件变异来源而且变体水槽块。金宝app动态仿真模块®将这些条件传播到上游和下游块,包括根输入和根输出端口。
你可以生成:
来自Simulink模型金宝app的代码包含变体水槽而且变异来源块。
包含控制每个变量选择的激活的预处理器条件的代码。
不允许主动变量选择的预处理器条件。
在Simulink中表示变源和变汇聚块金宝app
这个例子展示了Variant Source块如何使模型元素具有条件。
从Simulink金宝app块库中添加1正弦波函数块,两个添加三块,获得块,两个外港,和两个变异来源块到一个新模型中。
打开正弦波函数块。为正弦类型参数,选择
基于样本
.为时间(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
作为金宝app仿真软件。参数
对象。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”
在本例中,变量控制变量为
金宝app仿真软件。参数
对象。用于代码生成,如果您使用金宝app仿真软件。变体
对象来指定变量控件,使用金宝app仿真软件。参数
对象或MATLAB变量来指定它们的条件。变量控制变量定义为
金宝app仿真软件。参数
对象可以有以下存储类之一:定义
指定头文件ImportedDefine
指定头文件CompilerFlag
SystemConstant (AUTOSAR)
用户定义的自定义存储类,将数据定义为指定头文件中的宏
如果使用标量变量控制变量来模拟模型,则可以将这些变量转换为
金宝app仿真软件。参数
对象。看到转换变量控制变量到Simulink。金宝app参数对象.模拟模型。
输入端口1是主动选择
变异来源
因为变量的值控制变量V
是1
.输入端口2是主动选择变体Source1
因为变量的值控制变量W
是2。不活动的选择从执行中删除,它们的路径在图中是灰色的。
指定控制变量选择的条件
您可以生成代码,其中每个变量选择都包含在C预处理器条件中#如果
而且# endif
.编译器在编译时选择活动的变体,预处理器条件确定要执行代码的哪一部分。
在建模页签,单击金宝app模型设置.
在代码生成窗格,并设置系统目标文件来
ert.tlc
.在解算器窗格中,设置类型参数
固定步
.在模型中,打开的块参数对话框
变异来源
.设置变异激活时间参数
代码编译
.在更新图表或模拟过程中,当您设置此参数值时,Simulink将分析所有的变量选择。金宝app该分析提供了对变量选择的代码生成准备的早期验证。在代码生成过程中,当您设置此参数值时,代码生成器将生成控制每个变量选择的激活的预处理器条件。清除允许零活动变量控件参数。
的“块参数”对话框
变体源1
.重复步骤5到步骤7。构建模型。当代码生成完成时,生成的代码将显示在code视图中。
检查生成的代码
在Code视图中,选择
inline_variants_example.c
文件。在
inline_variants_example.c
文件,调用inline_variants_example_step
函数被有条件编译如下所示:/*模型步长函数*/ void inline_variants_example_step(void) {real_T rtb_VariantMerge_For_Variant_So;real_T rtb_VariantMerge_For_Variant__e;/* Sin: '
/Sine2'合并:* Sin: ' /Sine3' * Sum: ' /Add' */ #if V == 2 rtb_VariantMerge_For_Variant_So = Sin ((real_T) inline_variants_example_DW。counter * 2.0 * 3.1415926535897931 / 10.0) + sin ((real_T)inline_variants_example_DW。Counter_g * 2.0 * 3.1415926535897931 / 10.0);#endif /* End of Sin: ' /Sine2' */ /* Sin: ' /Sine4'合并:* Sin: ' /Sine5' * Sum: ' /Add1' */ #if W == 2 rtb_VariantMerge_For_Variant__e = Sin ((real_T) inline_variants_example_DW。counter_c * 2.0 * 3.1415926535897931 / 10.0) + sin((real_T)inline_variants_example_DW。Counter_i * 2.0 * 3.1415926535897931 / 10.0);#endif /* End of Sin: ' /Sine4' */ /* Sin: ' /Sine1' */ #if V == 1 rtb_VariantMerge_For_Variant_So = Sin ((real_T) inline_variants_example_DW。Counter_m * 2.0 * 3.1415926535897931 / 10.0);#endif /* End of Sin: '<根>/Sine1' */ /* Outport: '<根>/Outport'合并:* Gain: '<根>/Gain1' */ inline_variants_example_Y。输出端口= 3.0 * rtb_VariantMerge_For_Variant_So;/*增益:'<根>/增益' */ #if W == 1 rtb_VariantMerge_For_Variant__e = 2.0 * rtb_VariantMerge_For_Variant_So;#endif /* End of Gain: ' /Gain' */ /* Outport: ' /Outport1'合并:* Gain: ' /Gain2' */ inline_variants_example_Y。Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e;/*更新Sin: ' / sin2 '合并:* Sin: ' / sin3 ' */ #if V == 2 inline_variants_example_dc .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。外港
而且inline_variants_example_Y。Outport1
控件的输出值变异来源块。注意,这些变量的代码不是有条件的。
生成零主动变量控件的代码
您可以生成代码,其中连接到Variant Source块的输入和输出的块是有条件的。
为
变异来源
,打开“块参数”对话框。选择参数允许零活动变量控件.为
变体源1
,打开“块参数”对话框。选择参数允许零活动变量控件.
当您选择允许零活动变量控件参数,您可以为包含变异来源而且变体水槽即使在为不允许活动变量的变量控制变量指定值时,也会阻塞。为变量控制变量选择不允许活动变量的值,并且不选择允许零活动变量控件参数会产生错误。
生成以下代码inline_variants_example
.在inline_variants_example.c
文件,那是变量的代码inline_variants_example_Y。Outport1
而且inline_variants_example_Y。Outport2
是有条件的。
/*建模步长函数*/ void inline_variants_example_step(void){…if V == 1 || V == 2 inline_variants_example_Y。外港= 3.0 * rtb_VariantMerge_For_Variant_So; #endif ... #if (V == 1 && W == 1) || (V == 2 && W == 1) || W == 2 inline_variants_example_Y.Outport1 = 4.0 * rtb_VariantMerge_For_Variant__e; #endif ...
相关的话题
- 定义和配置不同的源和汇
- 用不同的源和汇传播不同的条件
- 变量控制介绍
- 创建自定义检查以评估来自模型的活动和非活动变量路径(金宝app仿真软件检查)