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

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

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

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

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

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

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

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

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

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

Варианты выбора - эти два или более строений компонента в вашей модели. Этот пример использует модель rtwdemo_preprocessor_subsys чтобы проиллюстрировать, как представлять варианты выбора внутри блоков Variant Subsystem. Для других способов представления вариантов смотрите Опции для представления вариантов в 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. Нелинейные подсистемы контроллера реализуют гистерезис, в то время как подсистемы линейного контроллера действуют как простые низкочастотные фильтры.

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

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

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

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

    Совет

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

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

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

Управление вариантом является логическим выражением, которое активирует выбор определенного варианта, когда он вычисляет, чтобы 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. Параметр объектов».

Шаг 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. В диалоговом окне Параметров конфигурации очистите Ignore custom storage classes и нажатие кнопки Apply.

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

  6. Установите параметр Variant activation time равным code compile.

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

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

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

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

  1. На C Code вкладке панели инструментов выберите 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™ блоки

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

Похожие примеры

Подробнее о