События и коллбэки

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

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

В то время как объект инструмента соединяется с инструментом, можно использовать события для отображения сообщения, отображения данных, анализа данных и так далее. Коллбэки управляются через свойства коллбэка и функции обратного вызова. Все типы событий имеют связанное свойство коллбэка. Функции обратного вызова являются 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 команда.

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

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

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

Тип события

Сопоставленные Имена свойства

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

BytesAvailableFcn

BytesAvailableFcnCount

BytesAvailableFcnMode

Ошибка

ErrorFcn

Выходной-пустой

OutputEmptyFcn

Таймер

TimerFcn

TimerPeriod

Событие, доступное в байтах

Событие, доступное в байтах, генерируется сразу после того, как в входном буфере доступно предопределенное количество байтов или считывается символ End-Of-String, определяемый BytesAvailableFcnMode свойство.

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

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

Событие ошибки

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

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

Выходное-пустое событие

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

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

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

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

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

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

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

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

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

Тип события

Область

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

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

Type

BytesAvailable

Data.AbsTime

дневной-месячный час: минута: секунда

Ошибка

Type

Error

Data.AbsTime

дневной-месячный час: минута: секунда

Data.Message

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

Выход пустой

Type

OutputEmpty

Data.AbsTime

дневной-месячный час: минута: секунда

Таймер

Type

Timer

Data.AbsTime

дневной-месячный час: минута: секунда

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

Поле AbsTime

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

day-month-year hour:minute:second

Поле сообщения

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

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

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

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

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

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

g.BytesAvailableFcn = {'mycallback'};

Функции обратного вызова требуют как минимум двух входных параметров. Первый аргумент является объектом инструмента. Второй аргумент является переменной, которая захватывает информацию о событии, приведенную в предыдущей таблице, GPIB Event Information. Эта информация о событии относится только к событию, которое вызвало выполнение функции обратного вызова. Заголовок функции для 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 связанные с National Instruments ™® Контроллер GPIB с индексом платы 0 и инструмент с первичным адресом 1.

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

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

    Сконфигурируйте g для выполнения функции обратного вызова instrcallback каждый раз 5000 байт сохраняются в вход буфере. Потому что 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 вызывается каждый раз, когда 5000 байт сохраняются в вход буфере. Результаты отображения показаны ниже.

    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