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