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

Чтобы сгенерировать код с условными выражениями препроцессора, размерности выходного сигнала дочерних подсистем должны быть тем же самым во время симуляции. В этом примере дважды кликая подсистему Activate Variant Choice изменяет активный вариант и размерность выходного сигнала. Когда Var равняется 1, размерностью выходного сигнала каждой дочерней подсистемы является 5. Когда Var равняется 2, размерностью выходного сигнала каждой дочерней подсистемы является 6.
Откройте модель slexVariantSymbolicDims в качестве примера.
Из меню Display> Signals & Ports выберите Signal Dimensions.
Откройте диалоговое окно Variant Subsystem Block Parameters. Параметр Analyze all choices during update diagram and generate preprocessor conditionals выбран.
Открытый Subsystem. В диалоговом окне Constant Block Parameters параметром Constant value является P1.
Открытый Subsystem1. В диалоговом окне Constant Block Parameters параметром Constant value является P2.
Откройте базовое рабочее пространство.
P1 Simulink.Parameters и P2 являются массивами с размерностями '[1,A]'.
A Simulink.Parameter имеет значение 5. Var имеет значение 1.
Моделируйте модель. Subsystem является активным вариантом с размерностью выходного сигнала 5.
Дважды кликните подсистему маскированную ActivateVariant.
В базовом рабочем пространстве Var имеет значение 2. P1 и P2 имеют размерность 6. A имеет значение 6.
Моделируйте модель. Subsystem1 является активным вариантом с размерностью выходного сигнала 6.
В базовом рабочем пространстве A имеет Storage class ImportedDefine(Custom). Чтобы использовать объект Simulink.Parameter для спецификации размерности, это должно иметь один из этих классов памяти:
Define или ImportedDefine с заданным заголовочным файлом
CompilerFlag
Пользовательский пользовательский класс памяти, который задает данные как макрос в заданном заголовочном файле
В базовом рабочем пространстве P1 и P2 имеют класс памяти ImportedExtern. Объект Simulink.Parameter, который использует Simulink.Parameter для символьной спецификации размерности, должен иметь класс памяти или ImportedExtern или ImportedExternPointer.
Откройте заголовочный файл 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
Сгенерируйте код.
Откройте файл slexVariantSymbolicDims.h. Выходным размером размерности является A.
/* External outputs (root outports fed by signals with auto storage) */
typedef struct {
int32_T Out1[A]; /* '<Root>/Out1' */
} ExternalOutputs_slexVariantSymb;Откройте файл 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 и активного массива.