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

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

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

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

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

Чтобы распространить условия за пределами Различной Подсистемы с генерируют условные выражения препроцессора, устанавливают флажок Propagate conditions outside of variant subsystem и устанавливают Variant activation time на code compile в диалоговом окне Block Parameters Различной Подсистемы.

Примечание

Variant activation time доступен только, когда вы задаете Variant control mode как Expression.

Когда вы симулируете модель с активным выбором как флажок Nonlinear Controller и Propagate conditions outside of variant subsystem и набор Variant activation time к code compile, все варианты анализируются. Variant Condition Legend отображает различные условия, сопоставленные с моделью.

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

Примечание

Чтобы распространить различные условия вне блока Variant 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), то же условие распространяет ко всему Inport и блокам Outport (как показано в Различной Легенде) и делает условное выражение блока Variant Subsystem.

Известные ограничения

  • Распространенные различные условия от различных подсистем не могут быть установлены на блоках Stateflow® или Simscape™.

  • Генерация кода С++ не поддерживается для моделей, которые содержат распространенные условия за пределами блока 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 */
 
}

Примечание

  • Модель Configuring как компонент AUTOSAR с выполнимым как Различный выбор Подсистемы не поддерживается.

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

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

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

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

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

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

Похожие темы