Минимизируйте разрывы данных с двумя осциллографами

С двумя осциллографами можно минимизировать перекрытие данных или разрывы. Первый осциллограф получает данные до демонстрационного N, затем останавливается. Второй осциллограф начинает получать данные в демонстрационном N+1.

В этом примере свойство TriggerMode Осциллографа 1 установлено в 'Scope', но это явным образом инициировано с функцией MATLAB® trigger(sc1).

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

Минимизировать разрывы путем получения данных с двумя осциллографами:

  1. Создайте и загрузите модель xpcosc Simulink® на целевой компьютер.

  2. В Окне Команды MATLAB присвойте tg целевому компьютеру и установите свойство StopTime на 10.

    tg = slrt;
    tg.StopTime = 10;
  3. Добавьте вектор двух осциллографов хоста к приложению реального времени. Используйте векторный индекс, чтобы переключиться от одного осциллографа до другого.

    sc = addscope(tg,'host', [1 2]);
  4. Добавьте сигнализирует о 4 и 5 к обоим осциллографам.

    addsignal(sc,[4 5]);
    
  5. Установите свойство NumSamples для обоих осциллографов к 500 и свойство TriggerSample для обоих осциллографов к -1. С этой установкой свойства каждый осциллограф инициировал следующий осциллограф в конце своих 500 демонстрационных приобретений.

    sc(1).NumSamples = 500;
    sc(1).TriggerSample = -1;
    
    sc(2).NumSamples = 500;
    sc(2).TriggerSample = -1;
    
  6. Установите свойство TriggerMode для осциллографов 1 и 2 к 'Scope'. Установите свойство TriggerScope, таким образом, что каждый осциллограф инициировал другой.

    sc(1).TriggerMode = 'Scope';
    sc(1).TriggerScope = 2;
    
    sc(2).TriggerMode = 'Scope';
    sc(2).TriggerScope = 1;
  7. Настройте устройство хранения данных в течение времени, t, и сигнала, приобретения data.

    t = [];
    data = zeros(0, 2);
  8. Запустите оба осциллографа и модель.

    start(sc);
    start(tg);

    Оба осциллографа получают те же сигналы, 4 и 5.

  9. Чтобы начать получать данные, явным образом инициируйте, определяют объем 1.

    scNum = 1;
    trigger(sc(scNum));

    Установка scNum к 1 указывает, что Осциллограф 1 получает данные сначала.

  10. Начните получать данные с помощью двух осциллографов для двойного буфера данные.

    while (1)
    
      % Busy wait until this scope has finished acquiring 500 samples
      % or the model stops (scope is interrupted).
      while ~(strcmp(sc(scNum).Status, 'Finished') || ...
              strcmp(sc(scNum).Status, 'Interrupted')) 
      end
    
      % Stop buffering data when the model stops.
      % Pause to be certain that the status property has been updated.
      
      pause(0.1)
      
      if strcmp(tg.Status, 'stopped')
        break
      end
      
      % Save the data.
      t(   end + 1 : end + 500)    = sc(scNum).Time;
      data(end + 1 : end + 500, :) = sc(scNum).Data;
    
      % Restart this scope.
      start(sc(scNum)); 
    
      % Switch to the next scope.
      if(scNum == 1) scNum = 2;
      else scNum = 1;
      end
      
    end
  11. Когда сделано, удалите осциллографы.

    % Remove the scopes we added.
    remscope(tg,[1 2]);
  12. Отобразите данные на графике.

    plot(t,data); 
    grid on; 
    legend('Signal 4','Signal 5');
    

Следующее является полным листингом кода для предыдущей процедуры сбора данных двойной буферизации. После того, как вы загрузите модель (xpcosc) на целевой компьютер, можно скопировать и вставить этот код в файл MATLAB и запустить его. Связь между разработкой и целевыми компьютерами должна быть достаточно быстрой, чтобы передать целый набор выборок, прежде чем следующий цикл приобретения запустится. Похожим способом можно использовать больше чем два осциллографа, чтобы реализовать тройное - или буферизующая тетраду схема.

% Assumes model xpcosc program text has been
% built and loaded on the target computer.

% Attach to the target computer and set StopTime to 10 sec.
tg = slrt;
tg.StopTime = 10;

% Add two host scopes.
sc = addscope(tg,'host', [1 2]);

% [4 5] are the signals of interest. Add to both scopes.
addsignal(sc,[4 5]);

% Each scope triggers the next scope at end of a 500 sample acquisition.
sc(1).NumSamples = 500;
sc(1).TriggerSample = -1;

sc(2).NumSamples = 500;
sc(2).TriggerSample = -1;

sc(1).TriggerMode = 'Scope';
sc(1).TriggerScope = 2;

sc(2).TriggerMode = 'Scope';
sc(2).TriggerScope = 1;

% Initialize time and data log.
t = [];
data = zeros(0, 2);

% Start the scopes and the model.
start(sc);
start(tg);

% To start the capture, explicitly trigger scope 1.
scNum = 1; 
trigger(sc(scNum)); 

% Use the two scopes as a double buffer to log the data.
while (1)

  % Busy wait until this scope has finished acquiring 500 samples
  % or the model stops (scope is interrupted).
  while ~(strcmp(sc(scNum).Status, 'Finished') || ...
          strcmp(sc(scNum).Status, 'Interrupted')) 
  end

  % Stop buffering data when the model stops.
  % Pause to be certain that the status property has been updated.
  
  pause(0.1)
  
  if strcmp(tg.Status, 'stopped')
    break
  end
  
  % Save the data.
  t(   end + 1 : end + 500)    = sc(scNum).Time;
  data(end + 1 : end + 500, :) = sc(scNum).Data;

  % Restart this scope.
  start(sc(scNum)); 

  % Switch to the next scope.
  if(scNum == 1) scNum = 2;
  else scNum = 1;
  end
  
end

% Remove the scopes we added.
remscope(tg,[1 2]);

% Plot the data.
plot(t,data); 
grid on; 
legend('Signal 4','Signal 5');