В этом примере показано, как использовать модели вариантов для генерации кода, который использует условия препроцессора для управления тем, какой код связан со встроенным исполняемым файлом.
Можно использовать блок 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. Чтобы сгенерировать код для модели, на вкладке Код С панели инструментов выберите 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