ЖУРНАЛ «СТА» №4/2006

циям чтения/записи символьных буфе- ров (аналогично IEEE 488.1 и/или IEEE 488.2). Определим прибор (вернее, логиче- ский блок прибора, «обращённый» на- ружу через Ethernet) как приборный сервер (Network Instrument Server), а программу, выполняющуюся на управ- ляющем компьютере, как клиент при- бора (Network Instrument Client). Стек протоколов, задействованных при обмене информацией между при- борным сервером и приборным клиен- том, описывается в таблице 1. Два са- мых нижних уровня стека протоколов должны быть реализованы драйвером сетевого ввода/вывода и никакой спе- цифики, связанной с рассматриваемой задачей, не имеют. Сеансовый уровень определён как ONC/RPC (Open Network Computing / Remote Procedure Call), а внешнего представления дан- ных – XDR (External Data Representation). Наиболее известная реализация данных спецификаций – пакет Sun RPC фирмы Sun Microsystems [2], который входит в со- став дистрибутивов большинства опе- рационных систем семейства Unix. Для семейства Windows доступны коммер- ческие реализации ONC/RPC + XDR. Прикладной уровень подробно опи- сан в спецификации VXI11 [1], где оп- ределены интерфейсы вызываемых по- средством RPC функций и правила реализации внутренней логики при- борного сервера и его клиента. Всего определены три канала (Channels) для информационного взаимодействия: основной (Core), прекращения (Abort) и прерываний (Interrupt). Распределе- ние процедур по каналам показано в таблице 2. Вызов всех процедур через RPC осу- ществляется по инициативе приборного клиента (каналы Core и Abort). Исклю- чением является device_intr_srq() – эта процедура вызывается по инициативе сервера, в этом случае происходит об- мен ролями между сервером и клиен- том. Для успешной работы RPC на сторо- не сервера должен быть запущен демон (скрытая от пользователя служебная программа) portmap или rpcbind [2]. Для успешной работы клиента наличие процессов portmap или rpcbind необя- зательно. Взаимодействие приборного сервера и клиента начинается с вызова клиен- том процедуры create_link() . При первом вызове данной процедуры сер- вер должен открыть свободный порт, запустить процесс, где данный порт бу- дет прослушиваться. Номер прослуши- ваемого порта должен быть возвращён клиенту в качестве порта канала Abort. Кроме номера порта, функцией create_link() должны быть возвраще- ны код ошибки (0 – успех), идентифи- катор соединения (произвольное чис- ло) и максимально допустимое число байтов для сообщений устройству. При последующих вызовах create_link() значения возвращаемых параметров должны быть тождественны значениям при первом вызове. После того как соединение установ- лено, клиент может вызывать любые другие процедуры каналов Core и Abort. Обязательными для реализации на сто- роне приборного сервера являются про- цедуры device_write(), device_read(), device_lock(), device_unlock() . Ос- тальные процедуры могут быть не реа- лизованы, то есть при вызове возвра- щать код ошибки 8 (operation not supported). Примечательно, что в специ- фикациях [3, 4, 5] определены рекомен- дуемые шаблоны поведения приборов. Шаблоны представляют собой ком- плекты правил (ограничений) для реа- лизации процедур таким образом, что- бы поведение приборов соответствова- П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / ИН С Т Р УМЕ Н ТАЛ Ь НЫ Е СИС Т ЕМЫ 59 СТА 4/2006 www.cta.ru Прибор А1 Прибор А2 ПК Интернет Прибор Б1 Прибор Б2 Ethernet Ethernet Рис. 1. Распределённый многопроцессорный контрольно-измерительный комплекс Таблица 1 Стек протоколов, задействованных при обмене информацией между приборным сервером и приборным клиентом Уровень Протокол Прикладной VXI-11 Внешнего представления данных XDR Сеансовый ONC/RPC Транспортный TCP Сетевой IP Таблица 2 Распределение процедур по каналам Функция Канал Назначение create_link() Core Устанавливает соединение с прибором device_write() Core Отправляет сообщение прибору device_read() Core Считывает ответное сообщение прибора device_readstb() Core Считывает статусный байт прибора device_trigger() Core Запускает прибор device_clear() Core Сбрасывает прибор в исходное состояние device_remote() Core У прибора отключается локальное (с панели) управление device_local() Core У прибора включается локальное (с панели) управление device_lock() Core Прибор блокируется device_unlock() Core Прибор разблокируется create_intr_chan() Core Создает канал прерываний destroy_intr_chan() Core Ликвидирует канал прерываний device_enable_srq() Core Прибору разрешается/запрещается запрашивать обслуживание device_docmd() Core Прибору выдается команда destroy_link() Core Ликвидирует соединение с прибором device_abort() Abort Прекращает исполнение прибором текущей команды device_intr_srq() Interrupt Устройство запрашивает обслуживание

RkJQdWJsaXNoZXIy MTQ4NjUy