Используйте модели вариантов для генерации кода, который использует условия предпроцессора C

В этом примере показано, как использовать модели вариантов для генерации кода, который использует условия препроцессора для управления тем, какой код связан со встроенным исполняемым файлом.

Обзор исполнительных моделей

Можно использовать блок Model, чтобы ссылаться на одну модель Simulink ® (дочернюю модель) из другой модели Simulink ® (родительская модель). Блок Variant Subsystem может иметь различные варианты. Варианты могут включать набор блоков Model, из которого блок Variant Subsystem выбирает один. Рисунок ниже является концептуальным изображением вариантов моделей. В этом примере Right Controller блок модели может потенциально выбрать из двух блоков Model. Модели, на которые ссылаются блоки Model, обеспечивают изменения при номинальной, предписанной функциональности.

Блок Variant Subsystem имеет только один активный вариант за раз. Можно использовать диалоговое окно Блок Исполнительной Подсистемы, чтобы выбрать активный вариант. Кроме того, можно параметризовать выбор активного варианта и сделать его зависимым от значений переменных и объектов в базовой рабочей области MATLAB ®. Когда вы генерируете код, можно сгенерировать код для всех вариантов и отложить выбор активного варианта, пока не наступит время скомпилировать этот код.

Определение исполнительных моделей

Открытие примера модели rtwdemo_preprocessor запускает PostLoadFcn, заданный в диалоговом окне «File: ModelProperties: Коллбэки». Это заполняет базовое рабочее пространство переменными управления для блоков Variant Subsystem.

open_system('rtwdemo_preprocessor')

The Left Controller подсистема варианта содержит два дочерних блока Model: Linear и Nonlinear. The Left Controller/Linear дочерняя модель выполняется, когда Simulink.Variant LINEAR объекта вычисляет, чтобы true, и Left Controller/Nonlinear дочерняя модель выполняется, когда Simulink.Variant NONLINEAR объекта вычисляет, чтобы true.

Simulink.Variant объекты заданы для Left Controller подсистема щелчком правой кнопкой мыши по Left Controller подсистема и выбор Subsystem Parameters, который открывает Left Controller Диалоговое окно «Варианты блока Subsystem».

The Left Controller диалоговое окно блока подсистемы создает связь между Linear и Nonlinear Моделируйте блоки с двумя Simulink.Variant объекты из базового рабочего пространства, LINEAR и NONLINEAR. Эти объекты имеют свойство с именем Condition, которое является выражением, которое оценивает до логического значения и определяет активную модель варианта (Linear или Nonlinear). Условие также показано в диалоговом окне блока подсистемы. В этом примере условия LINEAR и NONLINEAR являются 'VSSMODE == 0' и 'VSSMODE == 1', соответственно.

В этом примере Simulink.Variant объекты создаются в базовом рабочем пространстве.

LINEAR = Simulink.Variant;
LINEAR.Condition = 'VSSMODE==0';
NONLINEAR = Simulink.Variant;
NONLINEAR.Condition = 'VSSMODE==1';

Определение переменной управления вариантом

Объекты варианта позволяют вам повторно использовать произвольно сложные условия во всей модели. Блоки Многофункциональной Подсистемы могут использовать одни и те же Simulink.Variant объекты, позволяющие вам переключать активацию исполнительных моделей как набора. Можно переключить набор перед симуляцией, изменив значение VSSMODE в среде MATLAB или при компиляции сгенерированного кода, как объяснено в следующем разделе. В этом примере Left Controller и Right Controller ссылка на те же объекты варианта, так что можно переключать их одновременно.

Нелинейные модели контроллеров реализуют гистерезис, в то время как линейные модели контроллеров действуют как простые низкочастотные фильтры. Откройте подсистему для левого канала. Модели для правого канала аналогичны.

Сгенерированный код обращается к переменной управления вариантом VSSMODE как пользовательский макрос. В этом примере rtwdemo_importedmacros.h поставляет VSSMODE. В рамках окружения MATLAB вы задаете VSSMODE использование Simulink.Parameter объект. Его значение будет проигнорировано при генерации кода, включая предварительные условия процессора. Однако значение используется для симуляции. Устаревший файл заголовка задает значение макроса, который будет использоваться при компиляции сгенерированного кода, что в конечном счете активирует один из двух заданных вариантов во встроенном исполняемом файле.

Переменные управления вариантом могут быть определены как Simulink.Parameter объекты с одним из следующих классов памяти:

  • Define или ImportedDefine с заданным файлом заголовка

  • CompilerFlag

  • SystemConstant (AUTOSAR)

  • Пользовательский пользовательский класс памяти, который определяет данные как макрос в указанном заголовочном файле

VSSMODE = Simulink.Parameter;
VSSMODE.Value = 1;
VSSMODE.DataType = 'int32';
VSSMODE.CoderInfo.StorageClass = 'Custom';
VSSMODE.CoderInfo.CustomStorageClass = 'ImportedDefine';
VSSMODE.CoderInfo.CustomAttributes.HeaderFile = 'rtwdemo_importedmacros.h';

Симуляция модели с различными вариантами

Потому что вы задаете значение VSSMODE на 1, модель использует нелинейные контроллеры во время симуляции.

sim('rtwdemo_preprocessor')
youtnl = yout;

Если вы меняете значение VSSMODE на 0, модель использует линейные контроллеры во время симуляции.

VSSMODE.Value = int32(0);
sim('rtwdemo_preprocessor')
youtl = yout;

Можно построить и сравнить реакцию линейного и нелинейного контроллеров:

figure('Tag','CloseMe');
plot(tout, youtnl.signals(1).values, 'r-', tout, youtl.signals(1).values, 'b-')
title('Response of Left Channel Linear and Nonlinear Controllers');
ylabel('Response');
xlabel('Time (seconds)');
legend('nonlinear','linear')
axis([0 100 -0.8 0.8]);

Использование условий предпроцессора C

Эта пример модели была сконфигурирована, чтобы сгенерировать предварительные условия C. Чтобы сгенерировать код для модели, на вкладке Код С панели инструментов выберите Build.

Чтобы активировать генерацию кода предварительных условий процессора, проверьте, верны ли следующие условия:

  • Выберите цель Embedded Coder ® в Генерация Кода > Системный целевой файл в диалоговом окне Configuration Parameters

  • В диалоговом окне блочного параметра Variant Subsystem установите параметр Variant activation time равным code compile.

В этом примере сгенерированный код включает ссылки на Simulink.Variant объекты LINEAR и NONLINEAR, а также определения макросов, соответствующих этим вариантам. Эти определения зависят от значения VSSMODE, который передается во внешний заголовочный файл rtwdemo_importedmacros.h. Активный вариант определяется при помощи предварительных условий процессора (#if) на макросах (#define) LINEAR и NONLINEAR.

Макросы LINEAR и NONLINEAR определяются в сгенерированных rtwdemo_preprocessor_types.h файл заголовка:

  |#ifndef LINEAR|
  |#define LINEAR      (VSSMODE == 0)|
  |#endif|
  |#ifndef NONLINEAR|
  |#define NONLINEAR   (VSSMODE == 1)|
  |#endif|

В сгенерированном коде код, относящийся к вариантам, охраняется условиями препроцессора С. Для примера, в rtwdemo_preprocessor.c, вызовы шага и функции инициализации каждого варианта скомпилированы по условию:

Закройте переменные модели, рисунки и рабочей области из примера.

bdclose('rtwdemo_preprocessor')
close(findobj(0,'Tag','CloseMe'));
clear LINEAR NONLINEAR VSSMODE
clear tout yout youtl youtnl