Этот пример показывает вам, как использовать различные модели, чтобы сгенерировать код, который использует условные выражения препроцессора, чтобы управлять, какой код соединяется во встроенный исполняемый файл.
Можно использовать блок Model, чтобы сослаться на одну модель Simulink® (дочерняя модель) из другой модели Simulink® (родительская модель). Различный блок Subsystem может иметь различные варианты. Варианты могут включать набор блоков Model, из которых Различный блок Subsystem выбирает тот. Рисунок ниже является концептуальным описанием различных моделей. В этом примере Right Controller
блок модели может потенциально выбрать из двух блоков Model. Модели, на которые ссылаются блоки Model, обеспечивают изменения на номинальную, предписанную функциональность.
Различный блок Subsystem имеет только один вариант, активный за один раз. Можно использовать Различное диалоговое окно блока Subsystem, чтобы выбрать активный вариант. В качестве альтернативы можно параметрировать выбор активного варианта и сделать его зависящим от значений переменных и объектов в основной рабочей области MATLAB®. Когда вы генерируете код, можно сгенерировать код для всех вариантов и задержать выбор активного варианта, пока не пора скомпилировать тот код.
Открытие модели rtwdemo_preprocessor
в качестве примера запускает PostLoadFcn, заданный в "Файле: ModelProperties: Коллбэки" диалоговое окно. Это заполняет базовое рабочее пространство с контрольными переменными для Различных блоков Subsystem.
open_system('rtwdemo_preprocessor')
Left Controller
различная подсистема содержит два дочерних блока Model: Linear
и Nonlinear
. 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.
Left Controller
диалоговое окно блока подсистемы создает ассоциацию между Linear
и Nonlinear
Блоки Model с двумя 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';
Различные объекты позволяют вам снова использовать произвольно комплексные условия в модели. Несколько Различных блоков Subsystem могут использовать тот же Simulink.Variant
объекты, позволяя вам переключить активацию различных моделей как набор. Можно переключить набор до симуляции путем изменения значения VSSMODE
в среде MATLAB или при компиляции сгенерированного кода, как объяснено в следующем разделе. В этом примере, Left Controller
и Right Controller
сошлитесь на те же различные объекты, так, чтобы можно было переключить их одновременно.
Нелинейные модели контроллеров реализуют гистерезис, в то время как линейные модели контроллеров действуют как простые фильтры lowpass. Откройте подсистему для левого канала. Модели для правильного канала подобны.
Сгенерированный код получает доступ к различной контрольной переменной 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 Code панели инструментов выбирают Build.
Чтобы активировать генерацию кода условных выражений препроцессора, проверяйте, верны ли следующие условия:
Выберите цель Embedded Coder® в Генерации кода> Системный конечный файл в диалоговом окне Configuration Parameters
В Различном диалоговом окне параметра блока Subsystem, установленном Различный параметр времени активации на 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|
В сгенерированном коде код, связанный с вариантами, охраняют условные выражения препроцессора C. Например, в rtwdemo_preprocessor.c
, вызовы шага и функций инициализации каждого варианта условно скомпилированы:
Закройте модель, фигуру и переменные рабочей области из примера.
bdclose('rtwdemo_preprocessor') close(findobj(0,'Tag','CloseMe')); clear LINEAR NONLINEAR VSSMODE clear tout yout youtl youtnl