Трассировка сигнала Используя инициирование осциллографа

Этот пример показывает, как проследить сигналы с инициированным осциллографом хоста Simulink® Real-Time™ осциллографа. После того, как скрипт создает и загружает модель осциллятора, xpcosc, это добавляет два осциллографа типа 'host' к приложению реального времени. Первый осциллограф сконфигурирован, чтобы включить 'Генератор Сигнала сигнала' (единственный сигнал, добавленный к этому осциллографу). Сигнал 'Integrator1' также добавляется к второму осциллографу. Определите объем 2, сконфигурирован, чтобы быть инициированным первым осциллографом (т.е. он инициирован одновременно, первый осциллограф инициирован). Это синхронизирует осциллографы.

Затем, осциллографы запущены и проверены, чтобы определить, когда сбор данных завершен. Данные из обоих осциллографов затем загружены на компьютер разработчика и отображены на графике. Несмотря на то, что оба осциллографа начинают сбор данных одновременно, Осциллограф 2 получает данные по более длинной записи времени путем увеличения фактора десятикратного уменьшения от 4 до 10. Этот процесс повторяется 25 раз. После каждого пятого выполнения усиление затухания 'Gain1/Gain' установлено в новое случайное значение (между 0 и 2000).

Проверяйте связь между разработкой и целевыми компьютерами

Используйте 'slrtpingtarget', чтобы протестировать связь между разработкой и целевыми компьютерами.

if ~strcmp(slrtpingtarget, 'success')
  error(message('xPCTarget:examples:Connection'));
end

Открытый, сборка и модель загрузки к целевому компьютеру

Откройте модель осциллятора, xpcosc. При настройках опции Simulink Real-Time параметра конфигурации модели системный конечный файл был установлен в slrt.tlc. Следовательно, создавание модели создаст исполняемое изображение, xpcosc.mldatx, который может быть запущен на компьютере, загруженном с Ядром Simulink Real-Time.

open_system(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','xpcosc'));

Создайте модель и загрузите изображение, xpcosc.mldatx, к целевому компьютеру.

  • Сконфигурируйте для немногословной сборки.

  • Сборка и приложение загрузки.

set_param('xpcosc','RTWVerbose','off');
rtwbuild('xpcosc');
### Starting Simulink Real-Time build procedure for model: xpcosc
### Generated code for 'xpcosc' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for model: xpcosc
### Created MLDATX ..\xpcosc.mldatx
### Looking for target: TargetPC1
### Download model onto target: TargetPC1

Запустите модель, рандомизируйте параметр 'усиления', отобразите данные об осциллографе хоста на графике

Этот код выполняет много задач.

Задача 1: создайте целевой объект

Создайте переменную MATLAB®, tg, содержа целевой объект Simulink Real-Time. Этот объект позволяет вам связываться с и управлять целевым компьютером.

  • Создайте целевой объект Simulink Real-Time

  • Установите шаг расчета на 250us

  • Установите время остановки на высокое значение

  • Запустите образцовое выполнение

Задача 2: Создайте, сконфигурируйте, и график к осциллографу хоста во время каждого выполнения.

  • Получите индекс параметра 'Gain1/Gain'

  • Получите индекс сигнала 'Integrator1'

  • Получите индекс 'Генератора Сигнала сигнала'

  • Задайте (добавляет) первый объект scope хоста

  • Задайте (добавляет) второй объект scope хоста

Задача 3: Установите свойства первого объекта scope

  • Добавьте 'Генератор Сигнала', чтобы сигнализировать о списке

  • Определите номер выборок

  • Установите фактор десятикратного уменьшения

  • Установите триггерный режим

  • Установите триггерный сигнал 'Сигнализировать о Генераторе'

  • Установите пороговый уровень

  • Установите триггерный наклон

Задача 4: Установите свойства второго объекта scope

  • Добавьте оба сигнала сигнализировать о списке

  • Определите номер выборок

  • Установите фактор десятикратного уменьшения

  • Установите триггерный режим

  • Установите триггерный осциллограф на первый объект scope

Задача 5: проверяйте на фигуру графика

Фигура графика существует?

  • Если не, создайте фигуру

  • Если да, сделайте его текущей фигурой

Задача 7: Цикл, чтобы получить 25 блоков данных от объекта scope.

  • Измените параметр Gain1/Gain каждый пятый цикл приобретения к случайному значению между 0 и 2000.

  • Запустите второй осциллограф (ожидает, пока не инициировано первым осциллографом),

  • Запустите первый осциллограф

  • Ожидайте объекты until и scope 'закончили' состояние.

Задача 8: определите объем временного вектора отображения объектов

Первый объект scope: создайте временной вектор, загрузите данные об осциллографе и отобразите его.

  • Загрузите временной вектор

  • Загрузите полученные данные и график

Второй объект scope: создайте временной вектор, загрузите данные об осциллографе и отобразите его.

  • Загрузите временной вектор

  • Загрузите полученные данные и график

tg = SimulinkRealTime.target; % create target object
tg.SampleTime = 0.000250;
tg.StopTime   = 10000;
start(tg);
tPar = getparamid(tg, 'Gain1', 'Gain'); % get indexes
signals(1) = getsignalid(tg, 'Integrator1');
signals(2) = getsignalid(tg, 'Signal Generator');
scs    = addscope(tg, 'host'); % add scopes
scs(2) = addscope(tg, 'host');
addsignal(scs(1), signals(2)); % set scope object properties
scs(1).NumSamples    = 200;
scs(1).Decimation    = 4;
scs(1).TriggerMode   = 'Signal';
scs(1).TriggerSignal = signals(2);
scs(1).TriggerLevel  = 0.0;
scs(1).TriggerSlope  = 'Rising';
addsignal(scs(2),signals); % sect scope object properties
scs(2).NumSamples    = 200;
scs(2).Decimation    = 10;
scs(2).TriggerMode   = 'Scope';
scs(2).TriggerScope  = scs(1).ScopeId;
figh = findobj('Name', 'scscopedemo'); % check for plot figure
if isempty(figh)
  figh = figure;
  set(figh, 'Name','scscopedemo','NumberTitle','off');
else
  figure(figh);
end
m = 1; flag = 0; % loop to acquire data
for n = 1 : 25
  if isempty(find(get(0, 'Children') == figh, 1)), flag = 1; break; end
  if ~m
    setparam(tg, tPar, 2*1000*rand);
  end
  m = rem(m + 1, 5);
  scs(2).start;
  scs(1).start;
  while ~strcmpi(scs(1).Status,'finished') || ...
        ~strcmpi(scs(2).Status,'finished')
  end % wait for scope objects to finish
  subplot(2, 1, 1); % first scope object displays time vector
  t1 =  scs(1).Time;
  plot(t1, scs(1).Data, 'g');
  set(gca, 'XLim', [t1(1), t1(end)], 'YLim', [-10, 10]); ylabel('Scope 1');
  title(['scscopedemo: ', num2str(n), ' of 25 data packages']);
  subplot(2,1,2); % second scope object displays time vector
  t2 =  scs(2).Time;
  plot(t2, scs(2).Data);
  set(gca,'XLim',[t2(1),t2(end)],'YLim',[-10,10]);  ylabel('Scope 2');
  drawnow;
end
if ~flag
    subplot(2, 1, 1);
    title('scscopedemo: finished');
end

Остановите и закройте модель

Когда сделано, остановите приложение и закройте модель.

  • Модель Stop

  • Модель Close

stop(tg);
close_system('xpcosc',0);