С двумя осциллографами можно минимизировать перекрытие данных или разрывы. Первый осциллограф получает данные до демонстрационного N
, затем останавливается. Второй осциллограф начинает получать данные в демонстрационном N+1
.
В этом примере свойство TriggerMode
Осциллографа 1 установлено в 'Scope'
, но это явным образом инициировано с функцией MATLAB® trigger(sc1)
.
Можно использовать функцию trigger
, чтобы обеспечить осциллографы в реальном времени, чтобы инициировать, независимо от триггерной установки режима и независимо от того, соответствовали ли критериям инициирования.
Минимизировать разрывы путем получения данных с двумя осциллографами:
Создайте и загрузите модель xpcosc
Simulink® на целевой компьютер.
В Окне Команды MATLAB присвойте tg
целевому компьютеру и установите свойство StopTime
на 10
.
tg = slrt; tg.StopTime = 10;
Добавьте вектор двух осциллографов хоста к приложению реального времени. Используйте векторный индекс, чтобы переключиться от одного осциллографа до другого.
sc = addscope(tg,'host', [1 2]);
Добавьте сигнализирует о 4
и 5
к обоим осциллографам.
addsignal(sc,[4 5]);
Установите свойство NumSamples
для обоих осциллографов к 500
и свойство TriggerSample
для обоих осциллографов к -1
. С этой установкой свойства каждый осциллограф инициировал следующий осциллограф в конце своих 500 демонстрационных приобретений.
sc(1).NumSamples = 500; sc(1).TriggerSample = -1; sc(2).NumSamples = 500; sc(2).TriggerSample = -1;
Установите свойство TriggerMode
для осциллографов 1 и 2 к 'Scope'
. Установите свойство TriggerScope
, таким образом, что каждый осциллограф инициировал другой.
sc(1).TriggerMode = 'Scope'; sc(1).TriggerScope = 2; sc(2).TriggerMode = 'Scope'; sc(2).TriggerScope = 1;
Настройте устройство хранения данных в течение времени, t
, и сигнала, приобретения data
.
t = []; data = zeros(0, 2);
Запустите оба осциллографа и модель.
start(sc); start(tg);
Оба осциллографа получают те же сигналы, 4
и 5
.
Чтобы начать получать данные, явным образом инициируйте, определяют объем 1
.
scNum = 1; trigger(sc(scNum));
Установка scNum
к 1
указывает, что Осциллограф 1 получает данные сначала.
Начните получать данные с помощью двух осциллографов для двойного буфера данные.
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(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');