exponenta event banner

Опции для представления параметров исполнения в сгенерированном коде

Код можно создать только для активных значений или для активных и неактивных значений параметров исполнения в Simulink ®. Значения параметров вариантов можно также представить в виде встроенных переменных или настраиваемых переменных в сгенерированном коде.

Примечание

Чтобы создать код только для активных значений параметров исполнения, необходимо установить Simulink Coder™. Чтобы создать код для активных и неактивных значений параметров варианта, необходимо установить Embedded Coder ®.

Обзор параметров вариантов

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

Выбор значений в сгенерированном коде

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

При указании времени активации варианта как:

  • update diagram - Simulink устанавливает активные значения параметров вариантов во время диаграммы обновления перед распространением атрибутов сигнала. Неактивные варианты удаляются до распространения атрибутов сигнала. Атрибуты сигнала, такие как измерение и тип данных, не анализируются на предмет согласованности в модели. Созданный код содержит только активное значение параметров варианта.

  • update diagram analyze all choices- Simulink устанавливает активные значения параметров вариантов во время диаграммы обновления после распространения атрибутов сигнала. Атрибуты сигнала распространяются как на активные, так и на неактивные значения. Атрибуты сигнала, такие как измерение и тип данных, анализируются на предмет согласованности в модели. Созданный код содержит только активное значение параметров варианта.

  • code compile - Simulink задает активный выбор во время компиляции кода. Атрибуты сигнала распространяются как на активные, так и на неактивные значения. Атрибуты сигнала, такие как измерение и тип данных, анализируются на предмет согласованности в модели. Созданный код содержит как активные, так и неактивные значения параметров варианта. Значения заключены в условные операторы препроцессора C #if и #endif.

Типы переменных в сгенерированном коде

Simulink поддерживает представление значений параметров вариантов в виде встроенных переменных или настраиваемых переменных в сгенерированном коде. Представление значений в коде основано на классе хранения, указанном для параметров варианта.

  • Встроенная переменная: если указан класс хранения параметра варианта как Auto, который является классом хранения по умолчанию, и время активации как update diagram или update diagram analyze all choices, затем параметр variant встраивается в литеральное числовое значение параметра в сгенерированном коде. Если указан класс хранения параметра варианта как Auto и время активации как code compileзатем параметр variant встраивается в создаваемый код в виде макросов. Встроенные переменные снижают глобальное использование ОЗУ и повышают эффективность генерируемого кода. Код не выделяет память для представления числовых параметров блока, таких как параметр усиления блока усиления. Вместо этого код привязывается к литеральному числовому значению параметра.

  • Настраиваемый: Если указать класс хранения параметра variant как что-либо, отличное от Autoзатем параметр варианта представляется с использованием символьных имен в сгенерированном коде, как описано в разделе Выбор класса склада для представления контроллинговых данных в сгенерированном коде.

Создание кода C для параметров варианта

В этом примере показано, как создать код C для параметров вариантов. Стиль созданного кода основан на времени активации варианта и классе хранения, указанном для параметров варианта.

Изучение модели

Рассмотрим slexVariantParameters.slx модель.

Variant parameter in a Gain block

Параметры усиления блоков Gain1 и Gain2 являются параметрами вариантов, для которых установлены значения K1 и K2соответственно. Переменная K1 имеет два значения: 3.5 и 8.5. Переменная K2 имеет два значения: 4.5 и 9.5.

Simulink выбирает активные значения K1 и K2 на основе значения переменной управления вариантом V. Если V==1 вычисляется как true, то значение K1 имеет значение 3.5и значение K2 имеет значение 8.5. Если V==2 вычисляется как true, то значение K1 имеет значение 4.5и значение K2 имеет значение 9.5.

Стиль созданного кода основан на времени активации варианта и классе хранения, указанном для параметров варианта. В этом примере для времени активации варианта установлено значение update diagram, и класс хранения устанавливается как Auto. При создании кода из этой модели код генерируется только для активных значений K1 и K2. В созданном коде значения привязываются к литеральному значению параметров.

Создание встроенного и настраиваемого кода с помощью Simulink Coder

