Когда вы задаете различные условия в моделях, содержащих Различные блоки Subsystem, Simulink® распространяет эти условия определить, какие компоненты модели активны во время симуляции. Различное условие может быть выражением условия или различным объектом.
Различные аннотации условия помогают вам визуализировать распространенные условия. Чтобы просмотреть различные аннотации условия, нажмите Display> Blocks> Variant Condition Legend.
Опция Variant Condition Legend доступна только, когда Display> Blocks> Variant Condition активен.
В легенде ключевое слово (default)
отображено как отрицаемое условие.
Рассмотрите эту модель, содержащую Различный блок Subsystem с вариантами. Определенное различное условие активирует каждый блок.
В Различной Подсистеме (Controller
) sensor1
и sensor3
используются и в Линейном Контроллере и в Нелинейных Контроллерах, но sensor2
используется только в Линейном Контроллере. Следовательно, блок sensor2
выполняется только, когда Линейный выбор Контроллера активен и не выполняется ни для какого другого выбора. Чтобы гарантировать, что компоненты за пределами Различной Подсистемы (Controller
) знают об активном или неактивном состоянии блоков с Различной Подсистемой, условие блока должно распространить за пределами Различной Подсистемы.
Чтобы распространить условия за пределами Различных Подсистем без генерируют условные выражения препроцессора, устанавливают флажок Propagate conditions outside of variant subsystem в диалоговом окне Block Parameter Различного блока Subsystem. По умолчанию Propagate conditions outside of variant subsystem не выбран.
Когда вы моделируете модель с активным выбором как Нелинейный Контроллер и выбранный Propagate condition outside of variant subsystem, только активный выбор анализируется. Заметьте, что флажок Analyze all choices during update diagram and generate preprocessor conditional не устанавливается.
Variant Condition Legend отображает неактивные условия как false
. Здесь, sensor2
неактивен вариантом как Нелинейный Контроллер и отмечен как false
. Аннотации отображены на порте sensor2
и неактивном блоке, который соединяется с sensor2
.
Когда вы генерируете код для распространения условия без, генерируют условные выражения препроцессора, неактивные блоки проигнорированы. В этом примере входной порт In2
не показывают в сгенерированном коде.
Чтобы распространить условия за пределами Различной Подсистемы с генерируют условные выражения препроцессора, устанавливают флажок Propagate conditions outside of variant subsystem и флажок Analyze all choices during update diagram and generate preprocessor conditionals в диалоговом окне Block Parameters Различной Подсистемы.
Analyze all choices during update diagram and generate preprocessor conditionals доступен только, когда вы задаете Variant control mode как Expression
.
Когда вы моделируете модель с активным выбором как флажок Nonlinear Controller и Propagate conditions outside of variant subsystem и установленный флажок Analyze all choices during update diagram and generate preprocessor conditionals, все варианты анализируются. Variant Condition Legend отображает различные условия, сопоставленные с моделью.
Когда вы генерируете код для распространения условия с, генерируют условные выражения препроцессора, модель анализируется для всего выбора. В этом примере входной порт In2
охраняют с необходимыми условиями.
Чтобы распространить различные условия вне Различного блока Subsystem для нуля или одного активного различного заданного управления, выберите Allow zero active variant controls.
Когда вы выбираете условия Propagate за пределами различного флажка подсистемы в диалоговом окне Block Parameters, Различная Подсистема адаптирует свой интерфейс к связанным блокам. Рассмотрите эту модель.
Блок Controller является Различной Подсистемой, которая обеспечивает Linear
и выбор Nonlinear
. Выбор Linear
активен, когда V = 1
и выбор Nonlinear
активны когда V = 2
. Здесь, V
является различной контрольной переменной типа Simulink.Parameter
. Выбор блок Controller и, в Simulink нажимают Diagram> Block Parameters (Subsystem). Проверьте, что Распространить условие за пределами различного флажка подсистемы выбрано.
Изменить значение различной контрольной переменной, в окне команды MATLAB, V.Value = 1
типа или V.Value = 2
.
Дважды кликните блок Controller, чтобы просмотреть его содержимое. Выбор Linear
использует sensor1
и входные параметры sensor3
Контроллера (Различный блок Subsystem). Это не использует sensor2
и, поэтому, не производит saturate
вывод.
Когда вы моделируете эту модель, Различный блок Subsystem адаптирует свой интерфейс, таким образом, что условие V = 2
(v:1 V=2
) распространяет In2
, filter
и блоки saturation logger
.
Когда вы распространяете условие к условной системе, то же условие установлено ко всем портам. Для получения дополнительной информации смотрите, Распространяют Различное Условие к Условной Подсистеме.
Рассмотрите эту модель. Здесь, когда условие распространено к блоку Inport (fcn
), то же условие распространяет ко всему импорту и выходным портам (как показано в Различной Легенде) и делает Различное условное выражение блока Subsystem.
Распространенные различные условия от различных подсистем не могут быть установлены на блоках в области Simscape™ или основанных на Stateflow блоках.
Генерация кода С++ не поддержана для моделей, которые содержат распространенные условия за пределами Различной Подсистемы.
Различное распространение условия не поддержано в моделях с корневыми портами элемента шины.
Все элементы Мультиплексора, Демультиплексора или Векторной конкатенации блока-сигнала должны иметь то же различное условие.
Чтобы распространить условия за пределами Различной Подсистемы программно, используйте один из этих синтаксисов:
Распространите условия без, генерируют условные выражения препроцессора:
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')
Можно сгенерировать код для модели путем выбора Code> C/C++ Code> Build Model. Для получения дополнительной информации о конфигурировании модели, чтобы сгенерировать код, смотрите, Готовят Содержащую Вариант Модель к Генерации кода.
Рассмотрите различную модель, содержащую Различный блок 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 */ }
Модель Configuring как компонент AUTOSAR с выполнимым как Различный выбор Подсистемы не поддержана.
Чтобы охранять целое определение Вызова функции (fcn
), используйте различный источник как показано ниже.
В сгенерированном коде определение fcn()
охраняют с == 1.
#if A == 1 void fcn(void) { ….. } #endif
Эта функция может быть отнесена с помощью фрагмента кода, подобного как показано ниже.
…..
#if A==1
fcn()
#endif
……