С помощью событий можно повысить мощность и гибкость приложения управления приборами. Событие происходит после выполнения условия и может привести к одному или нескольким обратным вызовам.
В то время как объект прибора связан с прибором, события можно использовать для просмотра сообщения, просмотра данных, анализа данных и т.д. Управление обратными вызовами осуществляется с помощью свойств обратного вызова и функций обратного вызова. Все типы событий имеют связанное свойство обратного вызова. Функции обратного вызова - это функции 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 и свойства обратного вызова
Тип события | Имя связанного свойства |
|---|---|
Байты - доступно | |
Ошибка | |
Выход - пуст | |
Таймер | |
Событие, доступное в байтах, генерируется сразу же после того, как заданное количество байтов доступно во входном буфере, или считывается символ конца строки, как определено BytesAvailableFcnMode собственность.
Если BytesAvailableFcnMode является byte, событие, доступное в байтах, выполняет функцию обратного вызова, указанную для BytesAvailableFcn свойство каждый раз, когда количество байт указано BytesAvailableFcnCount хранится во входном буфере. Если BytesAvailableFcnMode является eosCharCode, то функция обратного вызова выполняется каждый раз, когда символ указан EOSCharCode свойство прочитано.
Это событие может быть создано только во время операции асинхронного чтения.
Событие ошибки генерируется сразу после возникновения ошибки, такой как тайм-аут. Тайм-аут возникает, если операция чтения или записи не была успешно завершена в течение времени, указанного Timeout собственность. Событие ошибки не создается для ошибок конфигурации, таких как установка недопустимого значения свойства.
Это событие выполняет функцию обратного вызова, указанную для ErrorFcn собственность. Он может быть создан только во время асинхронной операции чтения или записи.
Событие output-empty генерируется сразу после того, как выходной буфер пуст.
Это событие выполняет функцию обратного вызова, указанную для OutputEmptyFcn собственность. Он может быть создан только во время асинхронной операции записи.
Событие таймера генерируется в момент времени, указанный TimerPeriod проходит свойство. Время измеряется относительно того, когда объект подключен к прибору.
Это событие выполняет функцию обратного вызова, указанную для TimerFcn собственность. Обратите внимание, что некоторые события таймера могут не обрабатываться, если система значительно замедлена или если TimerPeriod слишком маленькое значение.
Вы можете ответить на информацию о событии в функции обратного вызова или в файле записи. Информация о событии, хранящаяся в функции обратного вызова, использует два поля: Type и Data. Type содержит тип события, в то время как Data содержит специфичную для события информацию. Как описано в разделе Создание и выполнение функций обратного вызова, эти два поля связаны со структурой, определенной в заголовке функции обратного вызова. Для получения информации о сохранении информации о событиях в файле записи см. Отладка: Запись информации на диск.
Типы событий и значения для Type и Data поля приведены ниже.
Информация о событии GPIB
Тип события | Область | Значение поля |
|---|---|---|
Доступно байтов |
|
|
| день-месяц-год час: минута: секунда | |
Ошибка |
|
|
| день-месяц-год час: минута: секунда | |
| Строка ошибки | |
Выход пуст |
|
|
| день-месяц-год час: минута: секунда | |
Таймер |
|
|
| день-месяц-год час: минута: секунда |
Data значения полей описаны ниже.
AbsTime определяется для всех событий и указывает абсолютное время возникновения события. Абсолютное время возвращается с помощью MATLAB clock формат:
day-month-year hour:minute:second
Message используется событием error для хранения описательного сообщения, генерируемого при возникновении ошибки.
Функция обратного вызова, выполняемая при возникновении определенного типа события, указывается путем включения имени файла в качестве значения связанного свойства обратного вызова. Функцию обратного вызова можно указать как дескриптор функции или как элемент массива ячеек строки. Обратите внимание, что при выполнении функции локального обратного вызова из файла необходимо указать обратный вызов в качестве дескриптора функции.
Например, для выполнения функции обратного вызова 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 для отображения связанной с событием информации в командной строке, когда событие, доступное в байтах, происходит во время операции двоичного чтения:
Создание объекта инструмента - создание объекта GPIB g связан с контроллером GPIB National Instruments ® с индексом платы 0 и прибором с основным адресом 1.
g = gpib('ni',0,1);Настроить свойства - настройте входной буфер, чтобы принять достаточно большое количество байтов, и настройте значение тайм-аута до двух минут, чтобы учесть медленную передачу данных.
g.InputBufferSize = 50000; g.Timeout = 120;
Настроить g для выполнения функции обратного вызова instrcallback каждый раз, когда 5000 байт хранится во входном буфере. Поскольку instrcallback требует, чтобы объект инструмента и информация о событии передавались в качестве входных аргументов, функция обратного вызова указывается как дескриптор функции.
g.BytesAvailableFcnMode = 'byte'; g.BytesAvailableFcnCount = 5000; g.BytesAvailableFcn = @instrcallback;
Подключение к прибору - Подключение g к осциллографу.
fopen(g)
Запись и чтение данных - настройте область для передачи экрана в виде растрового изображения.
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');
Отключить и очистить - когда вам больше не нужно gнеобходимо отсоединить его от прибора и удалить из памяти и из рабочего пространства MATLAB.
fclose(g) delete(g) clear g