Сгенерируйте код от различных блоков со временем активации запуска

Этот пример показывает вам, как сгенерировать код с startup различное время активации. Сгенерированный код содержит все варианты с регулярным if операторы.

Модель

Откройте модель slexVariantSourceAndSinkWithStartup.slx. Variant Source1 имеет условия X==1 и X==2 для его входных портов. Блок под названием Variant Source1 имеет update diagram время активации. X различная контрольная переменная и задана в PostLoadFcn из Файла-> Свойства Модели-> Коллбэки. Sine3 блок активен когда X==1 верно, и Sine4 блок активен когда X==2 верно.

В блоке под названием Variant Source2 блокируйтесь, первый входной порт активен когда V==1 верно. Второй входной порт активен когда V==2 верно. Variant Source2 имеет startup время активации.

Блок под названием Variant Sink имеет условия W==1 и W==2 на его выходных портах. Эти условия распространены со связанными блоками. Gain5 блок присвоен условие W==1.The второй выходной порт Variant Sink блок имеет условие W==2. Это условие распространено к Out4 блок. Если вы выбираете нуль Allow, активный вариант управляет на Variant Sink блокируйтесь, затем Sine5 и Gain4 блоки будут присвоены различное условие W==1|W==2.

open_system('slexVariantSourceAndSinkWithStartup.slx');

Сгенерируйте код

Можно сгенерировать код путем нажатия на Build ERT или Build GRT. Встроенный вариант блокирует Variant Source2 и Variant Sink используйте различное выражение условия параметрами V и W. Эти параметры имеют 'ExportedGlobal' спецификация класса памяти. Когда вы задаете выражение условия, чтобы определить активный выбор, каждой различной контрольной переменной выражения сопоставили класс памяти с ним. При помощи классов памяти можно управлять внешним видом и размещением различных контрольных переменных в сгенерированном коде. Классы памяти также предотвращают оптимизацию, такую как устранение устройства хранения данных для различных контрольных переменных в сгенерированном коде. Переменные, используемые в различных выражениях условия, должны удовлетворить определенным критериям, чтобы сгенерировать код с Simulink Coder или Embedded Coder. Для получения дополнительной информации о технических требованиях класса памяти с startup время активации, смотрите Классы памяти в течение Различных Различных Времен Активации.

Начиная с Variant Source2 и Variant Sink блоки имеют startup время активации, весь выбор доступен, и сгенерированный код от Embedded Coder (ERT), или Simulink Coder (GRT) будет иметь регулярный if условия.

Код, сгенерированный с Embedded Coder, запускает выбранный вариант.

  if(V == 2) {
      rtb_Gain5 = sin((real_T)slexVariantSourceAndSinkWith_DW.counter * 2.0 *
                   3.1415926535897931 / 10.0);
      rtb_Gain4 = sin((real_T)slexVariantSourceAndSinkWith_DW.counter_h * 2.0 *
                   3.1415926535897931 / 10.0);
      rtb_Sine6 = rtb_Gain5 + rtb_Gain4;
    } else if(V == 1) {
       /* Sin: '<Root>/Sine1' */
       rtb_Sine6 = sin((real_T)slexVariantSourceAndSinkWith_DW.counter_c * 2.0 *
                   3.1415926535897931 / 10.0);
    }
  if((V == 1) || (V == 2)) {
      slexVariantSourceAndSinkWithS_Y.Out1 = 3.0 * rtb_Sine6;
    }

Можно выбрать активный различный пользовательский код использования через System Initiliaze блок. Изменить значение V и W использование пользовательского кода, перейдите к Настройкам Модели> Генерация кода> Пользовательский код. Задайте #include "ReadVarControl.h" под Заголовочным файлом и ReadVarControl.c под Исходным файлом.

Исходный файл ReadVarControl.c должен содержать некоторый код, чтобы считать значение V или W на основе требования и установленный активные различные значения.

  #include "rtwtypes.h"
  extern int32_T V;
  extern int32_T W;
  void SetValueOfVarControls()
  {
    // The values of V and W can be read from a sensor or hardware
    // for simplicity it is hardcoded.
    V = 2;
    W = 2;
  }

В модели инициализируют функцию, можно найти код, который устанавливает значения для желаемого V и W, как показано ниже.

  void slexVarinatSourceAndSinkWithStartup_initialize(void)
  {
    SetValueOfVarControls();
    utAssert((W == 1) + (W == 2) == 1);
    utAssert((V == 1) + (V == 2) <= 1);
  }

Примечание-

1 модель инициализирует функции, не охраняются в сгенерированном коде.

2 SetUpRuntimeResourcesзапуск, и Initialize методы блоков называются независимо от активации варианта запуска. Методы не охраняют условно в генерации кода.

3 Параметра, используемые в качестве различных контрольных переменных в активации запуска, не появятся в сгенерированном CAPI или ASAP2 интерфейсы.

Если модель инициализируется, значения V и W не изменяйтесь в методе шага. Если у вас есть требование, чтобы гарантировать, что значение различного управления не изменяется на шаге, то необходимо добавить проверку в сгенерированный код, чтобы гарантировать, что различное значение управления не изменяется на шаге.

utAssert операторы в модели инициализируют функцию, гарантируют, что поведение сгенерированного кода для различных блоков соответствует с симуляцией. Например, utAssert((V == 1) + (V == 2) <= 1) гарантирует, что у вас не может быть больше чем одного активного варианта для Variant Source2.

Если Позволяют нулевое активное различное управление, не выбран, utAssert проверки оператора в наименьшем количестве одного варианта активны для таких различных блоков. Если Позволяют нулевое активное различное управление, выбран, оно генерирует код, чтобы гарантировать, что у вас не может быть больше чем одного активного варианта.