В этом примере показано, как сгенерировать код С, который содержит все активные и неактивные значения параметров варианта. Значения заключаются в предварительные условия процессора #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);
}