Необходимые продукты: Simulink®, Embedded Coder®, Simulink Coder™
Используя Simulink, можно создать модели, которые основаны на платформе модульного проектирования, которая включает фиксированную общую структуру с конечным множеством переменных компонентов. Изменчивость помогает вам разработать сингл, фиксированный основной дизайн с переменными компонентами. Для получения дополнительной информации смотрите то, Что Является Вариантами и Когда Использовать Их (Simulink). Когда вы реализуете варианты в сгенерированном коде, вы можете:
Сгенерированный код повторного использования от набора прикладных моделей, которые совместно используют функциональность с незначительными изменениями.
Совместно используйте сгенерированный код с третьим лицом, которое активирует один из вариантов в коде.
Подтвердите поддерживаемые варианты для модели и затем примите решение активировать один вариант для конкретного приложения, не регенерируя и подтверждая код.
Сгенерируйте код для варианта по умолчанию, который выбран, когда активный вариант не существует.
Используя Embedded Coder, можно сгенерировать код из моделей Simulink, содержащих один или несколько вариантов. Сгенерированный код содержит условные выражения препроцессора, которые управляют активацией каждого варианта.
Этот пример показывает, как представлять варианты в модели Simulink и затем подготовить модель так, чтобы те варианты были представлены в сгенерированном коде.
Варианты являются двумя или больше настройками компонента в вашей модели. Этот пример использует модель rtwdemo_preprocessor_subsys
, чтобы проиллюстрировать, как представлять варианты в Различных блоках Subsystem. Для других способов представлять варианты, см. Опции для Представления Вариантов в Simulink (Simulink).
Откройте модель rtwdemo_preprocessor_subsys
.
open_system('rtwdemo_preprocessor_subsys')
Модель содержит два Различных блока Subsystem: LeftController и RightController.
Можно только добавить Inport, Выходной порт, Подсистему и блоки Model в Различном блоке Subsystem.
Откройте блок LeftController.
Блок LeftController служит контейнером для вариантов. Это содержит два варианта, представленные с помощью блоков Subsystem Nonlinear и Linear. Нелинейные подсистемы контроллера реализуют гистерезис, тогда как линейные подсистемы контроллера действуют как простые фильтры нижних частот.
Блоки Subsystem имеют то же количество импорта и выходных портов как содержание Различного блока Subsystem.
Варианты могут иметь различные количества импорта и выходных портов. Смотрите Отображение Inports и Выходные порты Вариантов (Simulink).
Откройте блок Nonlinear.
Блок Nonlinear представляет один вариант, который активирует Simulink, когда условие удовлетворено. Блок Linear представляет другой вариант.
Когда вы моделируете варианты, можно создать пустые блоки Subsystem без вводов или выводов в Различном блоке Subsystem. Пустая подсистема воссоздает ситуацию, в которой та подсистема неактивна без потребности в том, чтобы полностью смоделировать вариант.
Можно переключиться между вариантами путем построения названных различных средств управления условных выражений для каждого варианта, представленного в Различном блоке Subsystem. Различные средства управления определяют, какой вариант активен, и изменение значения различного управления заставляет активный вариант переключаться.
Различным управлением является Булево выражение, которое активирует определенный вариант, когда оно оценивает к true
.
Для получения дополнительной информации смотрите Введение в Различные Средства управления (Simulink).
Щелкните правой кнопкой по блоку 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
называется различной контрольной переменной, которая может быть задана одним из способов, перечисленных в Подходах для Определения Различных Средств управления (Simulink).
Задайте различную контрольную переменную 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. Объекты параметра (Simulink).
Код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if
, #else
, #elif
и #endif
. Поэтому активный вариант выбран во время компиляции, и условные выражения препроцессора определяют который разделы кода выполниться.
В редакторе Simulink выберите Simulation> Model Configuration Parameters.
Выберите панель Code Generation и установите System target file на ert.tlc
.
В панели Report выберите Create code generation report.
В диалоговом окне Configuration Parameters очистите Ignore custom storage classes и нажмите Apply.
В вашей модели щелкните правой кнопкой по блоку LeftController и выберите Block Parameters (Subsystem).
Выберите опцию Analyze all choices during update diagram and generate preprocessor conditionals.
Когда вы выбираете эту опцию, Simulink анализирует все варианты во время схемы обновления или симуляции. Этот анализ обеспечивает раннюю валидацию готовности генерации кода всех вариантов.
Создайте модель.
Отчет генерации кода содержит раздел, выделенный подсистемам, которым управляли вариантами условные выражения препроцессора.
Чтобы открыть Отчет Генерации кода нажимают Code> C/C++ Code> Code Generation Report> Open Model 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
Когда вы генерируете код для Различных блоков Subsystem, блоки не могут иметь:
Большие матрицы
Порты вызова функции
Выходные порты с постоянным шагом расчета
Блоки Simscape™
Номера портов и имена для каждой активной дочерней подсистемы должны принадлежать подмножеству номеров портов и именам родительского Различного блока Subsystem.