В этом примере показано, как сгенерировать код С, который содержит все активные и неактивные значения параметров варианта. Значения заключаются в предварительные условия процессора #if
и #elif
и представлены как встроенные или настраиваемые переменные в сгенерированном коде.
Параметры варианта могут иметь несколько значений. Каждое значение параметра варианта связано с выражением условия варианта. Во время симуляции значение параметра варианта сопоставлено с условием, которое вычисляется как true
- активное значение этого параметра. Значение, сопоставленное с условием, которое вычисляется как false
- неактивное значение этого параметра варианта. Для получения дополнительной информации смотрите Использование параметров варианта для повторного использования параметров блоков с различными значениями.
В сгенерированном коде значения параметров варианта заключаются в предварительные условия процессора #if
и #elif
и представлены как встроенные или настраиваемые переменные. Представление определяется классом памяти, который вы задаете для параметров варианта в модели. Параметры варианта с классом памяти по умолчанию Auto
представлены как встроенные переменные. Параметры варианта с классом памяти, отличным от Auto
представлены как настраиваемые переменные в сгенерированном коде. Для получения дополнительной информации о том, как различные классы памяти представлены в сгенерированном коде, смотрите Выбор класса памяти для управления представлением данных в сгенерированном коде (Simulink Coder).
Прежде чем вы начнете этот пример, мы рекомендуем вам заполнить опции, чтобы представлять параметры варианта в Сгенерированном коде (Embedded Coder).
1. Откройте модель.
open_system([matlabroot '/examples/simulink_variants/main/slexVariantParametersCC'])
Модель содержит блоки, которые имеют варианты параметров, которые заданы как Simulink.VariantVariable
объекты. Объекты определены в slexVariantParameterCCData.m
файл.
Константа: Постоянные параметры блоков Константа являются параметрами варианта. Параметры заданы как объекты переменных вариантов MAX_LIFT
и SLIDER_POS
.
Данные таблицы и наборы точек по оси Х: Наборы данных таблицы и точек по оси Х блоков интерполяционной таблицы n-D являются параметрами варианта. Параметры заданы как объекты переменных вариантов T1Break1
, T1Data
, T2Break
, и T2Data
.
2. Откройте slexVariantParameterData.m
. Наблюдайте за этими настройками в файле:
В этом файле VCtrl
является Simulink.VariantControl
объект, который определяет активное значение объектов параметров варианта MAX_LIFT
, SLIDER_POS
, T1Break1
, T1Data
, T2Break
, и T2Data
. Значение VCtrl
установлено в 1
, и время его активации задается как code compile
. Во время симуляции условие VCtrl==1
вычисляет, чтобы true
. Все значения, связанные с VCtrl==1
стать активным, и значения, связанные с VCtrl==2
стать неактивным. Когда вы генерируете код из этой модели, все активные и неактивные значения заключаются в предварительные условия процессора #if
и #elif
.
Объекты параметров варианта MAX_LIFT
и SLIDER_POS
иметь скалярные числовые значения с классом памяти по умолчанию Auto
. Объекты параметров варианта T1Break1
, T1Data
, T2Break
, и T2Data
имеют Simulink.Parameter
тип с классом памяти, заданным как ExportedGlobal
. Когда вы генерируете код, значения параметров Constant inlined как макросы. Значения параметров данные и Breakpoint sets представлены символьными именами как настраиваемые переменные в сгенерированном коде.
1. На панели инструментов Simulink ® нажмите Run. Во время симуляции VCtrl==1
вычисляет, чтобы true
. Все значения, связанные с VCtrl==1
присваиваются соответствующим объектам переменной исполнения и, впоследствии, параметрам варианта, которые используют эти объекты. Для примера, когда VCtrl==1
вычисляет, чтобы true
, значение MAX_LIFT
установлено в 10
. Как параметр Constant Constant1
для блока задано значение MAX_LIFT
значение параметра Constant также установлено в 10
.
2. Чтобы изменить активные значения, измените значение VCtrl
на 2
, затем снова симулируйте модель.
VCtrl.Value = 2;
Во время симуляции все значения, связанные с VCtrl==2
присваиваются объектам переменной исполнения, и эти значения затем присваиваются параметрам варианта с помощью этих объектов.
Прежде чем вы сгенерируете код из модели, необходимо сначала убедиться, что у вас есть разрешение на запись в текущую папку. Чтобы сгенерировать код, в галерее Apps панели инструментов модели, нажмите Simulink Coder. На вкладке C Code нажмите Build. Для получения дополнительной информации смотрите Сгенерировать код используя Simulink ® Coder™ (Simulink Coder).
1. На вкладке Кода С выберите Открыть отчет.
2. Выберите slexVariantParameters_types.h
файл из панели Сгенерированный код отчета. Этот файл определяет значение переменной управления вариантом VCtrl
как 1
. Переменная управления вариантом определяет активное значение параметров варианта.
#ifndef VCtrl #define VCtrl 1 #endif
3. Выберите файл slexVariantParameters_private.h. Этот файл включает макросы (#define
), соответствующий всем значениям параметров варианта с классом памяти по умолчанию Auto
. Активные значения параметров варианта MAX_LIFT
и SLIDER_POS
заключаются в условный оператор препроцессора C (#if
) на макросах rtCP_Constant_MAX_LIFT
и rtCP_Constant1_SLIDER_POS
.
#if VCtrl == 1 || VCtrl == 2 /* Variable: MAX_LIFT * Referenced by: '<Root>/Constant' */ #if VCtrl == 1 #define rtCP_Constant_MAX_LIFT (10.0) #elif VCtrl == 2 #define rtCP_Constant_MAX_LIFT (20.0) #endif #endif
#if VCtrl == 1 || VCtrl == 2 /* Variable: SLIDER_POS * Referenced by: '<Root>/Constant1' */ #if VCtrl == 1 #define rtCP_Constant1_SLIDER_POS (0.0) #elif VCtrl == 2 #define rtCP_Constant1_SLIDER_POS (0.5) #endif #endif
4. Выберите slexVariantParameters.c
файл. Этот файл включает символьные имена для всех значений параметров варианта с классом памяти, установленным на ExportGlobal
. Все значения параметров варианта заключаются в условные операторы препроцессора C #if
и #elif
.
/* Exported block parameters */
#if VCtrl == 1 || VCtrl == 2 #if VCtrl == 1 real_T T1Break[11] = { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 } ; /* Variable: T1Break * Referenced by: '<Root>/1D Lookup' */
#elif VCtrl == 2 real_T T1Break[11] = { -10.0, -8.0, -6.0, -4.0, -2.0, 0.0, 2.0, 4.0, 6.0, 8.0, 10.0 } ; /* Variable: T1Break * Referenced by: '<Root>/1D Lookup' */
#endif #endif
#if VCtrl == 1 || VCtrl == 2 #if VCtrl == 1 real_T T1Data[11] = { -1.0, -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99, 1.0 } ; /* Variable: T1Data * Referenced by: '<Root>/1D Lookup' */ #elif VCtrl == 2 real_T T1Data[11] = { -2.0, -1.98, -1.96, -1.92, -1.52, 0.0, 1.52, 1.92, 1.96, 1.98, 2.0 } ; /* Variable: T1Data * Referenced by: '<Root>/1D Lookup' */ #endif #endif
#if VCtrl == 1 || VCtrl == 2 #if VCtrl == 1 real_T T2Break[3] = { -10.0, 0.0, 10.0 } ;/* Variable: T2Break * Referenced by: '<Root>/2D Lookup' */ #elif VCtrl == 2 real_T T2Break[3] = { -20.0, 0.0, 20.0 } ;/* Variable: T2Break * Referenced by: '<Root>/2D Lookup' */ #endif #endif
#if VCtrl == 1 || VCtrl == 2 #if VCtrl == 1 real_T T2Data[9] = { 4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0 } ;/* Variable: T2Data
* Referenced by: '<Root>/2D Lookup' */ #elif VCtrl == 2 real_T T2Data[9] = { 8.0, 32.0, 20.0, 10.0, 38.0, 36.0, 12.0, 40.0, 46.0 } ;/* Variable: T2Data
* Referenced by: '<Root>/2D Lookup' */ #endif #endif
В этом файле вызовы функции шага каждого варианта компилируются по условию. В функции step для формирования уравнения используются макросы и имена символов параметров варианта.
/* Model step function */
void slexVariantParameters_step(void) { slexVariantParameters_Y.Out1 = 2.0 * slexVariantParameters_U.In1 + -2.0 * look2_binlx(rtCP_Constant_MAX_LIFT, look1_binlx(rtCP_Constant1_SLIDER_POS, T1Break, T1Data, 10U), T2Break, T2Break, T2Data, slexVariantParameters_ConstP.uDLookup_maxIndex, 3U); }