События и обратные вызовы

Введение в События и коллбэки

Можно улучшить степень и гибкость инструментального приложения управления при помощи событий. Событие имеет место после того, как условие соблюдают и может привести к одному или нескольким коллбэкам.

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

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

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

g = gpib('ni',0,1);
g.BytesAvailableFcnMode = 'eosCharCode';
g.BytesAvailableFcn = @instrcallback;
fopen(g)
fprintf(g,'*IDN?')
readasync(g)

Получившееся отображение от instrcallback показывают ниже.

BytesAvailable event occurred at 17:30:11 for the object: GPIB0-1.

Закончите сеанс GPIB.

fclose(g)
delete(g)
clear g

Вы видите код для встроенной функции instrcallback при помощи команды type.

Event Types and Callback Properties

Типы событий GPIB и сопоставленные свойства коллбэка описаны ниже.

Типы событий GPIB и свойства коллбэка

Тип события

Связанное имя свойства

BytesAvailable

BytesAvailableFcn

BytesAvailableFcnCount

BytesAvailableFcnMode

Ошибка

ErrorFcn

Пустой от вывода

OutputEmptyFcn

Таймер

TimerFcn

TimerPeriod

Доступное байтам событие

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

Если BytesAvailableFcnMode является byte, доступное байтам событие выполняет функцию обратного вызова, заданную для свойства BytesAvailableFcn каждый раз, когда количество байтов, заданных BytesAvailableFcnCount, хранится во входном буфере. Если BytesAvailableFcnMode является eosCharCode, то функция обратного вызова выполняется каждый раз, когда символ, заданный свойством EOSCharCode, читается.

Это событие может быть сгенерировано только во время асинхронной операции чтения.

Ошибочное событие

Ошибочное событие сразу сгенерировано после того, как ошибка, такая как тайм-аут, произойдет. Тайм-аут происходит, если операция чтения или операция записи успешно не завершаются в течение времени, заданного свойством Timeout. Ошибочное событие не сгенерировано для ошибок настройки, таких как установка недопустимого значения свойства.

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

Пустое от вывода событие

Пустое от вывода событие сразу сгенерировано после того, как буфер вывода пуст.

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

Событие таймера

Событие таймера сгенерировано, когда время, заданное свойством TimerPeriod, передает. Время измеряется относительно того, когда объект соединяется с инструментом.

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

Ответ на информацию о событии

Можно ответить на информацию о событии в функции обратного вызова или в файле записи. Информация о событии, сохраненная в функции обратного вызова, использует два поля: Type и Data. Поле Type содержит тип события, в то время как поле Data содержит привязанную к конкретному событию информацию. Как описано в Создании и Выполнении Функций обратного вызова, эти два поля сопоставлены со структурой, которую вы задаете в заголовке функции обратного вызова. Обратитесь к Отладке: Запись информации к Диску, чтобы узнать о хранении информации о событии в файле записи.

Типы событий и значения для полей Type и Data приведены ниже.

Информация о событии GPIB

Тип события

Поле

Значение поля

BytesAvailable

Type

BytesAvailable

Data.AbsTime

дневной год месяца hour:minute:second

Ошибка

Type

Error

Data.AbsTime

дневной год месяца hour:minute:second

Data.Message

Строка ошибки

Выведите пустой

Type

OutputEmpty

Data.AbsTime

дневной год месяца hour:minute:second

Таймер

Type

Timer

Data.AbsTime

дневной год месяца hour:minute:second

Значения полей Data описаны ниже.

Поле AbsTime

AbsTime задан для всех событий и указывает абсолютное время, которое имело место событие. Абсолютное время возвращено с помощью формата clock MATLAB:

day-month-year hour:minute:second

Обмен сообщениями поля

Message используется ошибочным событием, чтобы хранить описательное сообщение, которое сгенерировано, когда ошибка происходит.

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

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

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

g.BytesAvailableFcnMode = 'eosCharCode';
g.BytesAvailableFcn = @mycallback;

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

g.BytesAvailableFcn = {'mycallback'};

Функции обратного вызова требуют по крайней мере двух входных параметров. Первый аргумент является инструментальным объектом. Второй аргумент является переменной, которая получает информацию о событии, данную в предыдущей таблице, Информации о событии GPIB. Эта информация о событии принадлежит только событию, которое заставило функцию обратного вызова выполняться. Функциональный заголовок для mycallback показывают ниже.

function mycallback(obj,event)

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

time = datestr(now,0);
g.BytesAvailableFcnMode = 'eosCharCode';
g.BytesAvailableFcn = {@mycallback,time};

Также можно задать mycallback как вектор символов в массиве ячеек.

g.BytesAvailableFcn = {'mycallback',time};

Соответствующий функциональный заголовок

function mycallback(obj,event,time)

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

Примечание

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

Включение функций обратного вызова после того, как они ошибка

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

  • Функция обратного вызова автоматически отключена.

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

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

Используя События и коллбэки, чтобы считать двоичные данные

Этот пример расширяет Чтение и Запись Двоичных данных при помощи функции обратного вызова instrcallback, чтобы отобразить событийную информацию к командной строке, когда доступное байтам событие имеет место во время бинарной операции чтения:

  1. Создайте инструментальный объект — Создают объект GPIB g, сопоставленный с Национальным контроллером Instruments® GPIB с параметром плат 0 и инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Сконфигурируйте свойства — Конфигурируют входной буфер, чтобы принять довольно большое количество байтов и сконфигурировать значение тайм-аута к двум минутам, чтобы составлять медленную передачу данных.

    g.InputBufferSize = 50000;
    g.Timeout = 120;

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

    g.BytesAvailableFcnMode = 'byte';
    g.BytesAvailableFcnCount = 5000;
    g.BytesAvailableFcn = @instrcallback;
  3. Соединитесь с инструментом — Подключение g к осциллографу.

    fopen(g)
  4. Запишите и считайте данные — Конфигурируют осциллограф, чтобы передать отображение на экране как битовый массив.

    fprintf(g,'HARDCOPY:PORT GPIB')
    fprintf(g,'HARDCOPY:FORMAT BMP')
    fprintf(g,'HARDCOPY START')

    Инициируйте асинхронную операцию чтения и начните генерировать события.

    readasync(g)

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

    BytesAvailable event occurred at 09:41:42 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:41:50 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:41:58 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:42:06 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:42:14 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:42:22 for the object: GPIB0-1.
    BytesAvailable event occurred at 09:42:30 for the object: GPIB0-1.

    Ожидайте, пока все данные не отправляются во входной буфер, и затем передайте данные рабочему пространству MATLAB как 8-битные целые числа без знака.

    g.TransferStatus
    ans =
    idle
    out = fread(g,g.BytesAvailable,'uint8');
  5. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента и удалить его из памяти и из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g