Переключитесь между Выходными формами волны во время выполнения кода для блока генератора формы волны

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

Для блока Waveform Generator вы не можете сделать параметры формы волны, такие как амплитуда и сдвиг фазы, настраиваемый в сгенерированном коде. Вместо этого можно сгенерировать код, который позволяет вам выбрать активную форму волны из набора вариантов формы волны, которые вы задаете в блоке. Во время подписания кода вы активируете вариант путем корректировки значения глобального поля структуры.

Необходимо установить поведение параметра Значения по умолчанию параметра конфигурации модели на Tunable. Затем по умолчанию параметры блоков в модели кажутся настраиваемыми в сгенерированном коде. Эти параметры могут использовать большие объемы памяти для большой модели.

Создайте модель ex_switch_waveform.

open_system('ex_switch_waveform')

В блоке Waveform Generator сконфигурируйте эту форму волны:

square(amp,10,0,dutyCycle)

В базовом рабочем пространстве создайте переменные amp и dutyCycle.

amp = 2.71;
dutyCycle = 50;

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

Предположим, что во время выполнения вы хотите наблюдать эффекты изменения частоты формы волны от 10 до 15 и сдвига фазы от 0 до 0,5. В блоке Waveform Generator добавьте эти варианты формы волны:

square(amp,10,0.5,dutyCycle)
square(amp,15,0,dutyCycle)
square(amp,15,0.5,dutyCycle)

Установите поведение параметра Значения по умолчанию параметра конфигурации модели на Tunable.

set_param('ex_switch_waveform','DefaultParameterBehavior','Tunable')

Сгенерируйте код из модели.

rtwbuild('ex_switch_waveform')
### Starting build procedure for: ex_switch_waveform
### Successful completion of code generation for: ex_switch_waveform

Build Summary

Top model targets built:

Model               Action          Rebuild Reason                                    
======================================================================================
ex_switch_waveform  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 8.0999s

Сгенерированный файл ex_switch_waveform.h задает стандартный тип структуры, который хранит данные о настраиваемом параметре для модели. Структура содержит поле, значение которого представляет активную форму волны.

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform.h');
rtwdemodbtype(file,'/* Parameters (default storage) */',...
    '/* Real-time Model Data Structure */',1,0)
/* Parameters (default storage) */
struct P_ex_switch_waveform_T_ {
  real_T WaveformGeneratorStimulus_Selec;
                              /* Mask Parameter: WaveformGeneratorStimulus_Selec
                               * Referenced by: '<S1>/Switch'
                               */
  real_T GainControlSystem_Gain;       /* Expression: 3.5
                                        * Referenced by: '<Root>/Gain (Control System)'
                                        */
};

Файл ex_switch_waveform_data.c задает глобальную переменную структуры и инициализирует значение поля к 1. Это значение представляет базовую форму волны.

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform_data.c');
rtwdemodbtype(file,'/* Block parameters (default storage) */','};',1,1)
/* Block parameters (default storage) */
P_ex_switch_waveform_T ex_switch_waveform_P = {
  /* Mask Parameter: WaveformGeneratorStimulus_Selec
   * Referenced by: '<S1>/Switch'
   */
  1.0,

  /* Expression: 3.5
   * Referenced by: '<Root>/Gain (Control System)'
   */
  3.5
};

Файл ex_switch_waveform.c задает функцию выполнения модели. Функция использует switch оператор, чтобы определить значение активной формы волны, и затем вычисляет значение блока Outport корневого уровня, Out1.

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform.c');
rtwdemodbtype(file,'switch ((int32_T)',...
    'ex_switch_waveform_Y.Out1 =',1,1)
  switch ((int32_T)ex_switch_waveform_P.WaveformGeneratorStimulus_Selec) {
   case 1:
    temp = temp - floor(temp) <= 0.5 ? 2.71 : -2.71;
    break;

   case 2:
    temp = temp_0 - floor(temp_0) <= 0.5 ? 2.71 : -2.71;
    break;

   case 3:
    temp = temp_1 - floor(temp_1) <= 0.5 ? 2.71 : -2.71;
    break;

   default:
    temp = temp_2 - floor(temp_2) <= 0.5 ? 2.71 : -2.71;
    break;
  }

  /* End of MultiPortSwitch: '<S1>/MultiportSwitch' */

  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain (Control System)'
   */
  ex_switch_waveform_Y.Out1 = ex_switch_waveform_P.GainControlSystem_Gain * temp;

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

Похожие темы