Представляйте подсистему и различные модели в сгенерированном коде

Необходимые продукты: Simulink®, Embedded Coder®, Simulink Coder™

Используя Simulink, можно создать модели, которые основаны на платформе модульного проектирования, которая включает фиксированную общую структуру с конечным множеством переменных компонентов. Изменчивость помогает вам разработать сингл, фиксированный основной дизайн с переменными компонентами. Для получения дополнительной информации смотрите то, Что Является Вариантами и Когда Использовать Их (Simulink). Когда вы реализуете варианты в сгенерированном коде, вы можете:

  • Сгенерированный код повторного использования от набора прикладных моделей, которые совместно используют функциональность с незначительными изменениями.

  • Совместно используйте сгенерированный код с третьим лицом, которое активирует один из вариантов в коде.

  • Подтвердите поддерживаемые варианты для модели и затем примите решение активировать один вариант для конкретного приложения, не регенерируя и подтверждая код.

  • Сгенерируйте код для варианта по умолчанию, который выбран, когда активный вариант не существует.

Используя Embedded Coder, можно сгенерировать код из моделей Simulink, содержащих один или несколько вариантов. Сгенерированный код содержит условные выражения препроцессора, которые управляют активацией каждого варианта.

В этом примере показано, как представлять варианты в модели Simulink и затем подготовить модель так, чтобы те варианты были представлены в сгенерированном коде.

Шаг 1: представляйте варианты в Simulink

Варианты являются двумя или больше настройками компонента в вашей модели. Этот пример использует модель rtwdemo_preprocessor_subsys проиллюстрировать, как представлять варианты в блоках Variant Subsystem. Для других способов представлять варианты, см. Опции для Представления Вариантов в Simulink (Simulink).

  1. Откройте модель rtwdemo_preprocessor_subsys.

    open_system('rtwdemo_preprocessor_subsys')

    Модель содержит два блока Variant Subsystem: LeftController и RightController.

    Примечание

    Можно только добавить Inport, Outport, Subsystem и блоки Model в блоке Variant Subsystem.

  2. Откройте блок LeftController.

    Блок LeftController служит контейнером для вариантов. Это содержит два варианта, представленные с помощью блоков Subsystem Nonlinear и Linear. Нелинейные подсистемы контроллера реализуют гистерезис, тогда как линейные подсистемы контроллера действуют как простые фильтры lowpass.

    Блоки Subsystem имеют то же количество импорта и выходных портов как содержание блока Variant Subsystem.

    Варианты могут иметь различные количества импорта и выходных портов. Смотрите Отображение Inports и Выходные порты Вариантов (Simulink).

  3. Откройте блок Nonlinear.

    Блок Nonlinear представляет один вариант, который активирует Simulink, когда условию удовлетворяют. Блок Linear представляет другой вариант.

    Совет

    Когда вы моделируете варианты, можно создать пустые блоки Subsystem без вводов или выводов в блоке Variant Subsystem. Пустая подсистема воссоздает ситуацию, в которой та подсистема неактивна без потребности в том, чтобы полностью смоделировать вариант.

Шаг 2: задайте условия тот выбор варианта управления

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

Различным управлением является Булево выражение, которое активирует определенный вариант, когда оно оценивает к true.

Для получения дополнительной информации смотрите Введение в Различные Средства управления (Simulink).

  1. Щелкните правой кнопкой по блоку LeftController и выберите Block Parameters (Subsystem).

    Отображения столбца Condition Булево выражение это, когда true активирует каждый вариант. В этом примере эти условия заданы с помощью Simulink.Variant объекты LINEAR и NONLINEAR.

  2. Используйте эти команды, чтобы задать различное управление с помощью Simulink.Variant объект.

    LINEAR = Simulink.Variant;
    LINEAR.Condition = 'VSSMODE==0';
    NONLINEAR = Simulink.Variant;
    NONLINEAR.Condition = 'VSSMODE==1';

    Здесь, VSSMODE называется различной контрольной переменной, которая может быть задана одним из способов, перечисленных в Подходах для Определения Различных Средств управления (Simulink).

  3. Задайте различную контрольную переменную 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).

Шаг 3: сконфигурируйте модель для генерации условных выражений препроцессора

Код, сгенерированный для каждого варианта, заключен в условных выражениях препроцессора C #if, #else, #elif, и #endif. Поэтому активный вариант выбран во время компиляции, и условные выражения препроцессора определяют который разделы кода выполниться.

  1. Во вкладке Modeling панели инструментов Simulink нажмите Model Settings.

  2. Выберите панель Code Generation и установите System target file на ert.tlc.

  3. В панели Report выберите Create code generation report.

  4. В диалоговом окне Configuration Parameters очистите Ignore custom storage classes и нажмите Apply.

  5. В вашей модели щелкните правой кнопкой по блоку LeftController и выберите Block Parameters (Subsystem).

  6. Выберите опцию Analyze all choices during update diagram and generate preprocessor conditionals.

    Когда вы выбираете эту опцию, Simulink анализирует все варианты во время схемы обновления или симуляции. Этот анализ обеспечивает раннюю валидацию готовности генерации кода всех вариантов.

  7. Создайте модель.

Шаг 4: рассмотрите сгенерированный код

Отчет генерации кода содержит раздел, выделенный подсистемам, которым управляли вариантами условные выражения препроцессора.

  1. Во вкладке C Code панели инструментов, select Open Report.

  2. Выберите Code Variant Report слева.

    В этом примере сгенерированный код включает ссылки на Simulink.Variant объекты LINEAR и NONLINEAR. Код также включает определения макросов, соответствующих тем вариантам. Определения зависят от значения VSSMODE, который предоставляется во внешнем заголовочном файле rtwdemo_importedmacros.h. Активный вариант определяется при помощи условных выражений препроцессора (#if) на макросах (#define) LINEAR и NONLINEAR.

  3. Выберите rtwdemo_preprocessor_subsys_types.h файл слева.

    Этот файл содержит определения макросов LINEAR и NONLINEAR.

    #ifndef LINEAR
    	#define LINEAR      (VSSMODE == 0)
    #endif
    
    #ifndef NONLINEAR
    	#define NONLINEAR   (VSSMODE == 1)
    #endif

  4. Выберите 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.

Связанные примеры

Больше о