Saltar al contenido principal
Artículos técnicos

Medir temperaturas con un Keithley DAQ6510 por SCPI


El DAQ6510 escanea decenas de canales y lo guarda todo en su memoria. Para aprovecharlo desde un programa hay que entender tres piezas: la configuración de cada canal, el escaneo y el buffer donde caen las lecturas.

En el banco de ensayos de PLATO, el DAQ6510 medía temperaturas con sondas PT100 a cuatro hilos. Aquí va lo necesario para hacer lo mismo desde Python, sin más librerías que un socket.

La conexión: SCPI sobre TCP, puerto 5025

El equipo acepta comandos SCPI en el puerto TCP 5025, uno por línea y terminados en salto de línea:

import socket

class DAQ6510:
    def __init__(self, host, port=5025, timeout=60):
        self.sock = socket.create_connection((host, port), timeout=timeout)
        self.lector = self.sock.makefile("rb")

    def write(self, comando):
        self.sock.sendall((comando + "\n").encode("ascii"))

    def query(self, comando):
        self.write(comando)
        return self.lector.readline().decode("ascii").strip()

daq = DAQ6510("192.168.1.60")
print(daq.query("*IDN?"))

Configurar los canales

Cada ajuste se aplica a una lista de canales. Para cinco PT100 a cuatro hilos en los canales 101 a 105 de la tarjeta:

canales = "(@101:105)"
daq.write("*RST")
daq.write(f'SENS:FUNC "TEMP", {canales}')
daq.write(f"SENS:TEMP:TRAN FRTD, {canales}")       # RTD a cuatro hilos
daq.write(f"SENS:TEMP:RTD:FOUR PT100, {canales}")
daq.write(f"SENS:TEMP:UNIT CELS, {canales}")

Con termopares cambia el transductor (SENS:TEMP:TRAN TC) y se indica el tipo (SENS:TEMP:TC:TYPE K, por ejemplo). El resto del flujo es igual.

Escanear y leer el buffer

Las lecturas no se piden una a una: se define un escaneo (qué canales, cuántas veces y cada cuánto), se lanza y después se recoge todo del buffer.

daq.write('TRAC:MAKE "ensayo", 10000')
daq.write('ROUT:SCAN:BUFF "ensayo"')
daq.write(f"ROUT:SCAN:CRE {canales}")
daq.write("ROUT:SCAN:COUN:SCAN 10")    # 10 pasadas...
daq.write("ROUT:SCAN:INT 5")           # ...cada 5 segundos
daq.write("INIT")
daq.write("*WAI")

n = int(daq.query('TRAC:ACT? "ensayo"'))
datos = daq.query(f'TRAC:DATA? 1, {n}, "ensayo", CHAN, TST, READ')
# canal, marca de tiempo y lectura, separados por comas

Los errores típicos

El timeout tiene que cubrir el escaneo entero. *WAI hace que el equipo no conteste a nada hasta terminar. Con 10 pasadas cada 5 segundos, la consulta siguiente tarda casi un minuto: si el programa espera menos, da error aunque todo vaya bien. La regla es timeout > pasadas × intervalo + lo que dura una pasada.

Un buffer con un nombre que ya existe da error. Si el programa crea siempre el mismo buffer al arrancar, la segunda vez el panel muestra el error 1115. O se borra antes (TRAC:DEL "ensayo") o se reutiliza vaciándolo (TRAC:CLE).

Una respuesta vacía no es una temperatura. Si la red se corta a mitad de lectura, lo que llega puede estar incompleto. Hay que comprobar cada respuesta antes de guardarla y reintentar, en lugar de registrar un valor falso.

Del script al banco de ensayo

En un banco real, este escaneo corre en bucle durante horas o días, sus datos se guardan junto a los de los controladores de temperatura y el resto de equipos, y alguien tiene que enterarse si un canal se dispara. Eso es lo que construimos a medida.

Cuéntanos tus ensayos


Qué equipos tenéis, qué ensayos hacéis y qué os gustaría que hiciera el software. Con eso te decimos cómo lo plantearíamos.

Contactar

Lake Shore, Thorlabs, Keithley, Energetiq, Standa, EKSMA Optics, Symétrie, Pfeiffer Vacuum y el resto de marcas citadas pertenecen a sus respectivos titulares. BLASAI Software no tiene relación comercial con ellos; se nombran solo para indicar con qué equipos hemos trabajado.