Используйте различные модели, чтобы сгенерировать код, который использует условные выражения препроцессора 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 выбора, который открывает 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. Чтобы сгенерировать код для модели, во вкладке C Code панели инструментов выбирают Build.

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

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

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

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