Когда вы задаете условия варианта в моделях, содержащих блоки Variant Subsystem, Simulink® распространяет эти условия, чтобы определить, какие компоненты модели активны во время симуляции. Условие варианта может быть выражением условия или объектом варианта.
Аннотации исполнительных условий помогают вам визуализировать распространенные условия. Чтобы просмотреть аннотации условий исполнения, на вкладке Debug выберите Information Overlays > Variant Legend.
Примечание
Если Variant Legend недоступен, на вкладке Debug выберите Information Overlays > Variant Conditions.
В легенде (default)
ключевое слово отображается как отрицательное условие.
Рассмотрим эту модель, содержащую блок Variant Subsystem с вариантами выбора. Конкретное условие варианта активирует каждый блок.
В Подсистеме Вариантов (Controller
), sensor1
и sensor3
используются как в линейном контроллере, так и в нелинейных контроллерах, но sensor2
используется только в линейном контроллере. Следовательно, sensor2
блок выполняется только при активном выборе линейного контроллера и не выполняется при любом другом выборе. Чтобы убедиться, что компоненты за пределами Подсистемы вариантов (Controller
) осведомлены об активном или неактивном состоянии блоков с Variant Subsystem блоком, условие блока должно распространяться вне Variant Subsystem блока.
Чтобы распространить условия вне Variant Subsystems без создания предварительных условий, установите флажок Propagate conditions outside of variant subsystem в диалоговом окне Block Parameter блока Variant Subsystem. По умолчанию Propagate conditions outside of variant subsystem не выбран.
Когда вы моделируете модель с активным выбором в качестве Нелинейного Контроллера и выбранным Propagate condition outside of variant subsystem, анализируется только активный выбор. Заметьте, что для Variant activation time задано значение update diagram
.
В Variant Condition Legend неактивные условия отображаются следующим false
. Здесь, sensor2
неактивен с выбором варианта в качестве нелинейного контроллера и отмечен как false
. Аннотации отображаются на sensor2
порт и неактивный блок, который соединяется с sensor2
.
Когда вы генерируете код для распространения условия без генерирования предварительных условий, неактивные блоки игнорируются. В этом примере порт входа In2
не показан в сгенерированном коде.
Чтобы распространить условия за пределы Variant Subsystem с сгенерированием условий препроцессора, установите флажок Propagate conditions outside of variant subsystem и установите Variant activation time равным code compile
в Block Parameters окне Подсистемы вариантов.
Примечание
Variant activation time доступна только, когда вы задаете Variant control mode как Expression
.
Когда вы симулируете модель с активным выбором как Нелинейный Контроллер и Propagate conditions outside of variant subsystem флажок и Variant activation time установлено на code compile
, все варианты выбора анализируются. В Variant Condition Legend отображаются условия варианта, связанные с моделью.
Когда вы генерируете код для распространения условия с генерацией предварительных условий процессора, модель анализируется для всех вариантов. В этом примере порт входа In2
охраняется необходимыми условиями.
Примечание
Чтобы распространить условия варианта вне блока Variant Subsystem для заданного нуля или одного активного варианта управления, выберите Allow zero active variant controls.
Когда в диалоговом окне Параметров блоков установлен флажок Распространять условия вне подсистемы вариантов, Подсистема вариантов адаптирует свой интерфейс к связанным блокам. Рассмотрим эту модель.
Блок Controller является Подсистемой Вариантов, которая обеспечивает Linear
и a Nonlinear
выбор. The Linear
выбор активен, когда V = 1
, и Nonlinear
выбор активен, когда V = 2
. Здесь, V
является переменной управления вариантом Simulink.Parameter
тип. Выберите блок Controller и, в Simulink нажмите Diagna > Параметры Блоков (Subsystem). Убедитесь, что установлен флажок Условие распространения вне подсистемы вариантов.
Чтобы изменить значение переменной управления вариантом, в командном окне MATLAB введите V.Value = 1
или V.Value = 2
.
Дважды кликните блок Controller, чтобы просмотреть его содержимое. The Linear
выбор использует sensor1
и sensor3
входы контроллера (Variant Блока Subsystem). Он не использует sensor2
и, следовательно, не производит saturate
выход.
Когда вы моделируете эту модель, блок Variant Subsystem адаптирует свой интерфейс так, чтобы условие V = 2
(v:1 V=2
) распространяет In2
, а filter
, и saturation logger
блоки.
Когда вы распространяете условие в условную систему, то одно и то же условие устанавливается на все порты. Для получения дополнительной информации см. раздел «Распространение условий исполнения на условную подсистему».
Рассмотрим эту модель. Здесь, когда условие распространяется на Inport блок (fcn
), то же условие распространяется на все блоки Inport и Outport (как показано в Variant Legend) и делает Variant Subsystem блок условным.
Распространенные условия варианта из подсистем вариантов не могут быть установлены на Simscape™ или Stateflow® блоки.
Генерация кода С++ не поддерживается для моделей, которые содержат распространенные условия вне блока Variant Subsystem.
Распространение условий варианта не поддерживается в моделях с портами корневого элемента шины.
Примечание
Все элементы массива сигнала Mux, Demux или Vector Concatenate блока должны иметь одно и то же условие варианта.
Чтобы распространить условия вне блока Variant Subsystem программно, используйте один из следующих синтаксисов:
Распространите условия без создания предварительных условий процессора:
set_param(VariantSubsystemName, 'PropagateVariantConditions','on')
Для примера,
set_param('sldemo_variant_subsystems/Controller','PropagateVariantConditions','on')
Распространите условия с созданием предварительных условий процессора:
set_param(VariantSubsystemName,'PropagateVariantConditions',... 'on','GeneratePreprocessorConditionals','on')
Для примера,
set_param('sldemo_variant_subsystems/Controller','PropagateVariantConditions','on',... 'GeneratePreprocessorConditionals','on')
Можно сгенерировать код для модели. Для этого на вкладке Apps щелкните Embedded Coder, затем на вкладке C Code нажмите Build. Для получения дополнительной информации о конфигурировании модели для генерации кода смотрите Подготовку Содержащей Варианты Модели для Генерации Кода.
Рассмотрим модель варианта, содержащую блок Variant Subsystem для генерации кода.
В сгенерированном коде код внутри fcn
определение охраняется условиями препроцессора C #if
и #endif
.
void fcn(void) { /* RootInportFunctionCallGenerator: '<Root>/RootFcnCall_InsertedFor_fcn_at_outport_1' */ #if VSSMODE == 0 rtDWork.Linear.DiscreteFilter = rtU.In1 - 0.5 * rtDWork.Linear.DiscreteFilter_states; rtDWork.Linear.DiscreteFilter_states = rtDWork.Linear.DiscreteFilter; #endif /* VSSMODE == 0 */ #if VSSMODE == 1 rtDWork.Nonlinear.DiscreteFilter = look1_binlxpw(rtU.In1, rtCP_LookupTable_bp01Data, rtCP_LookupTable_tableData, 4U) - 0.5 * rtDWork.Nonlinear.DiscreteFilter_states; rtDWork.Nonlinear.DiscreteFilter_states = rtDWork.Nonlinear.DiscreteFilter; #endif /* VSSMODE == 1 */ #if VSSMODE == 0 rtY.Out1 = rtDWork.Linear.DiscreteFilter; #endif /* VSSMODE == 0 */ #if VSSMODE == 1 rtY.Out1 = rtDWork.Nonlinear.DiscreteFilter; #endif /* VSSMODE == 1 */ }
Примечание
Конфигурирование модели как компонента AUTOSAR с возможностью выполнения в качестве вариантов подсистемы не поддерживается.
Для защиты всего определения Function-Call (fcn
), используйте источник варианта, как показано ниже.
В сгенерированном коде fcn()
определение охраняется A = = 1.
#if A == 1 void fcn(void) { ….. } #endif
Эта функция может быть упомянута с помощью фрагмента кода, аналогичного показанному ниже.
…..
#if A==1
fcn()
#endif
……