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

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

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

Примечание

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

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

  • Объект OPC Toolbox™

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

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

function mycallback(obj,event)

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

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

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

Примечание

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

Запись функции обратного вызова

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

Чтобы реализовать эту функцию, функция обратного вызова получает последние 60 записей данных (или меньше, если недостаточно данных доступно в движке программного обеспечения OPC Toolbox) и отображает данные в графическом окне MATLAB. Функция также обращается к структуре события, переданной в качестве аргумента, чтобы отобразить метку времени события. The 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};

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

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

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

grp.StopFcn = @start;

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

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

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

Warning: The RecordsAcquiredFcn callback is being disabled.

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

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

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

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

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

Этот пример создает иерархию объектов OPC Toolbox для сервера Matrikon™ Simulation Server. Чтобы запустить этот пример в вашей системе, необходимо установить сервер симуляции 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, созданный в Write a Функция обратного вызова. Объект выполнит 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