exponenta event banner

Создание кода для блоков вариантов

Генератор кода создает код из модели Simulink ®, содержащей один или несколько блоков Variant Subsystem, Variant Source и Variant Sink. Сведения о создании модели, содержащей блоки исполнения, см. в разделе Создание простой модели исполнения. Сведения о том, как создать пользовательскую проверку помощника по модели, которая вычисляет созданный код из активных и неактивных путей исполнения в исполнительной системной модели, см. в разделе Создание пользовательской проверки для вычисления активных и неактивных путей исполнения из модели (Simulink Check ).

Примечание

Во время генерации кода может отображаться предупреждение, связанное с «упаковкой функции генерации кода» для блока «Вариант». В диалоговом окне параметров блока «Вариант» нажмите «Создание кода» и выберите Reusable function из выпадающего списка Function packaging для решения этой проблемы.

Код создается для различных вариантов, активного варианта и варианта по умолчанию. Чтобы создать код для исполнений, установите следующие условия в блоке «Variant Subsystem», «Variant Source» или «Variant Sink»:

  • Выбрать Expression в качестве режима управления «Вариант».

  • Выбрать code compile в качестве времени активации варианта.

Код, генерируемый для блоков подсистемы вариантов, окружен условиями препроцессора C #if, #else, #elif, и #endif. Код, сгенерированный для блоков источника исполнения и получателя исполнения, окружен условиями препроцессора C #if и #endif. Поэтому активный вариант выбирается во время компиляции, и условия препроцессора определяют, какие разделы кода должны выполняться.

Чтобы создать исполнительные модели и создать директивы препроцессора в сгенерированном коде, см. пример Использование исполнительных моделей для создания кода, использующего условия препроцессора C.

Сведения о построении исполнительных подсистем и генерации директив препроцессора в сгенерированном коде см. в примере Использование исполнительной подсистемы для генерации кода, использующего условия препроцессора C.

Чтобы создать модели с источниками и приемниками вариантов и создать директивы препроцессора в сгенерированном коде, см. пример «Представление источников вариантов и блоков приемников в сгенерированном коде».

Ограничения на создание кода вариационной подсистемы

Для создания условий препроцессора типы блоков, которые можно разместить в дочерних подсистемах блока Variant Subsystem, ограничены. Соединения не разрешены в блок-схеме вариационной подсистемы. Однако в процессе генерации кода один VariantMerge блок размещается на входе каждого блока Outport в пределах блок-схемы Variant Subsystem. Все дочерние подсистемы подключаются к каждой из VariantMerge блоки.

На рисунке ниже процесс создания кода устанавливает следующие соединения и добавляет VariantMerge блоки для sldemo_variant_subsystems модели.

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

Дочерние подсистемы блока Variant Subsystem должны быть атомарными подсистемами. Чтобы сделать подсистемы атомарными, в диалоговом окне «Параметры блока подсистемы» выберите «Обработать как параметр атомарной единицы». VariantMerge блоки вставляются на выходе подсистем при наличии нескольких дочерних подсистем. Если исходный блок VariantMerge блок ввода не является виртуальным, во время генерации кода отображается сообщение об ошибке. Необходимо сделать исходный блок смежным, вставив блоки преобразования сигналов в варианты выбора. Сигналы, поступающие в блок подсистемы вариантов, должны иметь одинаковые свойства сигнала (например, размеры сигнала, ширина порта и класс хранения). VariantMerge блок не поддерживает различные свойства сигнала, поскольку входные и выходные порты имеют одну и ту же память. Символьные размеры можно использовать для создания кода для вариационной подсистемы с дочерними подсистемами различных размеров выходного сигнала.

Сгенерированные компоненты кода не скомпилированы условно

Следующие компоненты не компилируются условно, даже если на них ссылается только код для вариационных подсистем или моделей, которые компилируются условно.

  • rtModel поля структуры данных

  • #includeфайлы утилит

  • Поля структуры глобальных постоянных параметров, на которые ссылается несколько подсистем, активированных различными вариантами

  • Параметры, настроенные для использования импортированного, экспортированного или пользовательского класса хранения для генерации кода, на которые ссылаются несколько подсистем, активированных различными вариантами

  • Параметры, настроенные для использования импортированного, экспортированного или пользовательского класса хранения генерации кода и используемые блоками модели исполнения

Создание кода для блоков вариантов с одним выбором вариантов

Для моделирования образцов, в которых корневой блок Inport соединяется с блоком Variant с одним вариантом, Simulink вставляет скрытую комбинацию блоков Ground, Signal Conversion и Variant Merge. Если вариант выбора имеет значение false, эта комбинация блоков выдает 0.0.

Например, модель Varianttoground содержит блок источника варианта с одним вариантом. При управлении вариантами SYSCONST_A==6 имеет значение true, вход в Subsystem - синусоидальная волна. Когда SYSCONST_A==6 имеет значение false, вход в Subsystem является 0.0.

varianttoground.c файл содержит следующий код:

* Sin: '<Root>/Sine Wave' incorporates:
   *  SignalConversion generated from: '<Root>/Subsystem'
   */
#if SYSCONST_A == 6

  Varianttoground_B.VM_Conditional_Signal_Subsystem_0 = sin
    (Varianttoground_M->Timing.t[0]);

#else

  /* SignalConversion generated from: '<Root>/Subsystem' */
  Varianttoground_B.VM_Conditional_Signal_Subsystem_0 = 0.0;

#endif

  /* End of Sin: '<Root>/Sine Wave' */

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

Глобальная защита данных: сигналы и состояния

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

Рассмотрим модель, содержащую блок «Источник исполнения». Блок источника варианта имеет условия V==1 и V==2.

В сгенерированном коде глобальные сигналы охраняются в объявлении, инициализации модели и определении данных, как показано ниже.

Защита сигналов:

Декларация:

/* Exported block signals */
#if V == 1 || V == 2

real_T myOutput;                       /* '<Root>/Gain3' */

#endif

Инициализация модели:

  /* exported global signals */
#if V == 1 || V == 2

  myOutput = 0.0;

#endif

Определение данных:

 * Exported Global Signals
 *
 * Note: Exported global signals are block signals with an exported global
 * storage class designation.  Code generation will declare the memory for
 * these signals and export their symbols.
 *
 */
#if V == 1 || V == 2

extern real_T myOutput;                /* '<Root>/Gain3' */

#endif

Глобальная защита данных: Параметры

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

Рассмотрим модель с блоком «Константа», присоединенным к блоку «Источник исполнения».

В сгенерированном коде параметр блока Константа охраняется в файле заголовка, как показано ниже.

/* Exported data definition */
/* Const memory section */
/* Definition for custom storage class: Const */
#if V == 2

const int32_T Parameter2 = 1;

#endif

Защита заголовков эталонных моделей

Если модель имеет блоки ссылки на модель, которые являются условными из-за встроенных вариантов, файл заголовка и экземпляры, ссылающиеся на блоки ссылки на модель, охраняются.

Рассмотрим эту модель с двумя блоками Привязки модели (Model References), которые являются условными из-за встроенных вариантов.

При создании кода для этой модели файл заголовка и экземпляры, ссылающиеся на блоки ссылки на модель, охраняются, как показано в коде ниже.

#include "mWithTwoModelBlocks_Top_types.h"
#include "multiword_types.h"

#if (A == 1) //Guarding 
#define mWithTwoModelBlocks_Ref2_MDLREF_HIDE_CHILD_
#include "mWithTwoModelBlocks_Ref2.h"
#endif

#if (B == 1) //Guarding
#include "mWithTwoModelBlocks_Ref1.h"
#endif