exponenta event banner

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

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

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

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

Создание модели ex_switch_waveform.

open_system('ex_switch_waveform')

В блоке Генератор сигналов сконфигурируйте этот сигнал:

square(amp,10,0,dutyCycle)

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

amp = 2.71;
dutyCycle = 50;

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

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

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 оператор для определения значения активной формы сигнала, а затем вычисляет значение блока исходящего сигнала корневого уровня, 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;

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

Связанные темы