Анатомия GPIB


Hardware

Шина IEEE-488 и соответствующий протокол широко используются в программно-аппаратных комплексах для соединения персональных компьютеров и рабочих станций с измерительными инструментами (в частности, в системах сбора данных). Разработанный в 60-х годах в Hewlett-Packard, протокол изначально назывался HPIB (Hewlett-Packard Interace Bus, интерфейсная шина Hewlett-Packard). Впоследствии другие компании подхватили инициативу и начали использовать протокол для своих внутренних целей. Протокол был стандартизован американским Институтом инженеров электротехнической и электронной промышленности (IEEE) и переименован в IEEE-488 (по номеру стандарта) или GPIB (General Purpose Interface Bus, интерфейсная шина общего назначения) в середине 70-х годов. Аналогичный российский стандарт называется Канал Общего Пользования (КОП).

По мере проникновения принятого стандарта протокола в промышленность выяснилось, что конкретный порядок передачи команд по шине был недостаточно хорошо определен. Стандарт был пересмотрен и дополнен в 1987 году (добавлено описание протокола передачи). Новый стандарт содержит две части: IEEE-488.1, описывающую аппаратную часть и низкоуровненое взаимодействие с шиной, и IEEE-488.2, определяющую порядок передачи команд по шине. Стандарт IEEE-488.2 был еще раз пересмотрен в 1992 году.

Шина IEEE-488 — это надежный и эффективный канал передачи данных. Простота использования, непрекращающееся развитие аппартной поддержки GPIB, разработка новых интерфейсных карточек и GPIB-совместимых инструментов ведут к неуклонному росту числа пользователей шины, несмотря на мощную конкуренцию со стороны архитектур VMEbus и FiberChannel. В последние несколько лет индустрия GPIB эволюционирует в направлении минимизации затрат на изготовление при сохранении базисной функциональности шины. Это достигается путем использования недорогих микроконтроллеров для реализации устройств типа "talker" и "listener" ("говорящий" и "слушающий", соответственно; о них ниже).

Поскольку шина IEEE-488 хорошо стандартизована и протестирована, большинство производителей автоматизированных измерительных систем и инструментов встраивают в свои изделия интерфейсы GPIB в качестве основного канала передачи данных.

Стандарт GPIB определяет три различных типа устройств, которые могут быть подключены к шине: "listener", "talker" и/или контроллер (точнее, устройства могут находиться в состоянии "listener" либо "talker" либо быть типа "контроллер"). Устройство в состоянии "listener" считывает сообщения с шины; устройство в состоянии "talker" посылает сообщения на шину. В каждый конретный момент времени в состоянии "talker" может быть одно и только одно устройство, в то время как в состоянии "listener" может быть произвольное количество устройств. Контроллер выполняет функции арбитра и определяет, какие из устройств в данный момент находятся в состоянии "talker" и "listener". К шине может быть одновременно подключено несколько контроллеров. В этом случае один из контроллеров (как правило, расположенный на интерфейсной карте GPIB) является ответственным контроллером (Controller-in-Charge, CIC) и делегирует по мере надобности свои функции другим контроллерам. Шина сконфигурирована таким образом, что одновременно может обслуживать до 15 клиентов с адресами от 0 до 30 включительно (адреса устройств не обязаны быть непрерывными, но во избежание конфликтов обязаны быть различными).

Шина состоит из 24 проводов (см. таблицу 1). Все сигнальные линии используют отрицательную логику: наибольшее положительное напряжение интерпретируется как логический "0", а наибольшее отрицательное — как логическая "1". Конкретные значения напряжения определены стандартом IEEE-488.

Сигнальные линии шины относятся к одному из трех классов: линии данных, линии рукопожатия и линии управления интерфейсом. Для пересылки команд по шине используются восемь линий данных, причем старший бит (DIO8) в большинстве случаев игнорируется. Обратите внимание на тот факт, что линии данных пронумерованы от 1 до 8, а не от 0 до 7, как в большинстве других стандартов.

Три линии рукопожатия управляют передачей данных и команд и обеспечивают гарантированный прием данных всеми устройствами типа "listener" в надлежащее время.

Сигнал "Данные Готовы" ("Data Valid") используется устройством типа "talker" для оповещения устройств типа "listener" о том, что информация, подготовленная "talker'ом", выставлена на линиях данных и готова к приему.

