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

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

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

Модель 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. Откройте базовое рабочее пространство. Simulink.Parameters P1 и P2 массивы с размерностями '[1,A]'. Simulink.Parameter A имеет значение 5var имеет значение 1.

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

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

  9. В базовом рабочем пространстве, Var имеет значение 2. P1 и P2 имейте размерность 6A имеет значение 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 и активный массив.

Похожие темы