Discusiones sobre Productos NI

cancelar
Mostrando los resultados de 
Buscar en lugar de 
Quiere decir: 

Ayuda: C++ App usando VISA sobre GPIB

Hola! Necesito vuestra ayuda a varias dudas que tengo. Ante todo enhorabuena por el foro y por la atención que brindais al usuario final. Así da gusto !

Estoy desarrollando una aplicación en c++ usando la libreria VISA para el control remoto sobre GPIB de varios instrumentos que tenemos en el laboratorio. Poco a poco a medida que avance el proyecto, se irán añadiendo nuevas funcionalidades a la aplicación, sin embargo, como punto de partida estoy tratando de capturar la pantalla y transferirla al PC. Me han surgido numerosas dudas, pues tengo la programación algo oxidada y desconocía por completo la API VISA. Estoy consultando la documentación tanto de NI como de Agilent referente a la VISA. Estaría muy agradecido si me pudiesen echar una mano:

1)  Se supone que visa es una implementación estandarizada,¿poque hay entonces una NI-VISA y una Agilent VISA? ¿Es posible controlar cualquier instrumento (entiendase compatible con VISA sobre GPIB) con una implementación concreta, p.ej NI-VISA? ¿Cual me recomiendan NI o Agilent?

2) Actualmente en el PC tengo ambas VISAS instaladas (Agilent y NI) aunque creo que la activa es la Agilent. He empezado con un Analizador de espectros de Agilent aunque me estoy apoyando principalmente en la documentacion de NI-VISA pues me parece más completa. Sin embargo he intentado reproducir algunos ejemplos simples que vienen en la documentación de NI y el compilador (vc++ 2005 express) me tira errores. Por lo que veo en la documentación de NI-VISA usa principalmente las funciones viWrite y viRead para el envio y respuesta de los comandos SCPI. Un ejemplo simple sería:
   
    viWrite(instr, "*IDN?\n", 6, &retCount)

Sin embargo, al compilar con la Agilent VISA me da el error: "no se puede convertir el parámetro 2 de 'const char [7]' a 'ViBuf'". Por lo que deduzco que el comando SCPI debe estar declarado como ViBuf y no se puede pasar directamente como una cadena de caracteres ¿no es asi? pero entonces ¿porqué todos los ejemplos vienen así escritos en la NI-VISA? ¿con las librerías de NI si se puede hacer esto y con las de Agilent no? Finalmente opté por usar viPrintf y viScanf que si me permiten el paso de comandos SCPI directamente. No obstante me gustaría saber si hay información sobre los tipos definidos en la VISA y donde podría conseguir esta información.

3) Mi siguiente duda tiene que ver con el manejo de eventos. Pese a que mi aplicación inicial es muy simple (abre sesiones, muestra por pantalla ID del instrumento, pone en fullscreen, captura pantalla y transfiere archivo) he notado que hay cierto solapamiento, es decir, hay ocasiones en que se captura la imagen antes de que la pantalla esté completa. Incluso hay veces que no se pone en full screen o bien el programa se cuelga. Un ejemplo del flujo de la aplicación sería este (he omitido el control de errores, que se haría con la variable satus):

status = viQueryf(instr,"*IDN?\n","%100t",pb);
status = viPrintf(instr, ":display:fscreen on \n");
status = viPrintf(instr, ":mmem:store:screen 'C:/VISA.GIF' \n");
status = viQueryf(instr, ":mmem:data? 'C:/VISA.GIF' \n", "#%60000t", pr);

Entonces, si ocurre solapamiento, he de suponer que las funciones de la VISA (p.ej viPrintf) devuelven un valor a status cuando se consideren completas. Y he de suponer que se consideran completas cuando terminen de escribir el comando SCPI en el buffer de escritura, lo cual no garantiza que el instrumento haya terminado de procesar el comando SCPI. ¿EStoy en lo cierto o me equivoco en algo? Por todo esto imagino que es necesario el uso de eventos, pero... ¿los eventos pueden usarse para alertarme de que el instrumento ha terminado de procesar el comando SCPI y ha realizado la acción pertinente quedando por tanto ocioso o simplemente me avisan de que ha recibido correctamente el comando?

4) Finalmente la gran duda. Tengo problemas para transferir la imagen .gif al pc y visualizarla correctamente. Como ya habeis visto antes, uso el comando:

status = viQueryf(instr, ":mmem:data? 'C:/VISA.GIF' \n", "#%60000t", pr);

donde pr es un puntero a un array de caracteres (string). Estoy un poco confuso porque en algunos ejemplos veo que usan el formato %y (binary data), otros %b (488.2 block program data). La verdad es que no tengo ni idea de como es la forma correcta y como hacer una conversión sencilla para que me aparezca en mi pc un fichero .gif que se pueda abrir correctamente. Se que la cabecera que se añade al .gif es de la forma #XYYYYY con X el tamaño del campo YYYYY y con YYYYY el tamaño del gif propiamente. Pero no hay ningun ejemplo de como usar esa cabecera en C++ y de como generar el archivo correctamente. ¿Podríais ayudarme con esa parte del código?

5) Una última cuestión. He notado que el buffer de lectura de la VISA no se vacía con cada acceso, a diferencia del de escritura que sí lo hace siempre que cada comando SCPI vaya terminado en un END (\n). ¿Que me recomendais para el vaciado del read buffer? ¿Uso un viFlush tras cada lectura o bien cambio el atributo de modo de operación del buffer para que se vacíe automaticamente tras cada acceso?


Muchas gracias de antemano por vuestra ayuda. Espero que no os molesteis por la cantidad que he escrito pero es que estoy un poco perdido! Si los moderadores lo consideran necesario puedo poner cada duda en un thread distinto para no amontonar conceptos en un solo tema. Nuevamente MUCHAS GRACIAS!





0 kudos
Mensaje 1 de 1
4.226 Vistas