В этом примере показано, как использовать символьные размерности, чтобы сгенерировать код с условными выражениями препроцессора для различной подсистемы, состоящей из дочерних подсистем различных размерностей выходного сигнала. Значение различной контрольной переменной определяет активный вариант и размерности выходного сигнала. Путем изменения значения различной контрольной переменной вы изменяете активный вариант и размерности выходного сигнала в сгенерированном коде.
Модель 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
.
Откройте базовое рабочее пространство. Simulink.Parameters
P1
и P2
массивы с размерностями '[1,A]'
. Simulink.Parameter
A
имеет значение 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
и активный массив.