Сигнал "Не Готов К Приему" ("Not Ready For Data") используется устройствами типа "listener" для того, чтобы сообщить устройству типа "talker" о том, что они не готовы к приему данных. В этом случае устройство типа "talker" прекращает обмен информацией до того момента, когда все устройства типа "listener" будут готовы к продолжению диалога. Сигнал "Не Готов К Приему" реализован по принципу "монтажное ИЛИ", что позволяет каждому взятому в отдельности устройству типа "listener" приостановить всю шину.

Сигнал "Данные Не Приняты" ("Not Data Accepted") используется устройствами типа "listener" и сообщает устройству типа "talker", что данные приняты всеми адресатами. Когда этот сигнал не активен, "talker" может быть уверен, что все клиенты успешно прочли данные с шины и можно приступать к передаче следущего байта данных. Процедура рукопожатия гарантирует, что скорость передачи данных по шине не превышает скорость их обработки самым медленным из клиентов. Имейте это ввиду, когда будете использовать GPIB для соединения устройств, работающих с разной скоростью! Линия "Данные Не Приняты" также организована как "монтажное ИЛИ".

Как нетрудно видеть, устройство типа "talker" помещает новые данные на шину только тогда, когда все устройства типа "listener" готовы к приему.

Пять линий управления интерфейсом сообщают устройствам, присоединенным к шине, какие действия предпринимать, в каком режиме находиться и как реагировать на команды GPIB. Контроллер шины использует линию "Внимание" ("Attention") для сообщения клиентам о том, что по шине идут команды, а не данные. Сигнал "Запрос Обслуживания" ("Service Request") доступен любому клиенту шины. По этому сигналу контроллер переводит, по возможности, подавшее его устройство в состояние "talker" и передает ему функции передачи данных. Сигнал "Очистка Интерфейса" ("Interface Clear") используется для инициализации или реинициализации шины. Сигнал "Разрешить Работу В Удаленном Режиме" ("Remote Enable") переводит устройство, подключенное к шине, в режим исполнения команд с шины (а не с контрольной панели) и обратно. Сигнал "Конец идентификации" ("End of Identify") используется "talker'ом" для идентификации конца сообщения. Контроллер выставляет этот сигнал для инициации параллельного опроса подключенных к шине устройств.

Для получения информации от устройств, подключенных к шине, и переконфигурации шины контроллер посылает команды пяти классов: "однобитная" ("Uniline"), "многобитная общего назначения" ("Universal Multiline"), "многобитная адресная" ("Address Multiline"), "многобитная групповая адресная передающая" ("Talk Address Group Multiline") и "многобитная групповая адресная приемная" ("Listen Address Group Multiline").

Интерфейсные карты GPIB существуют для шин PCI, PC Card (PCMCA), ISA, NuBus, Sbusи NECBus.

Высокоскоростной протокол HS-488

Так называемый высокоскоростной протокол GPIB (HS-488), предложенный фирмой National Instruments в 1996 году, позволяет увеличить пропускную способность шины до 8 мбайт/сек, используя стандартные кабели и аппаратную базу. HS-488 улучшает производительность шины путем устранения задержек, связанных с необходимостью дожидаться подтверждения в трехсигнальной схеме IEEE-488.1 (DAV/NRFD/NDAC), где максимальная пропускная способность не превышает 1,5 мбайт/сек. Не вдаваясь в подробности, отметим только, что за одну операцию "talker" посылает столько байт данных, сколько "listener" в состоянии принять, исходя из наличия свободных буферов.

Протокол HS-488 полностью совместим с существующими системами, основанными на IEEE-488.1, поэтому устройства обоих типов могут сосуществовать на одной шине. "Talker" инициирует передачу данных по протоколу HS-488 только в том случае, если "listener" в состоянии принять эти данные. Команды GPIB всегда передаются с использованием классического протокола IEEE-488.1.

Firmware

Для общения друг с другом инструменты, удовлетворяющие стандарту IEEE-488.2, используют текстовые команды, состоящие из 7-битных символов (как и модемы!). Стандарт определяет минимальный набор возможностей, которыми должен обладать каждый инструмент, а именно: принимать и передавать данные, посылать запрос на обслуживание и реагировать на сигнал "Очистить Интерфейс".

Стандарт задает формат команд, посылаемых инструментам, и формат и кодировку откликов. Команды, как правило, являются аббревиатурами соответствующих слов английского языка. Команды-запросы снабжаются на конце вопросительным знаком. Все обязательные команды префиксируются астериском (*). Список наиболее часто используемых обязательных команд приведен в таблице 2.

