Необходимые продукты: Simulink®, Embedded Coder®, Simulink Coder™
Используя Simulink, можно создать модели, которые основаны на платформе модульного проектирования, которая включает фиксированную общую структуру с конечным множеством переменных компонентов. Изменчивость помогает вам разработать сингл, фиксированный основной дизайн с переменными компонентами. Для получения дополнительной информации смотрите то, Что Является Вариантами и Когда Использовать Их. Когда вы реализуете варианты в сгенерированном коде, вы можете:
Сгенерированный код повторного использования от набора прикладных моделей, которые совместно используют функциональность с незначительными изменениями.
Совместно используйте сгенерированный код с третьим лицом, которое активирует один из вариантов в коде.
Подтвердите поддерживаемые варианты для модели и затем примите решение активировать один вариант для конкретного приложения, не регенерируя и подтверждая код.
Сгенерируйте код для варианта по умолчанию, который выбран, когда активный вариант не существует.
Используя Embedded Coder, можно сгенерировать код из моделей Simulink, содержащих один или несколько вариантов. Сгенерированный код содержит условные выражения препроцессора, которые управляют активацией каждого варианта.
В этом примере показано, как представлять варианты в модели Simulink и затем подготовить модель так, чтобы те варианты были представлены в сгенерированном коде.
Варианты являются двумя или больше настройками компонента в вашей модели. Этот пример использует модель rtwdemo_preprocessor_subsys
проиллюстрировать, как представлять варианты в блоках Variant Subsystem. Для других способов представлять варианты, смотрите , Сравнивают Различные Блоки.
Откройте модель rtwdemo_preprocessor_subsys
.
open_system('rtwdemo_preprocessor_subsys')
Модель содержит два блока Variant Subsystem: LeftController и RightController.
Примечание
Можно только добавить Inport, Outport, Subsystem и блоки Model в блоке Variant Subsystem.
Откройте блок LeftController.
Блок LeftController служит контейнером для вариантов. Это содержит два варианта, представленные с помощью блоков Subsystem Nonlinear и Linear. Нелинейные подсистемы контроллера реализуют гистерезис, тогда как линейные подсистемы контроллера действуют как простые фильтры lowpass.
Блоки Subsystem имеют то же количество импорта и выходных портов как содержание блока Variant Subsystem.
Варианты могут иметь различные количества импорта и выходных портов. Смотрите Отображение Inports и Выходные порты Вариантов в Различной Подсистеме.
Откройте блок Nonlinear.
Блок Nonlinear представляет один вариант, который активирует Simulink, когда условию удовлетворяют. Блок Linear представляет другой вариант.
Совет
Когда вы моделируете варианты, можно создать пустые блоки Subsystem без вводов или выводов в блоке Variant Subsystem. Пустая подсистема воссоздает ситуацию, в которой та подсистема неактивна без потребности в том, чтобы полностью смоделировать вариант.
Можно переключиться между вариантами путем построения названных различных средств управления условных выражений для каждого варианта, представленного в блоке Variant Subsystem. Различные средства управления определяют, какой вариант активен, и изменение значения различного управления заставляет активный вариант переключаться.
Различным управлением является Булево выражение, которое активирует определенный вариант, когда оно оценивает к true
.
Для получения дополнительной информации смотрите Введение в Различные Средства управления.
Щелкните правой кнопкой по блоку LeftController и выберите Block Parameters (Subsystem).
Отображения столбца Condition Булево выражение это, когда true
активирует каждый вариант. В этом примере эти условия заданы с помощью Simulink.Variant
объекты LINEAR
и NONLINEAR
.
Используйте эти команды, чтобы задать различное управление с помощью Simulink.Variant
объект.
LINEAR = Simulink.Variant; LINEAR.Condition = 'VSSMODE==0'; NONLINEAR = Simulink.Variant; NONLINEAR.Condition = 'VSSMODE==1';
Здесь, VSSMODE
называется различной контрольной переменной, которая может быть задана одним из способов, перечисленных в Подходах для Определения Различных Контрольных переменных.
Задайте различную контрольную переменную VSSMODE
.
Можно задать VSSMODE
как скалярная переменная или как Simulink.Parameter
объект. В дополнение к включению спецификации значения параметров, Simulink.Parameter
объекты позволяют вам задавать другие атрибуты, такие как тип данных, которые требуются для генерации кода.
VSSMODE = Simulink.Parameter; VSSMODE.Value = 1; VSSMODE.DataType = 'int32'; VSSMODE.CoderInfo.StorageClass = 'Custom'; VSSMODE.CoderInfo.CustomStorageClass = 'ImportedDefine'; VSSMODE.CoderInfo.CustomAttributes.HeaderFile = 'rtwdemo_importedmacros.h';
Различные контрольные переменные, заданные как Simulink.Parameter
объекты могут иметь один из этих классов памяти.
Define
или ImportedDefine
с заданным заголовочным файлом
CompilerFlag
SystemConstant (AUTOSAR)
Ваш собственный класс памяти, который задает данные как макрос
Можно также преобразовать скалярную различную контрольную переменную в Simulink.Parameter
объект. Смотрите Преобразуют Различные Контрольные переменные в Объекты Simulink.Parameter.
Код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if
, #else
, #elif
, и #endif
. Поэтому активный вариант выбран во время компиляции, и условные выражения препроцессора определяют который разделы кода выполниться.
Во вкладке Modeling панели инструментов Simulink нажмите Model Settings.
Выберите панель Code Generation и установите System target file на ert.tlc
.
В панели Report выберите Create code generation report.
В диалоговом окне Configuration Parameters очистите Ignore custom storage classes и нажмите Apply.
В вашей модели щелкните правой кнопкой по блоку LeftController и выберите Block Parameters (Subsystem).
Установите параметр Variant activation time на code compile
.
Когда вы выбираете эту опцию, Simulink анализирует все варианты во время схемы обновления или симуляции. Этот анализ обеспечивает раннюю валидацию готовности генерации кода всех вариантов.
Создайте модель.
Отчет генерации кода содержит раздел, выделенный подсистемам, которым управляли вариантами условные выражения препроцессора.
Во вкладке C Code панели инструментов, select Open Report.
Выберите Code Variant Report слева.
В этом примере сгенерированный код включает ссылки на Simulink.Variant
объекты LINEAR
и NONLINEAR
. Код также включает определения макросов, соответствующих тем вариантам. Определения зависят от значения VSSMODE
, который предоставляется во внешнем заголовочном файле rtwdemo_importedmacros.h
. Активный вариант определяется при помощи условных выражений препроцессора (#if
) на макросах (#define
) LINEAR
и NONLINEAR
.
Выберите rtwdemo_preprocessor_subsys_types.h
файл слева.
Этот файл содержит определения макросов LINEAR
и NONLINEAR
.
#ifndef LINEAR #define LINEAR (VSSMODE == 0) #endif #ifndef NONLINEAR #define NONLINEAR (VSSMODE == 1) #endif
Выберите 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
Когда вы генерируете код для блоков Variant Subsystem, блоки не могут иметь:
Большие матрицы
Порты вызова функции
Выходные порты с постоянным шагом расчета
Блоки Simscape™
Номера портов и имена для каждой активной дочерней подсистемы должны принадлежать подмножеству номеров портов и именам родительского Различного блока Subsystem.