Прежде чем создавать код из модели, необходимо убедиться в наличии разрешения на запись в текущей папке.

  1. Подготовьте модель к созданию кода, указав параметры создания кода в диалоговом окне Параметры конфигурации (Configuration Parameters). Выберите соответствующий решатель и цель генерации кода и проверьте конфигурацию модели на эффективность выполнения. Дополнительные сведения о каждом из этих шагов см. в разделе Создание кода с помощью Simulink ® Coder™.

  2. В галерее «Приложения» панели инструментов модели щелкните Кодер Simulink.

  3. На вкладке C Code нажмите кнопку Build.

    Генератор кода создает папку slexVariantParameters_ert_rtw в текущей рабочей папке и помещает файлы исходного кода в эту папку. Созданный код находится в двух основных файлах: slexVariantParameters.c и slexParameters.h. Файл slexVariantParameters.h содержит значение переменной управления вариантом и файл slexVariantParameters.c содержит значения параметров варианта.

  4. На вкладке Код C выберите Открыть отчет.

  5. Выберите slexVariantParameters.c на панели «Сгенерированный код» отчета. Код генерируется только для активных значений K1 и K2. В созданном коде значения привязываются к литеральному значению параметров.

    mUDInlined_Y.Out1 = 4.5 * mUDInlined_U.In1; 
    mUDInlined_Y.Out2 = 3.5 * mUDInlined_U.In2;
    
  6. В модели измените время активации на code compile и класс хранения для ExportedGlobal, затем снова создайте код. Обратите внимание на изменение стиля созданного кода.

    Код генерируется только для всех активных и неактивных значений K1 и K2. В созданном коде значения представлены с использованием символьных имен.

    В этой таблице показаны различия в стиле созданного кода для классов хранения. Auto и ExportedGlobal с различным временем активации.

    Время активацииКласс хранения
    Auto (по умолчанию)ExportGlobal
    update diagram

    Код создается только для активных значений параметров варианта. В созданном коде значения привязываются к литеральному значению параметров.

    Рассмотрим этот фрагмент созданного кода. 4.5 и 3.5 - встроенные активные значения параметров варианта Gain1 и Gain2.

    mUDInlined_Y.Out1 = 4.5 * mUDInlined_U.In1; 
    mUDInlined_Y.Out2 = 3.5 * mUDInlined_U.In2;
    

    Код создается только для активных значений параметров варианта. В созданном коде значения представлены с использованием символьных имен.

    Рассмотрим этот фрагмент созданного кода. Здесь, K1 и K2 - символические имена активных значений параметров исполнения Gain1 и Gain2.

    real_T K1 = 3.5;
    real_T K2 = 4.5;
    …
    …
    mUDInlined_Y.Out1 = K2 * mUDInlined_U.In2; 
    mUDInlined_Y.Out2 = K1 * mUDInlined_U.In1;
    

    update diagram analyze all choices

    Сгенерированный код совпадает с кодом update diagram. Единственное отличие состоит в том, что активное и неактивное значения параметров варианта анализируются для обеспечения согласованности атрибутов сигнала, таких как размерность и тип данных в модели.

    Сгенерированный код совпадает с кодом update diagram. Единственное отличие состоит в том, что активное и неактивное значения параметров варианта анализируются для обеспечения согласованности атрибутов сигнала, таких как размерность и тип данных в модели.

    code compile

    Код генерируется для всех активных и неактивных значений параметров варианта. Все значения анализируются для обеспечения непротиворечивости атрибутов сигнала, таких как размерность и тип данных в модели. В созданном коде значения встраиваются как макросы.

    Рассмотрим этот фрагмент созданного кода. Активные и неактивные значения заключены в условные операторы препроцессора C #if и #endif. rtCP_Gain1_K1 и rtCP_Gain_K2 являются макросами для параметров исполнения Gain1 и Gain2.

    #if V == 1 
    #define rtCP_Gain1_K1     (3.5)
    #elif V == 2
    #define rtCP_Gain1_K1     (8.5) 
    #endif
    
    #if V == 1 
    #define rtCP_Gain_K2      (4.5)
    #elif V == 2
    #define rtCP_Gain_K2      (9.5)
    #endif
    
    mUDInlined_Y.Out1 = rtCP_Gain_K2 * mUDInlined_U.In2;
    mUDInlined_Y.Out2 = rtCP_Gain1_K1 * mUDInlined_U.In1;
    

    Код генерируется для всех активных и неактивных значений параметров варианта. Все значения анализируются для обеспечения непротиворечивости атрибутов сигнала, таких как размерность и тип данных в модели. В созданном коде значения представлены с использованием символьных имен.

    Рассмотрим этот фрагмент созданного кода. Активные и неактивные значения заключены в условные операторы препроцессора C #if и #endif. Здесь, K1 и K2 - символические имена для параметров исполнения Gain1 и Gain2.

    #if V == 1 
    #real_T K1 = 3.5;
    #elif V == 2
    #real_T K1 = 8.5; 
    #endif
    
    #if V == 1 
    #real_T K2 = 4.5;
    #elif V == 2
    #real_T K2 = 9.5;
    #endif
    
    mUDInlined_Y.Out1 = K2 * mUDInlined_U.In2;
    mUDInlined_Y.Out2 = K1 * mUDInlined_U.In1;
    

См. также

|

Связанные темы