Вы можете повысить степень и гибкость вашего приложения управления инструментом с помощью событий. Событие происходит после выполнения условия и может привести к одному или нескольким коллбэкам.
В то время как объект инструмента соединяется с инструментом, можно использовать события для отображения сообщения, отображения данных, анализа данных и так далее. Коллбэки управляются через свойства коллбэка и функции обратного вызова. Все типы событий имеют связанное свойство коллбэка. Функции обратного вызова являются 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 и свойства коллбэка
Тип события | Сопоставленные Имена свойства |
---|---|
Доступные байты | |
Ошибка | |
Выходной-пустой | |
Таймер | |
Событие, доступное в байтах, генерируется сразу после того, как в входном буфере доступно предопределенное количество байтов или считывается символ 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
Тип события | Область | Значение поля |
---|---|---|
Доступные байты |
|
|
| дневной-месячный час: минута: секунда | |
Ошибка |
|
|
| дневной-месячный час: минута: секунда | |
| Строка ошибки | |
Выход пустой |
|
|
| дневной-месячный час: минута: секунда | |
Таймер |
|
|
| дневной-месячный час: минута: секунда |
The Data
Значения полей описаны ниже.
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
для отображения связанной с событием информации в командной строке, когда событие, доступное в байтах, происходит во время двоичной операции чтения:
Создайте объект инструмента - Создайте объект GPIB g
связанные с National Instruments ™® Контроллер GPIB с индексом платы 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