Вторым компонентом системы команд GPIB является Стандарт Команд Программируемого Инструмента (Standard Commands for Programming Instruments, SCPI), принятый в 1990 году. Несмотря на то, что SCPI был разработан на основе стандарта IEEE-488.2, он может быть легко адаптирован для любой другой аппаратной базы.

SCPI определяет стандартные правила сокращения ключевых слов, используемых в качестве команд. Ключевые слова могут быть использованы либо в длинной (например, MEASure — измерить), либо в короткой прописной форме (MEAS).Команды в формате SCPI префиксируются двоеточием. Аргументы команд разделяются запятой.

Стандарт SCPI оперирует с моделью программируемого инструмента. Функциональные компоненты модели включают систему измерений (подсистемы "вход", "датчик" и "калькулятор"), систему генерации сигналов (подсистемы "калькулятор", "источник" и "выход") и подсистемы "формат", "показ", "память" и "тригер". Естественно, что у некоторых инструментов отсутствуют некоторые системы либо подсистемы. Например, осциллограф не имеет системы генерации сигналов, а программируемый генератор цифровых последовательностей — системы измерений.

Команды для работы с компонентами систем и подсистем имеют иерархический вид и состоят из подкоманд, разделенных двоеточиями. Рассмотрим в качестве примера команду, конфигурирующую цифровой мультиметр для измерения переменного напряжения величиной до 20 В с точностью 1 мВ: :MEASure:VOLTage:AC?20,0.001

  • Двоеточие обозначает начало новой команды.
  • Ключевые слова MEASure:VOLTage:AC сообщают мультиметру, что требуется произвести измерение переменного напряжения.
  • Вопросительный знак сообщает мультиметру, что результат измерения должен быть возвращен компьютеру либо контроллеру.

  • Числа 20 и 0.001, разделенные запятой, задают диапазон и точность измерения.

Software

Программные продукты для работы с шиной GPIB выпускаются в первую очередь компаниями National Instruments и Keithley Instruments, а также группой энтузиастов "Лабораторный проект для Линукс" (Linux Lab Project). Они доступны для операционных систем Mac OS (Макинтош), Windows NT/95/98/3.1 и Линукс (персональные компьютеры на базе процессора Intel), Солярис (Intel и Sun), HP-UX (рабочие станции Hewlett-Packard), IRIX (рабочие станции Silicon Graphics), AIX (рабочие станции IBM) и Digital Unix (рабочие станции DEC Alpha). Как правило, в пакет включается драйвер интерфейсной карты для соответствующей операционной системы, библиотека из около 40 стандартных функций (API) и программы для конфигурации и тестирования интерфейса.

Стандартные функции распадаются на несколько групп:

  • функции конфигурации:
    • ibask — запросить текущую конфигурацию драйвера
    • ibbna — изменить адрес интерфейсной карты
    • ibconfig — задать конфигурацию драйвера
    • ibdma — разрешить/запретить прямой доступ в память
    • ibeos — разрешить/запретить останов чтения по символу конца строки
    • ibeot — разрешить/запретить сообщение о конце операции
    • ibpad, ibsad — изменить первичный/вторичный адрес устройства
    • ibsrc — запросить/уступить функции ответственного контроллера
    • ibtmo — изменить/запретить тайм-аут
  • функции управления шиной:
    • ibfind — найти устройство с заданным именем, завести дескриптор устройства
    • ibsic — послать сигнал очистки интерфейса
    • ibsre — послать сигнал перевода в удаленный режим
    • ibwait — ждать события на шине
    • ibcac, ibln, ibgts, iblines, ibloc, ibstop...
  • функции управления устройствами:
    • ibdev — открыть и проинициализировать дескриптор устройства
    • ibtrg — инициировать операцию на устройстве
    • ibclr, ibrsp, ibrpp, ibppc, ibpct, ibonl...
  • функции ввода/вывода:
    • ibrd — считать данные с шины в буфер
    • ibwrt — высиавить данные из буфера на шину
    • ibrda, ibrdf, ibwrta, ibwrtf...
  • функции низкоуровневого ввода/вывода (ibcmd, ibcmda)
  • функции "talker'а" и "listener'а" (ibist, ibsrv).

