В этом примере показано, как создать код C, содержащий все активные и неактивные значения параметров исполнения. Значения заключены в предпроцессорные условия #if и #elif и представлены как встроенные или настраиваемые переменные в сгенерированном коде.
Параметры варианта могут иметь несколько значений. Каждое значение параметра variant связано с выражением условия variant. Во время моделирования значение параметра исполнения, связанного с условием, которое вычисляется как 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 встраиваются как макросы. Значения параметров «Table data» и «Breakpoint set» представлены символьными именами в виде настраиваемых переменных в сгенерированном коде.
1. На панели инструментов Simulink ® нажмите «Выполнить». Во время моделирования ,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 присваиваются объектам переменных вариантов, а затем эти значения присваиваются параметрам вариантов с использованием этих объектов.
Прежде чем создавать код из модели, необходимо убедиться в наличии разрешения на запись в текущей папке. Чтобы создать код, в галерее «Приложения» панели инструментов модели щелкните Кодер Simulink. На вкладке C Code щелкните Build. Дополнительные сведения см. в разделе Создание кода с помощью Simulink ® Coder™ (Simulink Coder).
1. На вкладке Код C выберите Открыть отчет.
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В этом файле условно компилируются вызовы ступенчатой функции каждого варианта. В пошаговой функции для формирования уравнения используются макросы и имена символов параметров вариантов.
/* 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);
}