Создание и выполнение функций обратного вызова

Создайте функции обратного вызова

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

Примечание

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

Функции обратного вызова требуют по крайней мере двух входных параметров:

  • Объект OPC Toolbox™

  • Структура события сопоставлена с событием

Функциональный заголовок для этой функции обратного вызова иллюстрирует этот базовый синтаксис.

function mycallback(obj,event)

Первый аргумент, obj, сам объект тулбокса. Поскольку объект доступен, можно использовать в функции обратного вызова любую из функций тулбокса, таких как getdata, это требует объекта в качестве аргумента. Можно также получить доступ ко всем свойствам объектов, включая родительский элемент и дочерние элементы объекта.

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

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

Примечание

Если вы задаете входные параметры в дополнение к объекту и аргументам события, необходимо использовать массив ячеек при определении имени функции как значения свойства коллбэка. Для получения дополнительной информации смотрите, Задают Функции обратного вызова.

Запишите функцию обратного вызова

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

Чтобы реализовать эту функцию, функция обратного вызова получает последние 60 записей данных (или меньше, если недостаточно данных доступно в механизме программного обеспечения OPC Toolbox), и отображает данные в графическом окне MATLAB. Функция также получает доступ к структуре события, переданной в качестве аргумента, чтобы отобразить метку времени события. drawnow команда в функции обратного вызова обеспечивает MATLAB, чтобы обновить отображение.

function display_opcdata(obj,event)

numRecords = min(obj.RecordsAvailable, 100);
lastRecords = peekdata(obj,numRecords);
[i, v, q, t] = opcstruct2array(lastRecords);
plot(t, v);
isBad = strncmp('Bad', q, 3);
isRep = strncmp('Repeat', q, 6);
hold on
for k=1:length(i)
  h = plot(t(isBad(:,k),k), v(isBad(:,k),k), 'o');
  set(h,'MarkerEdgeColor','k', 'MarkerFaceColor','r')
  h = plot(t(isRep(:,k),k), v(isRep(:,k),k), '*');
  set(h,'MarkerEdgeColor',[0.75, 0.75, 0]);
end
axis tight;
ylim([0, 200]);
datetick('x','keeplimits');
eventTime = event.Data.LocalEventTime;
title(sprintf('Event occurred at %s', ...
  datestr(eventTime, 13)));
drawnow; % force an update of the figure window
hold off;

Чтобы видеть, как эта функция может использоваться в качестве коллбэка, вид на море Недавно Записанные данные.

Задайте функции обратного вызова

Вы сопоставляете функцию обратного вызова с определенным событием путем устанавливания значения свойства объекта OPC Toolbox, сопоставленного с тем событием. Можно задать функцию обратного вызова как значение свойства одним из трех способов:

Следующие разделы предоставляют больше информации о каждой из этих опций.

Примечание

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

Используйте вектор символов, чтобы задать функции обратного вызова

Можно задать функцию обратного вызова как вектор символов. Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для группового объекта grp.

grp.StartFcn = 'mycallback';

В этом случае коллбэк оценен в рабочем пространстве MATLAB.

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

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

Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для группового объекта grp.

grp.StartFcn = {'mycallback'};

Чтобы задать дополнительные параметры, включайте их как дополнительные элементы в массиве ячеек.

time = datestr(now,0);
grp.StartFcn = {'mycallback',time};

Первые два аргумента, переданные функции обратного вызова, являются все еще объектом OPC Toolbox (obj) и структура события (event). Дополнительные аргументы следуют за этими двумя аргументами.

Используйте Указатели на функции, чтобы задать функции обратного вызова

Можно задать функцию обратного вызова как указатель на функцию.

Например, этот код задает функцию обратного вызова mycallback как значение свойства StartFcn коллбэка события запуска для группового объекта grp.

grp.StartFcn = @mycallback;

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

time = datestr(now,0);
grp.StartFcn = {@mycallback,time};

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

Задайте функцию тулбокса как коллбэк

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

grp.StopFcn = @start;

Отключите коллбэки

Если ошибка происходит в выполнении функции обратного вызова, тулбокс отключает коллбэк и отображает сообщение, похожее на следующее.

start(grp)
??? Error using ==> myrecords_cb
Too many input arguments.

Warning: The RecordsAcquiredFcn callback is being disabled.

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

Просмотрите недавно записанные данные

Этот пример конфигурирует иерархию объектов OPC Toolbox и устанавливает приобретенное имущество функции обратного вызова события рекордов к display_opcdata функция, созданная в Записи Функция обратного вызова.

Когда запущено, пример отображает последние 60 записей полученных данных каждый раз, когда 5 записей были получены. Повторите, что значения подсвечены с пурпурными кругами, и плохие значения подсвечены с красными кругами.

Шаг 1: создайте иерархию объектов OPC Toolbox

Этот пример создает иерархию объектов OPC Toolbox для Сервера Симуляции Matrikon™. Чтобы запустить этот пример в вашей системе, у вас должен быть установленный Сервер Симуляции Matrikon. В качестве альтернативы можно заменить значения, используемые в создании объектов со значениями для сервера, к которому можно получить доступ.

da = opcda('localhost','Matrikon.OPC.Simulation.1');
connect(da)
grp = addgroup(da,'CallbackTest');
itm1 = additem(grp,'Triangle Waves.Real8');
itm2 = additem(grp,'Saw-toothed Waves.UInt2');

Шаг 2: сконфигурируйте значения свойств

Этот пример устанавливает UpdateRate значение к 0,2 секундам и RecordsToAcquire свойство к 200. Пример также задает как значение RecordsAcquiredFcn коллбэк функция обратного вызова события display_opcdata, созданный в Записи Функция обратного вызова. Объект выполнит RecordsAcquiredFcn каждые 5 записей, как задано значением RecordsAcquiredFcnCount свойство.

grp.UpdateRate = 0.2;
grp.RecordsToAcquire = 200;
grp.RecordsAcquiredFcnCount = 5;
grp.RecordsAcquiredFcn = @display_opcdata;

Шаг 3: получите данные

Запустите dagroup объект. Каждый раз, когда 5 записей получены, объект выполняет display_opcdata функция обратного вызова. Эта функция обратного вызова отображает последний раз полученные записи, регистрируемые к буферу памяти.

start(grp)
wait(grp)

Шаг 4: Очистка

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

disconnect(da)
delete(da)
clear da grp itm1 itm2