Распространение условий с вариантной подсистемой

Когда вы задаете условия варианта в моделях, содержащих блоки 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
……

Похожие темы