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

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

Модель в качестве примера

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

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

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

  1. Откройте модель slexVariantSymbolicDims в качестве примера.

  2. Из меню Display> Signals & Ports выберите Signal Dimensions.

  3. Откройте диалоговое окно Variant Subsystem Block Parameters. Параметр Analyze all choices during update diagram and generate preprocessor conditionals выбран.

  4. Открытый Subsystem. В диалоговом окне Constant Block Parameters параметром Constant value является P1.

  5. Открытый Subsystem1. В диалоговом окне Constant Block Parameters параметром Constant value является P2.

  6. Откройте базовое рабочее пространство. P1 Simulink.Parameters и P2 являются массивами с размерностями '[1,A]'. A Simulink.Parameter имеет значение 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. Объект Simulink.Parameter, который использует Simulink.Parameter для символьной спецификации размерности, должен иметь класс памяти или ImportedExtern или ImportedExternPointer.

Сгенерируйте код

  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 имеет шесть значений. В диалоговом окне Configuration Parameters, на 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 и активного массива.

Похожие темы