В этом примере показано, как использовать вариационные подсистемы Simulink ® для создания условий препроцессора C, которые управляют тем, какая дочерняя подсистема вариационной подсистемы активна в сгенерированном коде, созданном Coder™ Simulink ®.
Блок Variant Subsystem содержит две или более дочерние подсистемы, в которых один дочерний компонент активен во время выполнения модели. Активная дочерняя подсистема называется активным вариантом. Можно программно переключать активный вариант блока «Подсистема исполнения», изменяя значения переменных в базовой рабочей области или переопределяя выбор исполнения вручную с помощью диалогового окна «Блок подсистемы исполнения». Активный вариант программно подключается к блокам Inport и Outport подсистемы Variant от Simulink ® во время компиляции модели.
Для программного управления выбором вариантов Simulink.Variant объект связан с каждой дочерней подсистемой в диалоговом окне блока Variant Subsystem. Simulink.Variant создаются в базовой рабочей области MATLAB ®. Эти объекты имеют свойство с именемCondition, выражение, которое вычисляет логическое значение и используется для определения активной дочерней подсистемы варианта.
По умолчанию созданный код содержит только активный вариант. Можно также параметризовать выбор активного исполнения и сделать его зависимым от значений переменных и объектов в базовой рабочей области MATLAB ®. При создании кода можно создать код для всех вариантов и отложить выбор активного варианта до тех пор, пока не наступит время компиляции этого кода.
Открытие модели-примера rtwdemo_preprocessor_subsys запустит PostLoadFcn, определенный в диалоговом окне «File: ModelProperties: Callbacks». Это приведет к заполнению базовой рабочей области переменными для блоков подсистемы исполнения.
open_system('rtwdemo_preprocessor_subsys')

Подсистема исполнения LeftController содержит две дочерние подсистемы: Линейная и Нелинейная. Дочерняя подсистема LeftController/Linear выполняется, когда объект Simulink.Variant LINEAR вычисляется как trueи дочерняя подсистема LeftController/Nonlinear выполняется, когда объект Simulink.Variant NONLINEAR вычисляется как true.
Simulink.Variant объекты указываются для подсистемы LeftController, щелкнув правой кнопкой мыши подсистему LeftController и выбрав Subsystem Parameters, в результате чего откроется диалоговое окно блока подсистемы LeftController.
open_system('rtwdemo_preprocessor_subsys/LeftController');

Диалоговое окно блока подсистемы LeftController создает связь между линейной и нелинейной подсистемами с двумя объектами Simulink.Variant, LINEAR и NONLINEAR, которые существуют в базовой рабочей области. Эти объекты имеют свойство с именем Condition, выражение, которое вычисляет логическое значение и определяет активную дочернюю подсистему варианта (линейную или нелинейную). Условие также отображается в диалоговом окне блока подсистемы. В этом примере условия 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 или при компиляции сгенерированного кода, как описано в следующем разделе. В этом примере LeftController и RireController ссылаются на одни и те же объекты вариантов, что позволяет одновременно переключать их.
Нелинейные подсистемы контроллера реализуют гистерезис, в то время как линейные подсистемы контроллера действуют как простые фильтры нижних частот. Откройте подсистему левого канала. Подсистемы для правильного канала аналогичны.
Созданный код получает доступ к переменной управления вариантами. 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_subsys')
youtnl = yout;
При изменении значения VSSMODE При значении 0 модель использует линейные контроллеры во время моделирования.
VSSMODE.Value = int32(0);
sim('rtwdemo_preprocessor_subsys')
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» панели инструментов выберите «Построить».
Для активизации формирования кода условий препроцессора проверьте, соответствуют ли следующие условия:
Выберите 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_subsys_types.h, файл заголовка:
#ifndef LINEAR #define LINEAR (VSSMODE == 0) #endif
#ifndef NONLINEAR #define NONLINEAR (VSSMODE == 1) #endif
В сгенерированном коде код, связанный с вариантами, охраняется условиями препроцессора C. Например, в rtwdemo_preprocessor_subsys.c, условно компилируются вызовы функций шага и инициализации каждого варианта:
/* Outputs for atomic SubSystem: '<Root>/LeftController' */
#if LINEAR
/* Output and update for atomic system: '<S1>/Linear' */
#elif NONLINEAR
/* Output and update for atomic system: '<S1>/Nonlinear' */
#endifЗакройте переменные модели, фигуры и рабочей области из примера.
bdclose('rtwdemo_preprocessor_subsys') close(findobj(0,'Tag','CloseMe')); clear LINEAR NONLINEAR VSSMODE clear tout yout youtl youtnl