Этот пример показывает, как использовать символьные размерности, чтобы сгенерировать код с условными выражениями препроцессора для различной подсистемы, состоящей из дочерних подсистем различных размерностей выходного сигнала. Значение различной контрольной переменной определяет активный вариант и размерности выходного сигнала. Путем изменения значения различной контрольной переменной вы изменяете активный вариант и размерности выходного сигнала в сгенерированном коде.
Модель 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
и активного массива.