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

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

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

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

Моделируйте модель

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

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

  2. На вкладке Debug выберите Information Overlays > Signal Dimensions.

  3. Откройте диалоговое окно Блока Subsystem Параметров исполнения. Параметр Variant activation time установлен в code compile.

  4. Откройте Subsystem. В диалоговом окне Constant Параметры Блоков, параметр Constant value P1.

  5. Откройте Subsystem1. В диалоговом окне Constant Параметры Блоков, параметр Constant value P2.

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

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

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

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

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

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

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

  • CompilerFlag

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

В базовом рабочем пространстве P1 и P2 иметь класс памяти ImportedExtern. A Simulink.Parameter объект, который использует Simulink.Parameter для спецификации символьных размерностей должен иметь класс памяти любого из ImportedExtern или ImportedExternPointer, или класс памяти с Data initialization набора свойств для 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 имеет шесть значений. В диалоговом окне Параметров конфигурации на панели Code Generation > Custom Code параметр Source file содержит этот код.

    /* 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 и активный массив.

Похожие темы