exponenta event banner

Представление подсистем и исполнительных моделей в сгенерированном коде

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

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

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

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

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

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

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

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

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

Варианты - это две или более конфигурации компонента в модели. В этом примере используется модель rtwdemo_preprocessor_subsys для иллюстрации представления вариантов в блоках подсистемы исполнений. Другие способы представления вариантов исполнения см. в разделе Опции представления исполнений в Simulink.

  1. Открытие модели rtwdemo_preprocessor_subsys.

    open_system('rtwdemo_preprocessor_subsys')

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

    Примечание

    Блоки Inport, Outport, Subsystem и Model можно добавлять только внутри блока Variant Subsystem.

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

    Блок LeftController служит контейнером для вариантов выбора. Он содержит два варианта, представленные с помощью блоков подсистем Нелинейный (Nonlinear) и Линейный (Linear). Нелинейные подсистемы контроллера реализуют гистерезис, тогда как линейные подсистемы контроллера действуют как простые фильтры нижних частот.

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

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

  3. Откройте нелинейный блок.

    Нелинейный блок представляет один вариант, который Simulink активирует при выполнении условия. Блок «Линейный» представляет другой вариант.

    Совет

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

Шаг 2: Определение условий, управляющих выбором вариантов

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

Элемент управления исполнениями - это логическое выражение, которое активирует конкретный вариант при вычислении true.

Дополнительные сведения см. в разделе Введение в элементы управления исполнениями.

  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 называется переменной управления исполнениями, которая может быть указана одним из способов, перечисленных в разделе Подходы к определению элементов управления исполнениями.

  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.Parameter.

Шаг 3: Настройка модели для генерации условий препроцессора

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

  1. На вкладке «Моделирование» панели инструментов «Симуляция» выберите «Параметры модели».

  2. Выберите панель «Создание кода» и задайте для параметра «Системный целевой файл» значение ert.tlc.

  3. На панели «Отчет» выберите Создать отчет о создании кода.

  4. В диалоговом окне Параметры конфигурации снимите флажок Игнорировать пользовательские классы хранения и нажмите кнопку Применить.

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

  6. Установите для параметра Variant activation time значение code compile.

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

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

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

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

  1. На вкладке «Код C» панели инструментов выберите «Открыть отчет».

  2. Выберите слева отчет по вариантам кода.

    В этом примере сгенерированный код содержит ссылки на 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

Ограничения

  • При создании кода для блоков подсистемы вариантов блоки не могут иметь:

    • Массовые матрицы

    • Функциональные порты вызовов

    • Выходы с постоянным временем выборки

    • Simscape™ блоки

  • Номера портов и имена для каждой активной дочерней подсистемы должны принадлежать подмножеству номеров портов и имен родительского блока Variant Subsystem.

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

Подробнее