Генерация кода для вариантов блоков

Генератор кода производит код из Simulink® модель, содержащая один или несколько блоков Variant Subsystem, Variant Source и Variant Sink. Чтобы узнать, как создать модель, содержащую блоки вариантов, смотрите Создание Простой Модели Варианта. Чтобы узнать, как создать пользовательскую проверку Model Advisor, которая оценивает сгенерированный код из активных и неактивных путей исполнения в вариантной системной модели, смотрите Создание Собственной проверки для оценки Активных и Неактивных Путей Исполнения из Модели (Simulink Check).

Примечание

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

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

  • Выберите Expression как Variant control mode.

  • Выберите code compile как Variant activation time.

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

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

Чтобы создать варианты подсистем и сгенерировать директивы препроцессора в сгенерированном коде, смотрите пример Использовать Варианты Подсистемы для Генерации Кода, который использует C Предварительные Условия.

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

Ограничения на генерацию кода исполнительной подсистемы

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

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

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

Дочерние подсистемы блока Variant Subsystem должны быть атомарными подсистемами. Выберите Treat as atomic unit параметр в диалоговом окне Параметры блока Subsystem, чтобы сделать подсистемы атомарными. The VariantMerge блоки вставляются в выходной порт подсистем, если существует несколько дочерних подсистем. Если исходный блок VariantMerge вход блока является невиртуальным, сообщение об ошибке будет отображаться во время генерации кода. Вы должны сделать исходный блок смежным, путем вставки блоков преобразования сигналов внутрь вариантов выбора. Сигналы, которые входят в блок Variant Subsystem, должны иметь одинаковые свойства сигнала (для примера, размерностей сигнала, ширины порта и класса памяти). The VariantMerge блок не поддерживает различные свойства сигнала, поскольку входные порты и выходные порты имеют одну и ту же память. Можно использовать символические размерности, чтобы сгенерировать код для подсистемы вариантов с дочерними подсистемами различных размерностей выходного сигнала.

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

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

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

  • #includeфайлов утилит

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

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

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

Генерация кода для исполнительных блоков с одним вариантом выбора

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

Для примера, модель Varianttoground содержит исходный блок Variant Source с одним вариантом выбора. Когда Variant Control SYSCONST_A==6 вычисляет значение true, вход в Subsystem является синусоида. Когда SYSCONST_A==6 вычисляет значение false, вход в Subsystem является 0.0.

The 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' */

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

Глобальные данные: сигналы и состояния

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

Рассмотрим модель, содержащую Variant Source блок. Блок Variant Source имеет условия 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

Глобальные данные: Параметры

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

Рассмотрим модель с Constant блоком, присоединенным к исходному блоку Variant Source.

В сгенерированном коде параметр блока Constant защищен в заголовочном файле, как показано ниже.

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

const int32_T Parameter2 = 1;

#endif

Защитные Образцы модели заголовки

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

Рассмотрим эту модель с двумя блоками Модели-ссылки, которые являются условными из-за линейных вариантов.

Когда вы генерируете код для этой модели, заголовочный файл и образцы, ссылающиеся на блоки Model Reference, охраняются, как показано на коде ниже.

#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