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

Когда вы задаете различные условия в моделях, содержащих Различные блоки Подсистемы, Simulink® распространяет эти условия определить, какие компоненты модели активны во время моделирования. Различное условие может быть выражением условия или различным объектом.

Различные аннотации условия помогают вам визуализировать распространенные условия. Чтобы просмотреть различные аннотации условия, нажмите Display> Blocks> Variant Condition Legend.

Примечание

Различная опция Легенды Условия доступна только, когда Отображение> Блоки> Различное Условие активно.

В легенде ключевое слово (default) отображено как отрицаемое условие.

Рассмотрите эту модель, содержащую блок Variant Subsystem с различным выбором. Определенное различное условие активирует каждый блок.

В Различной Подсистеме (Controller) sensor1 и sensor3 используются и в Линейном Контроллере и в Нелинейных Контроллерах, но sensor2 используется только в Линейном Контроллере. Следовательно, блок sensor2 выполняется только, когда Линейный выбор Контроллера активен и не выполняется ни для какого другого выбора. Чтобы гарантировать, что компоненты за пределами Различной Подсистемы (Controller) знают об активном или неактивном состоянии блоков с Различной Подсистемой, блочное условие должно распространить за пределами Различной Подсистемы.

Распространите условия без, генерируют условные выражения препроцессора

Чтобы распространить условия за пределами Различных Подсистем без генерируют условные выражения препроцессора, выбирают условия Propagate за пределами различного флажка подсистемы в диалоговом окне Block Parameter блока Variant Subsystem. По умолчанию Распространите условия за пределами различной подсистемы, не выбран.

Когда вы моделируете модель с активным выбором как Нелинейный Контроллер и Распространить условие за пределами различной выбранной подсистемы, только активный выбор анализируется. Заметьте, что Анализирование всего выбора во время обновления схематически изображает и генерирует условный флажок препроцессора, не выбран.

Различная Легенда Условия отображает неактивные условия как false. Здесь, sensor2 неактивен различным выбором как Нелинейный Контроллер и отмечен как false. Аннотации отображены на порте sensor2 и неактивном блоке, который соединяется с sensor2.

Когда вы генерируете код для распространения условия без, генерируют условные выражения препроцессора, неактивные блоки проигнорированы. В этом примере входной порт In2 не показывают в сгенерированном коде.

Распространите условия с, генерируют условные выражения препроцессора

Чтобы распространить условия за пределами Различной Подсистемы с генерируют условные выражения препроцессора, выбирают условия Propagate за пределами различного флажка подсистемы, и Анализирование всего выбора во время обновления схематически изображают и генерируют условный флажок препроцессора в диалоговом окне Block Parameter Различной Подсистемы.

Когда вы моделируете модель с активным выбором как Нелинейный Контроллер и Распространяете условия за пределами различного флажка подсистемы, и Анализирование всего выбора во время обновления схематически изображают и генерируют условный установленный флажок препроцессора, весь различный выбор анализируется. Различная Легенда Условия отображает различные условия, сопоставленные с моделью.

Когда вы генерируете код для распространения условия с, генерируют условные выражения препроцессора, модель анализируется для всего выбора. В этом примере входной порт In2 охраняют с необходимыми условиями.

Адаптивный интерфейс для различных подсистем

Когда вы выбираете условия 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 вывод.

Когда вы моделируете эту модель, блок Variant Subsystem адаптирует свой интерфейс, таким образом, что условие V = 2 (v:1 V=2) распространяет In2, filter и блоки saturation logger.

Распространение условия с условными системами

Когда вы распространяете условие к условной системе, то же условие установлено ко всем портам. Для получения дополнительной информации смотрите, Распространяют Различное Условие к Условной Подсистеме.

Рассмотрите эту модель. Здесь, когда условие распространено к блоку Inport (fcn), то же условие распространяет ко всему импорту и выходным портам (как показано в Различной Легенде) и делает условное выражение блока Variant 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. Для получения дополнительной информации о конфигурировании модели, чтобы сгенерировать код, смотрите, Готовят Содержащую Вариант Модель к Генерации кода.

Рассмотрите различную модель, содержащую блок 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 с выполнимым как Различный выбор Подсистемы.

Защита определения вызова функции

Чтобы охранять целое определение Вызова функции (fcn), используйте различный источник как показано ниже.

В сгенерированном коде определение fcn() охраняют с == 1.

#if A == 1
void fcn(void)
{
…..
}
#endif

Эта функция может быть отнесена с помощью фрагмента кода, подобного как показано ниже.

…..
#if A==1
fcn()
#endif
……

Похожие темы

Была ли эта тема полезной?