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

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

Обзор различных моделей

Можно использовать блок 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, который открывает диалоговое окно блока Subsystem Варианта Left Controller.

Подсистема Left Controller блокируется, диалоговое окно создает ассоциацию между Linear и блоками Model 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';

Определение различной контрольной переменной

Различные объекты позволяют вам снова использовать произвольно комплексные условия в модели. Несколько Различных блоков Subsystem могут использовать те же объекты 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. Можно сгенерировать код для модели путем выбора Code> C/C ++ Code> Build Model.

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

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

  • В Различном диалоговом окне параметра блока Subsystem очистите опцию, чтобы Заменить различные условия и использование после варианта

  • В Различном диалоговом окне параметра блока Subsystem, Выбор опция, чтобы Анализировать весь выбор во время обновления схематически изображают и генерируют условные выражения препроцессора.

Отчет генерации кода Simulink® Coder™ содержит разделы в отчете Вариантов Кода, выделенном подсистемам, которым управляли вариантами условные выражения препроцессора.

В этом примере сгенерированный код включает ссылки на объекты 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