Сгенерируйте Условные выражения Препроцессора для всех Значений Различных Параметров

В этом примере показано, как сгенерировать код С, который содержит все активные и неактивные значения различных параметров. Значения заключены в условные выражения препроцессора #if и #elif и представлены как встроенные или настраиваемые переменные в сгенерированном коде.

Обзор различных параметров

Различные параметры могут иметь несколько значений. Каждое значение различного параметра сопоставлено с различным выражением условия. В процессе моделирования значение различного параметра сопоставило с условием, которое оценивает к true активное значение того параметра. Значение сопоставило с условием, которое оценивает к false неактивное значение того различного параметра. Для получения дополнительной информации смотрите Параметры Варианта Использования к Параметрам блоков Повторного использования с Различными Значениями.

В сгенерированном коде значения различных параметров заключены в условные выражения препроцессора #if и #elif и представлены как встроенные или настраиваемые переменные. Представление убеждено классом памяти, что вы задаете для различных параметров в модели. Различные параметры с классом памяти по умолчанию Auto представлены как встроенные переменные. Различные параметры с классом памяти кроме Auto представлены как настраиваемые переменные в сгенерированном коде. Для получения дополнительной информации о том, как различные классы памяти представлены в сгенерированном коде, видят, Выбирают Storage Class for Controlling Data Representation in Generated Code (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. Когда вы генерируете код, значения параметров Константа встраиваются как макросы. Значения Табличных данных и Точки останова устанавливают параметры, представлены символьными именами как настраиваемые переменные в сгенерированном коде.

Установите активный выбор различных параметров

1. На панели инструментов Simulink® нажмите Run. В процессе моделирования, VCtrl==1 оценивает к true. Все значения сопоставлены с VCtrl==1 присвоены соответствующим различным переменным объектам и, впоследствии, различным параметрам, которые используют эти объекты. Например, когда VCtrl==1 оценивает к true, значение MAX_LIFT установлен в 10. Как Постоянный параметр Constant1 блок установлен в MAX_LIFT, значение параметра Константа также установлено к 10.

2. Чтобы изменить активные значения, измените значение VCtrl к 2, затем симулируйте модель снова.

VCtrl.Value = 2;

В процессе моделирования все значения сопоставлены с VCtrl==2 присвоены различным переменным объектам, и те значения затем присвоены различным параметрам с помощью тех объектов.

Сгенерируйте встроенный и настраиваемый код Используя Simulink® Coder™

Прежде чем вы сгенерируете код из модели, необходимо сначала гарантировать, что у вас есть разрешение записи в вашей текущей папке. Чтобы сгенерировать код, в галерее Apps панели инструментов модели, нажимают Simulink Coder. На вкладке C Code нажмите Build. Для получения дополнительной информации смотрите, Генерируют Код Используя Simulink® Coder™ (Simulink Coder).

Рассмотрите сгенерированный код

1. Во вкладке C Code выберите Open Report.

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);
}

Смотрите также