Сгенерируйте предварительные условия для всех значений параметров варианта

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

Сгенерируйте Inline и настраиваемый код с помощью Simulink ® Coder™

Прежде чем вы сгенерируете код из модели, необходимо сначала убедиться, что у вас есть разрешение на запись в текущую папку. Чтобы сгенерировать код, в галерее 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);
}

См. также