Этот пример показывает, как использовать символьные размерности для генерации кода с условиями препроцессора для подсистемы варианта, состоящей из дочерних подсистем с различными размерностями выходного сигнала. Значение переменной управления вариантом определяет выбор активного варианта и размерности выходного сигнала. Изменяя значение переменной управления вариантом, вы изменяете активный вариант и размерности выходного сигнала в сгенерированном коде.
Модель slexVariantSymbolicDims
Содержит Подсистему Вариантов, состоящую из дочерних подсистем Subsystem
и Subsystem1
. Когда переменная управления вариантом Var
имеет значение 1
, Subsystem
является активным вариантом. Когда Var
имеет значение 2
, Subsystem1
является активным вариантом.
Чтобы сгенерировать код с условиями препроцессора, размерности выходного сигнала дочерних подсистем должны быть одинаковыми во время симуляции. В этом примере дважды кликните подсистему Activate Variant Choice
изменяет активный вариант и размерность выходного сигнала. Когда Var
равен 1
размерность выходного сигнала каждой дочерней подсистемы 5
. Когда Var
равен 2
размерность выходного сигнала каждой дочерней подсистемы 6
.
Откройте пример модели slexVariantSymbolicDims
.
На вкладке Debug выберите Information Overlays > Signal Dimensions.
Откройте диалоговое окно Блока Subsystem Параметров исполнения. Параметр Variant activation time установлен в code compile
.
Откройте Subsystem
. В диалоговом окне Constant Параметры Блоков, параметр Constant value P1
.
Откройте Subsystem1
. В диалоговом окне Constant Параметры Блоков, параметр Constant value P2
.
Откройте базовое рабочее пространство. The Simulink.Parameters
P1
и P2
являются массивами с размерностями '[1,A]'
. The 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
. A 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
имеет шесть значений. В диалоговом окне Параметров конфигурации на панели 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
и активный массив.