ЖУРНАЛ «СТА» №4/2006
вершена с ошибкой не сразу, а по исте- чении интервала времени, указанного в параметре lock_timeout (мс). То есть в течение заданного интервала необхо- димо ожидать снятия блокировки сер- вера. Выходной параметр abortPort пред- ставляет собой не что иное, как комму- никационный порт протокола IP, через который клиент может вызвать функ- цию device_abort() для прерывания ис- полняемой устройством команды, то есть это порт канала Abort. В специфи- кации [1] говорится, что реализация ка- нала Abort не является обязательной для устройств VXI11, но не указывает- ся, какой номер порта необходимо воз- вращать в этом случае. Эксперименты с клиентами VXI11, выполненные фир- мами Agilent Technologies и National Instruments (см. далее), показали, что существующие клиенты отказываются устанавливать соединение, если со- стояние порта канала Abort, возвращае- мое процедурой create_link() , не явля- ется корректным и порт не прослуши- вается со стороны приборного сервера. То есть даже самая примитивная реали- зация процедуры create_link() должна возвращать состояние открытого на прослушивание порта. Максимальный размер ожидаемого сообщения (выходной параметр) опре- деляется из специфики принимаемых устройством строковых команд (про- цедуры device_write() ) и может как быть константой, так и изменяться в процессе работы сервера. В листинге 2 представлен пример реализации create_link() в файле Device_server.c . В приведённом примере использу- ются функции getsocket() и threadAbort() , применяемые для обна- ружения/открытия свободного порта и прослушивания канала Abort. Так как информация о текущем соединении должна сохраняться в течение работы сервера, то объявлены несколько гло- бальных переменных: pThreadAbort, clntIntr, handleIntr, addr, current_lid, connect_counter , содер- жащих сеансовую информацию (см. комментарии к переменным). Теперь можно переходить к реализа- ции процедур, отражающих специфику работы конкретного сервера. Основны- ми процедурами, вызываемыми в рабо- чих режимах, являются device_write(), device_read() . Процедура записи по- зволяет передать серверу строковую ко- манду (с параметрами или без), а с по- мощью процедуры чтения клиент полу- чает результат выполнения команды (тоже в виде строки). Примером коман- ды может служить запрос идентифика- ционных данных “*IDN?” согласно спецификации [7], в ответ на который устройство должно выставить свои идентификационные данные: фир- муизготовитель, тип модели, серий- ный номер, версию программного обеспечения. Примеры реализации процедур чтения и записи приведены в листинге 3: на консоль выводится полу- ченная от клиента команда, а на любой запрос в ответ выдаётся строка иденти- фикации “NIFTI NNSU lab.14, Server VXI11 for OS QNX, L14K533, 1.00”. Для наполнения полезной функцио- нальностью каркаса сервера необходи- мо определить для прибора свою сис- тему команд или позаимствовать её у существующего прибора. В качестве базиса для такой системы можно реко- мендовать спецификацию языка SCPI [8]. Затем необходимо будет реализо- вать механизм разбора строковых ко- манд (parser), обеспечивающий обра- щение к управляющей функциональ- ности прибора (взаимодействие с реги- страми и/или с последовательными интерфейсами). Никаких требований и ограничений на такую функциональ- ность в спецификациях VXI11 нет, то есть вся специфика прибора целиком и полностью определяется разработчи- ком. Б ИБЛИОТЕКА VISA КАК КЛИЕНТ СЕРВЕРА VXI-11 В предыдущем разделе обсуждался вопрос создания сервера VXI11, а как быть с клиентом? В общем случае по известной спецификации RPCL (в на- шем случае файл Device.x) можно лег- ко получить код клиентской заглушки [2] и реализовать удалённый клиент приборного сервера. Но, к счастью, это не является обязательным, так как су- ществуют готовые клиенты, созданные в полном соответствии со специфика- цией VXI11. К таким клиентам отно- сятся программные комплексы NI VISA и AG VISA. Ядром этих комплек- сов является реализация библиотеки функций VISA (Virtual Instrument Software Architecture) visa32.dll [9]. С помощью программного интерфейса из данной библиотеки можно получить доступ к удалённым серверам VXI11. Кроме программного интерфейса, комплексы обеих фирм поддерживают операторские панели для работы с биб- лиотекой VISA: VISA Assistant (Agilent Technologies) и MAX (National Instruments). Эти панели являются полноценными клиентами серверов VXI11. Функциональность обеих реализа- ций одинаковая, поэтому рассмотрим, как взаимодействует AG VISA c реали- зованным каркасом сервера и для срав- нения с сервером генератора сигналов 33220А. Для экспериментов понадобится вер- сия 2.0.0 (или более поздняя) комплекса AG VISA (поставляется с приборами Agilent Technologies, доступна по адресу h t t p : / / a d n . t m . a g i l e n t . c o m / index.cgi?CONTENT_ID=1035&LAST_ CONTENT_ID=747). На стороне серве- ра запустим программудемон portmap и созданный приборный сервер. На сто- П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / ИН С Т Р УМЕ Н ТАЛ Ь НЫ Е СИС Т ЕМЫ 63 СТА 4/2006 www.cta.ru Device_WriteResp* device_write_1_svc(Device_WriteParms *argp, struct svc_req *rqstp) { static Device_WriteResp result; //Обрабатываем полученную строку (команду) printf(«device_write(‘%s’)\n», argp>data.data_val); result.size = argp>data.data_len; result.error = 0; return &result; } Device_ReadResp * device_read_1_svc(Device_ReadParms *argp, struct svc_req *rqstp){ static Device_ReadResp result; result.data.data_val = new char [argp>requestSize]; result.error = 0; result.reason = 0; strcpy(result.data.data_val, “NIFTI NNSU lab.14, Server VXI11 for OS QNX, L14K533, 1.00\n»); result.data.data_len = strlen(result.data.data_val); if ( result.data.data_len == 0 ) result.reason |= 0x1; if ( argp>termChar & argp>flags ) result.reason |= 0x2; result.reason |= 0x4; return &result; } Листинг 3
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy