Control de dispositivos VISA a través de Ethernet en Linux

Gran parte de los equipos utilizados en sistemas de telecomunicaciones como los analizadores de espectros, osciloscopios, etc. han utilizado mayormente el sistema GPIB para comunicarse entre ellos y un PC.

GPIB es un estándar de bus digital con corto alcance diseñado por HP para conectar dispositivos de teste y medidas con PCs. Este sistema fue diseñado para ser robusto y fiable en entornos industriales, pero tiene el problema que en sistemas GNU/Linux su integración no es trivial (instalación de módulos en el kernel…) y su mantenimiento es cuestionable. Aparte como se he comentado, es un bus de corto alcance, lo cual establece ciertas limitaciones lógicas que no permite aprovechar el nivel tecnológico actual, como podría ser controlar un analizador de espectro remoto a través de una conexión 3G.

Es por eso que cada vez mas equipos disponen de una interfaz Ethernet que ofrecen nuevas funcionalidades de control y diseño de infraestructuras de control y medida.

El protocolo utilizado para controlar dichos dispositivos es conocido como VXI11. aunque en muchos caso lo mas fácil es buscar por Ethernet VISA (Virtual Instrument Software Architecture) que es el estándar que engloba todo los protocolos de control de hardware de medida.

En esta pagina encontrareis mas información sobre VXI11 y referencias a las empresas implicadas en el desarrollo y mantenimientos de estas tecnologías. Además se encuentra el código fuente en el que nos basaremos para nuestro howto.

El código que podéis descargar aquí es el mismo que esta en la pagina anterior, salvo que se han añadido los archivos libvxi11.cpp y libvxi11.h y se ha modificado el Makefile para generar la librería libvisa.so

http://dl.dropbox.com/u/15629561/ikeralbeniz.net/libvisa_src.zip

El contenido de libvxi11.cpp es el siguiente:


#include "libvxi11.hpp"

#define BUF_LEN 100000

using namespace std;

CLINK		*clink;

extern "C" int visaConnect(const char * device_ip)
{
    clink = new CLINK;
    int response = -1;
    try {
        response=vxi11_open_device(device_ip,clink);
    }catch( char * str ) {
      cout << "Exception raised: " << str << '\n';
    }
    return response;
}

extern "C" int visaSend(const char * command)
{
    int response= vxi11_send(clink, command);
    return response;
}

extern "C" long visaReceive(char buffer[], int buffer_length)
{
    long bytes_returned = vxi11_receive(clink, buffer, BUF_LEN);
    return bytes_returned;
}

extern "C" int visaClose(const char * device_ip)
{
    int response=vxi11_close_device(device_ip,clink);
    return response;
}

Lo único que hacemos es exponer cuatro funciones básicas para el manejo de equipos de medida a través de Ethernet/VXI11.

En caso de querer utilizar esta librería en c++ solo seria necesario incluir el archivo libvxi11.h y la librería libvisa.so.

#ifndef LIBVXI11_HPP_INCLUDED
#define LIBVXI11_HPP_INCLUDED

#include <iostream>
#include "vxi11_user.h"

using namespace std;

extern "C" int visaConnect(const char * device_ip);
extern "C" int visaSend(const char * command);
extern "C" long visaReceive(char buffer[], int buffer_length);
extern "C" int visaClose(const char * device_ip);



#endif // LIBVXI11_HPP_INCLUDED

En caso de querer usarlo en .Net deberíamos crear una clase VISA y mediante DLLImport exponer los mismos métodos.

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.IO;

namespace MyProject
{
	public class VISA
	{
		public const string libpath = "libvisa.so";
			
		[DllImport(libpath)]
		public static extern int visaConnect(string device_ip);		
			
		[DllImport(libpath)]
		public static extern int visaSend(string command);
			
		[DllImport(libpath)]
		public static extern int visaReceive(byte[] buffer, int buffer_length);
			
		[DllImport(libpath)]
		public static extern int visaClose(string device_ip);
	}
}

Espero que este post os sea de gran ayuda.

Deja un comentario

Your email address will not be published. Please enter your name, email and a comment.

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>