Возможность использования обратных вызовов событий заключается в возможности выполнения обработки в ответ на события. Необходимо выбрать события, с которыми требуется связать обратные вызовы, и функции, выполняемые этими обратными вызовами.
Примечание
Выполнение функции обратного вызова может быть задержано, если обратный вызов связан с задачей с интенсивным использованием ЦП или если программное обеспечение 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 записей. Повторяющиеся значения подсвечиваются пурпурными кругами, а плохие - красными.
В этом примере создается иерархия объектов панели инструментов OPC для сервера моделирования 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');
В этом примере устанавливается 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;
Запустите dagroup объект. Каждый раз при получении 5 записей объект выполняет display_opcdata функция обратного вызова. Эта функция обратного вызова отображает последние полученные записи, зарегистрированные в буфере памяти.
start(grp) wait(grp)
Всегда удаляйте объекты панели инструментов из памяти и переменные, которые ссылаются на них, когда они больше не нужны. Удаление opcda объект клиента также удаляет объекты группы и элемента.
disconnect(da) delete(da) clear da grp itm1 itm2