当您在包含不同的子系统块,仿真软件金宝app®传播这些条件,以确定在模拟期间模型的哪些组件是活动的。可变条件可以是条件表达式或可变对象。
变量条件注释帮助您可视化传播的条件。上的变量条件注释调试选项卡上,选择信息覆盖>变体的传说.
请注意
如果变体的传说是不可用的,对吗调试选项卡上,选择信息覆盖>变异的条件.
在传说中,(默认)
关键字显示为否定条件。
考虑这个模型包含不同的子系统用不同的选择块。一个特定的可变条件激活每个块。
在变型子系统(控制器
),sensor1
而且sensor3
在线性控制器和非线性控制器中都使用,但是sensor2
仅在线性控制器中使用。因此,sensor2
block只在线性控制器选择激活时执行,而不执行任何其他选择。确保变体子系统(控制器
的块的激活或非激活状态不同的子系统块时,块条件必须传播到不同的子系统块。
要在变体子系统外部传播条件而不生成预处理器条件,请选择在变量子系统之外传播条件中的复选框。块参数对话框不同的子系统块。默认情况下,在变量子系统之外传播条件未选中。
当你用主动选择的非线性控制器来模拟模型时将条件传播到变异子系统之外选中后,只分析主动选择。注意变体激活时间设置为更新图
.
的变型条件图例将非活动条件显示为假
.在这里,sensor2
是不活跃的变量选择作为非线性控制器,并标记为假
.注释显示在sensor2
端口和所连接的非活动块sensor2
.
当生成用于条件传播的代码而不生成预处理器条件时,不活跃的块将被忽略。本例中为输入端口In2
未显示在生成的代码中。
要使用生成预处理器条件在变体子系统外部传播条件,请选择在变量子系统之外传播条件复选框,并设置变体激活时间来代码编译
在块的参数对话框。
请注意
变体激活时间仅当您指定变型控制方式作为表达式
.
当你用主动选择作为非线性控制器来模拟模型时在变量子系统之外传播条件复选框和变体激活时间设置为代码编译
,分析了所有的变体选择。的变型条件图例显示与模型关联的不同条件。
当您使用生成预处理器条件生成用于条件传播的代码时,将分析所有选择的模型。本例中为输入端口In2
在必要的条件下进行保护。
请注意
在a外部传播不同的条件不同的子系统块指定的零或一个活动变量控件,请选择允许零主动变量控制.
当你选择在变量子系统之外传播条件中的复选框。块的参数对话框中,变体子系统根据连接的块调整其接口。考虑这个模型。
控制器块是一个变体子系统,它提供线性
和一个非线性
选择。的线性
选择是活跃的V = 1
,以及非线性
选择是活跃的V = 2
.在这里,V
变量是控制变量的吗金宝app仿真软件。参数
类型。选择Controller块,在Simulink中单击金宝app图>块的参数(子系统)。验证将条件传播到变异子系统之外选中复选框。
要更改变量控制变量的值,请在MATLAB命令窗口中键入V.Value = 1
或V.Value = 2
.
双击Controller块查看其内容。的线性
选择就是使用sensor1
而且sensor3
控制器的输入(变体子系统块)。它没有使用sensor2
因此,不会产生a饱和
输出。
当您模拟这个模型时,Variant子系统块调整它的接口,使条件V = 2
(v: 1 v = 2
)传播In2
,过滤器
,以及饱和记录器
块。
当您将一个条件传播到一个条件系统时,相同的条件将被设置到所有端口。有关更多信息,请参见将变量条件传播到条件子系统.
考虑这个模型。在这里,当条件传播到轮廓尺寸块(fcn
),相同的条件将传播到所有轮廓尺寸而且外港块(如变体图例所示),并使不同的子系统块条件。
不能在Simscape™或statflow上设置来自不同子系统的传播的不同条件®块。
的外部包含传播条件的模型不支持c++代码生成金宝app不同的子系统块。
在具有根总线元素端口的模型中不支持可变条件传播。金宝app
请注意
所有的元素Mux,多路分配器,或向量连接闭塞信号必须具有相同的变异条件。
的外部传播条件不同的子系统以编程方式进行Block,使用以下语法之一:
传播条件而不生成预处理器条件:
set_param (VariantSubsystemName“PropagateVariantConditions”,“上”)
例如,
set_param(“sldemo_variant_subsystems /控制器”、“PropagateVariantConditions”,“上”)
使用生成预处理器条件传播条件:
set_param (VariantSubsystemName PropagateVariantConditions,…“上”、“GeneratePreprocessorConditionals”,“上”)
例如,
set_param (sldemo_variant_subsystems /控制器,‘PropagateVariantConditions’,‘上’,……“GeneratePreprocessorConditionals”,“上”)
您可以为模型生成代码。要做到这一点,就应用程序选项卡上,单击嵌入式编码器,然后在C代码选项卡上,单击构建.有关配置模型以生成代码的更多信息,请参见为代码生成准备包含变量的模型.
考虑一个包含不同的子系统块,用于生成代码。
在生成的代码中,其中的代码fcn
定义由C预处理器条件保护#如果
而且# endif
.
无效fcn(空白){/* RootInportFunctionCallGenerator:“< Root > / RootFcnCall_InsertedFor_fcn_at_outport_1”* / #如果VSSMODE == 0 rtDWork.Linear.DiscreteFilter = rtU。In1 - 0.5 * rtDWork.Linear.DiscreteFilter_states;rtDWork.Linear。DiscreteFilter_states = rtDWork.Linear.DiscreteFilter;#endif /* VSSMODE == 0 */ #如果VSSMODE == 1 rtdwork .非线性.离散过滤器= look1_binlxpw(rtU。In1, rtCP_LookupTable_bp01Data, rtCP_LookupTable_tableData, 4U) - 0.5 * rtdwork .非线性. discretefilter_states;rtDWork.Nonlinear。离散过滤器= rtdwork .非线性.离散过滤器;#endif /* VSSMODE == 1 */ #如果VSSMODE == 0 rtY。Out1 = rtDWork.Linear.DiscreteFilter;#endif /* VSSMODE == 0 */ #如果VSSMODE == 1 rtY。Out1 = rtdwork .非线性.离散滤波器;#endif /* VSSMODE == 1 */}
请注意
不支持将模型配置为AUTOSAR组件,并选择可运行为变体子系统。金宝app
保护Function-Call的整个定义(fcn
),使用如下所示的变体源。
在生成的代码中fcn ()
定义用A==1进行保护。
#如果A == 1空fcn(空白){…} # endif
可以使用类似于下面所示的代码片段引用此函数。
…#如果A==1 fcn() #endif ......