Рассмотрим в качестве примера простой фрагмент программы на языке "Си", который работает с цифровым логическим анализатором фирмы Hewlett-Packard HP-16500: инициализирует его, считывает 256 байт данных и затем отключает от шины. Как правило, при работе с аппаратными средствами диагностика ошибок по возможности должна сопровождать каждый вызов функции из библиотеки поддержки GPIB. Мы же ограничимся проверкой статуса лишь после наиболее критических операции: поиска устройства и считывания данных. Не забывайте, что многие устройства (например, тот же логический анализатор) возвращают целочисленные данные в так называемом сетевом формате, в котором старший бит числа находится в первом байте, а не во втором. В этом случае перед использованием "сырых" данных их необходимо перекодировать, используя, например, функцию ntohl().

#include <ib.h>
... ... ... ...
/*включить файл с заголовками функций*/
unsigned short handle; /*переменная для ссылки на устройство*/
unsigned char buf[256]; /*сюда будем складывать результаты*/
handle = ibfind ("HP16500"); /*найти устройство с меткой "HP16500"*/
if (handle & ERR) ... /*проверить статус операции*/
ibclr (handle); /*очистить интерфейс устройства (на всякий случай!)*/
ibwrt (handle, ":SYST:HEAD 0", 13); /*послать команду :HEAD подсистеме :SYST анализатора*/
... ... ... ... /*далее следуют команды настройки анализатора*/
ibwrt (handle, ":START", 7); /*команда SCPI: инициировать измерительную систему*/
ibwrt (handle, "*WAI", 5); /*команда GPIB: дождаться окончания операции*/
... ... ... ...  
ibwrt (handle, ":SYST:DATA?", 12); /*запросить данные (обратите внимание на "?"!)*/
status = ibrd (handle, buf, 256); /*считать 256 байт с шины в буфер buf*/
if (status & ERR) /*не забыть проверить статус операции!*/
   fprintf (stderr, "%d\n", iberr); /*переменная iberr хранит статус предыдущей операции*/
else  
   fprintf (stderr, "%d bytes\n", ibcnt); /*переменная ibcnt хранит число считанных байтов*/
ibonl (handle, 0); /*перевести устройство в режим офф-лайн*/


Приложение: Таблица 1

N п/п Мнемоника Название Функция
1 DIO1 DIO1 Данные (младший бит)
2 DIO2 DIO2 Данные
3 DIO3 DIO3 Данные
4 DIO4 DIO4 Данные
5 EOI End of Identify (конец идентификации) Управление интерфейсом
6 DAV Data Valid (данные готовы) Рукопожатие
7 NRFD Not Ready for Data (не готов к приему) Рукопожатие
8 NDAC Not Data Accepted (данные не приняты) Рукопожатие
9 IFC Interface Clear (очистить интерфейс) Управление интерфейсом
10 SRQ Service Request (запрос обслуживания) Управление интерфейсом
11 ATN Attention (внимание) Управление интерфейсом
12 - Shield (экран) Шасси
13 DIO5 DIO5 Данные
14 DIO6 DIO6 Данные
15 DIO7 DIO7 Данные
16 DIO8 DIO8 Данные (старший бит)
17 REN Remote Enable (разрешить работу в удалЈнном режиме) Управление интерфейсом
18 - DAV Return (возврат DAV) Шасси
19 - NRFD Return (возврат NRFD) Шасси
20 - NDAC Return (возврат NDAC) Шасси
21 - IFC Return (возврат IFC) Шасси
22 - SRQ Return (возврат IFC) Шасси
23 - ATN Return (возврат IFC) Шасси
24 - Signal Ground (земля данных) Шасси


Приложение: Таблица 2

Мнемоника Группа Описание
*IDN? Сист. информация Запрос идентификации
*RST Внутренние операции Сброс
*TST? Внутренние операции Провести внутреннее тестирование
*OPC Синхронизация Закончить операцию
*OPC? Синхронизация Закончена ли операция?
*WAI Синхронизация Дождаться завершения операции
*CLS Статус операции Очистить статусный регистр
*ESE Статус операции Разрешить работу регистра статуса событий
*ESE? Статус операции Разрешена ли работа регистра статуса событий?
*ESR? Статус операции Запросить регистр статуса событий
*SRE Статус операции Разрешить посылку запросов наобслуживание
*SRE? Статус операции Разрешена ли послыка запросов на обслуживание?
*STB? Статус операции Считать статусный байт




Дополнительно