exponenta event banner

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

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

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

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

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

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

Открытие модели-примера rtwdemo_preprocessor запускает PostLoadFcn, определенный в диалоговом окне «File: ModelProperties: Callbacks». При этом базовая рабочая область заполняется управляющими переменными для блоков подсистемы исполнения.

open_system('rtwdemo_preprocessor')

Left Controller исполнительная подсистема содержит два дочерних блока модели: 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 диалоговое окно «Блок подсистемы исполнения».

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. Чтобы создать код для модели, на вкладке «Код C» панели инструментов выберите «Построить».

Для активизации формирования кода препроцессорных условий проверьте, соответствуют ли следующие условия:

  • Выберите Embedded Coder ® target в Code Generation > System target file в диалоговом окне Configuration Parameters (Параметры конфигурации).

  • В диалоговом окне «Параметры блока подсистемы исполнения» задайте для параметра «Время активации исполнения» значение 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