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