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

Чтобы сгенерировать код с условными выражениями препроцессора, размерности выходного сигнала дочерних подсистем должны быть тем же самым в процессе моделирования. В этом примере, дважды кликая подсистему Activate Variant Choice изменяет активный вариант и размерность выходного сигнала. Когда Var равняется 1, размерностью выходного сигнала каждой дочерней подсистемы является 5. Когда Var равняется 2, размерностью выходного сигнала каждой дочерней подсистемы является 6.
Откройте модель slexVariantSymbolicDims в качестве примера.
На вкладке Debug выберите Information Overlays> 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.
Откройте базовое рабочее пространство. Simulink.Parameters
P1 и P2 массивы с размерностями '[1,A]'. Simulink.Parameter
A имеет значение 5var имеет значение 1.
Симулируйте модель. Subsystem активный вариант с размерностью выходного сигнала 5.
Дважды кликните подсистему маскированную ActivateVariant.
В базовом рабочем пространстве, Var имеет значение 2. P1 и P2 имейте размерность 6A имеет значение 6.
Симулируйте модель. Subsystem1 активный вариант с размерностью выходного сигнала 6.
В базовом рабочем пространстве, A имеет Storage class ImportedDefine(Custom). Использовать Simulink.Parameter объект для спецификации размерности, это должно иметь один из этих классов памяти:
Define или ImportedDefine с заданным заголовочным файлом
CompilerFlag
Пользовательский пользовательский класс памяти, который задает данные как макрос в заданном заголовочном файле
В базовом рабочем пространстве, P1 и P2 имейте класс памяти ImportedExtern. Simulink.Parameter возразите, что использует Simulink.Parameter для символьной размерности спецификация должна иметь класс памяти любого ImportedExtern или ImportedExternPointer, или класс памяти с набором свойств Data initialization к None.
Откройте заголовочный файл 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 и активный массив.