exponenta event banner

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

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

Пример модели

Модель slexVariantSymbolicDims содержит исполнительную подсистему, состоящую из дочерних подсистем Subsystem и Subsystem1. Когда переменная управления исполнениями Var имеет значение 1, Subsystem является активным вариантом. Когда Var имеет значение 2, Subsystem1 является активным вариантом.

Моделирование модели

Для формирования кода с предпроцессорными условиями размеры выходного сигнала дочерних подсистем должны быть одинаковыми при моделировании. В этом примере дважды щелкните подсистему. Activate Variant Choice изменяет активный вариант и размер выходного сигнала. Когда Var равняется 1, размер выходного сигнала каждой дочерней подсистемы 5. Когда Var равняется 2, размер выходного сигнала каждой дочерней подсистемы 6.

  1. Открыть пример модели slexVariantSymbolicDims.

  2. На вкладке «Отладка» выберите «Информационные наложения» > «Размеры сигнала».

  3. Откройте диалоговое окно «Параметры блока подсистемы исполнения». Параметр Variant activation time имеет значение code compile.

  4. Открытый Subsystem. В диалоговом окне «Параметры постоянного блока» значением параметра «Постоянное значение» является P1.

  5. Открытый Subsystem1. В диалоговом окне «Параметры постоянного блока» значением параметра «Постоянное значение» является P2.

  6. Откройте основное рабочее пространство. Simulink.Parameters P1 и P2 массивы с размерами '[1,A]'. Simulink.Parameter A имеет значение 5. Var имеет значение 1.

  7. Моделирование модели. Subsystem - активный вариант с размерностью выходного сигнала 5.

  8. Дважды щелкните маскированную подсистему ActivateVariant.

  9. В базовом рабочем пространстве Var имеет значение 2. P1 и P2 имеют размерность 6. A имеет значение 6.

  10. Моделирование модели. Subsystem1 - активный вариант с размерностью выходного сигнала 6.

В базовом рабочем пространстве A имеет класс Storage, равный ImportedDefine(Custom). Использование Simulink.Parameter объект для спецификации измерения должен иметь один из следующих классов хранения:

  • Define или ImportedDefine с указанным заголовочным файлом

  • CompilerFlag

  • Пользовательский пользовательский класс хранения, определяющий данные как макрос в указанном файле заголовка

В базовом рабочем пространстве P1 и P2 имеют класс хранения ImportedExtern. A Simulink.Parameter объект, использующий Simulink.Parameter для спецификации символьного размера должен иметь класс хранения ImportedExtern или ImportedExternPointerили класс хранения со свойством инициализации данных, равным None.

Создать код

  1. Открыть файл заголовка slexVariantSymbolicDims_variant_defines.h. Определение A зависит от значения Var.

    /* Copyright 2016 The MathWorks, Inc. */
    // To select variant choice during compile, define Var at compile time, 
    
    #ifndef Var
    #define Var 1
    #endif
    
    #if Var == 1
    #define A 5
    #elif Var == 2
    #define A 6
    #else
    #error "Variant control variable, Var, must be defined as 1 or 2"
    #endif

  2. Создать код.

  3. Откройте окно slexVariantSymbolicDims.h файл. Размер выходного размера: A.

    /* External outputs (root outports fed by signals with auto storage) */
    typedef struct {
      int32_T Out1[A];                     /* '<Root>/Out1' */
    } ExternalOutputs_slexVariantSymb;
  4. Откройте окно slexVariantSymbolicDims.c файл. Если Var равняется 1, P1 имеет пять значений. Если Var равняется 2, P2 имеет шесть значений. В диалоговом окне «Параметры конфигурации» на панели «Создание кода» > «Пользовательский код» этот код содержится в параметре «Исходный файл».

    /* user code (top of source file) */
    #if Var == 1
    
    int32_T P1[] = { 5, 5, 5, 5, 5 };
    
    #elif Var == 2
    
    int32_T P2[] = { 6, 6, 6, 6, 6, 6 };
    
    #endif

    Условия препроцессора управляют размером A и какой массив, P1 или P2, активен в сгенерированном коде. Путем изменения значения Var, можно изменить размер A и активный массив.

Связанные темы