Этот пример показывает вам, как сгенерировать код с 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
проверки оператора в наименьшем количестве одного варианта активны для таких различных блоков. Если Позволяют нулевое активное различное управление, выбран, оно генерирует код, чтобы гарантировать, что у вас не может быть больше чем одного активного варианта.