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

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

Для блока 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')

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

slbuild('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 6.7159s

Сгенерированный файл 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;

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

Похожие темы