Используйте различные блоки Subsystem с условно выполняемыми подсистемами

Можно использовать условно выполняемые подсистемы, которые используют входные порты управления, такие как Enabled, Triggered, Reset и подсистемы Function-Call как варианты в блоке Variant Subsystem. Для получения дополнительной информации об условно выполняемых системах см. Условно Выполняемый Обзор Подсистем.

Примечание

Когда параметр Variant activation time блока Variant Subsystem устанавливается на code compile, тип блоков порта управления во всех вариантах должен быть тем же самым. Например, вы не можете использовать Enabled Subsystem и блоки Function-Call Subsystem как выбор в блоке Variant Subsystem, который имеет code compile время активации.

Входные порты управления на блоках варианта и соответствующий входной порт на родительском блоке Variant Subsystem должны иметь то же имя.

Создайте различную подсистему с Enabled подсистемой как выбор

Рассмотрите эту модель с блоком Variant Subsystem под названием Controller и два блока Enabled Subsystem, Linear и Nonlinear, как варианты. Различные условия на Linear и Nonlinear блоками является VSSMODE==0 и VSSMODE==1, соответственно. Если вы используете блок Enabled Subsystem для Linear выбор, затем Nonlinear выбором должен также быть Enabled Subsystem.

Когда вы генерируете код из этой модели, Linear и Nonlinear выбор охраняют соответствующие различные условия.

step() {
#if VSSMODE==0
// code for Linear choice
.......
#elif VSSMODE==1
// code for Nonlinear choice
.......
#endif

Используйте различный блок Subsystem, чтобы создать модель экспорта функций

Моделями экспорта функций является Simulink® модели, которые генерируют код для независимых функций, которые могут быть интегрированы с внешней средой и планировщиком. Можно использовать блок Variant Subsystem с блоками Function-Call Subsystem как варианты, чтобы создать модель экспорта функций. Для получения дополнительной информации о моделях экспорта функций см. Обзор Моделей Экспорта функций.

Рассмотрите модель, содержащую блок Variant Subsystem под названием VariantFcnCall с двумя блоками Function-Call Subsystem, Linear и Nonlinear, как варианты. Различные условия установлены на Linear и Nonlinear выбором является VSS_MODE==0 и VSS_MODE==1, соответственно. VariantFcnCallблок имеет корневой блок импорта вызова функции уровня, fcn, и то же имя дано портам управления на Linear и Nonlinear блоки выбора. Параметр Variant activation time VariantFcnCall установлен в code compile.

У вас может также быть подобный шаблон моделирования с многоточечной функцией записи использование блоков Model.

В этом примере, входные параметры fcln1, fcln2, и fcln3 направляются через блок Variant Subsystem, Model, это использует блоки Model в качестве вариантов.

Генерация кода для модели экспорта функций

Когда вы генерируете код из этой модели, определения экспорта функций, fcn, содержит C условные выражения препроцессора #if и #endif. Код для Linear и Nonlinear выбор охраняют соответствующие различные условия. Для получения дополнительной информации о конфигурировании модели, чтобы сгенерировать код, смотрите, Готовят Содержащую Вариант Модель к Генерации кода.

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 */
 
}

Определение экспорта функций охраны в сгенерированном коде

Охранять целое определение экспорта функций, fcn, использование различного условия, используйте блок Variant Source как показано в этом примере.

Guard the definition of an export function using a Variant Source block

В сгенерированном коде, определении экспорта функций, fcn(), охраняется с A==1.

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

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

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

Распространите различные условия от различных блоков Subsystem до условных подсистем

Когда вы распространяете различное условие к условной подсистеме, то же условие установлено ко всем портам.

Рассмотрите эту модель. Блок Variant Subsystem, VariantFcnCall, имеет условные блоки подсистемы как выбор. Импорт fcn на VariantFcnCall соответствует входным портам управления на блоках варианта. Одно вход, блок Variant Source одно выхода с условием A==1 соединяется с fcn порт. VariantFcnCall блок получает различное условие сигнала, соединенного с fcn порт. Условие, присвоенное блоку затем, распространяет с блоками, соединенными с его портами ввода и вывода. Когда вы симулируете эту модель после установки A=1, различное условие A==1 распространяет к VariantFcnCall блокируйтесь и к In1 и Out1 блоки соединяются с ним, как показано в Различной Легенде Условий.

Ограничения

Эти условия не поддерживаются при использовании условно выполняемых систем как варианты в блоке Variant Subsystem:

  • Action Port блокируется в вариантах.

  • Iterator Port блокируется в вариантах Variant Subsystem с набором Variant activation time к code compile.

  • Конфигурирование модели как компонент AUTOSAR с выполнимым как различный выбор подсистемы.

  • Initialize Function, Reset Function, Terminate Function и блоки Simulink Function.

    Примечание

    Инициализируйте и порты события Terminate являются всегда безусловными, потому что они управляют и значением по умолчанию модели и специфичный для блока, инициализируют и отключают события модели, на которую ссылаются. Если вы задаете Инициализировать функциональный блок в модели, на которую ссылаются, это соответствует явному, инициализируют событие.

Похожие темы