exponenta event banner

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

В этом примере показано, как создать код 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 ® Coder™

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

См. также