El Lake Shore 336 es uno de los controladores de temperatura más habituales en ensayos térmicos y de vacío. En el banco de ensayos de las cámaras de PLATO funcionaban tres a la vez. Esto es lo que conviene saber para manejarlo desde un programa en lugar de desde el panel frontal.
La conexión: un socket TCP en el puerto 7777
Por Ethernet, el 336 escucha en el puerto TCP 7777. No hace falta ninguna librería: basta un socket, enviar el comando como texto y leer hasta el final de línea. Lo primero que se envía es *IDN?; si la respuesta no empieza por LSCI, no estamos hablando con un Lake Shore.
import socket
class LakeShore336:
def __init__(self, host, port=7777, timeout=3.0):
self.sock = socket.create_connection((host, port), timeout=timeout)
self.pendiente = b""
def write(self, comando):
self.sock.sendall((comando + "\r\n").encode("ascii"))
def query(self, comando):
self.write(comando)
while b"\r\n" not in self.pendiente:
trozo = self.sock.recv(1024)
if not trozo:
raise ConnectionError("el controlador ha cerrado la conexion")
self.pendiente += trozo
linea, self.pendiente = self.pendiente.split(b"\r\n", 1)
return linea.decode("ascii").strip()
ls = LakeShore336("192.168.1.50")
if not ls.query("*IDN?").startswith("LSCI"):
raise RuntimeError("no es un Lake Shore")
print(float(ls.query("KRDG? A"))) # temperatura del canal A, en kelvin
KRDG? devuelve la lectura en kelvin y CRDG? en grados Celsius, seguidos del canal (A, B, C o D).
Tres detalles que cuestan horas
Pon siempre un tiempo de espera al conectar. Si el equipo está apagado o la IP es otra, una conexión sin timeout puede quedarse colgada un par de minutos antes de fallar. Con tres segundos el programa avisa enseguida.
Termina todos los comandos. Cada comando debe ir seguido del fin de línea. El equipo no procesa nada hasta recibirlo, así que una consulta sin terminar se queda sin respuesta y el programa esperando. Revisando un driver real encontramos justo eso: una consulta que salía sin él. Centralizar el envío en un solo método, como write() arriba, evita que se escape uno.
Solo admite dos conexiones a la vez. Es el que más sorprende. Si una interfaz gráfica, un registrador de datos y un script de ensayo intentan conectarse cada uno por su cuenta, el tercero falla. La solución que se usó en PLATO, y la que recomendamos, es que un único proceso sea el dueño del equipo y que el resto le pida las lecturas o las órdenes a él.
Rampas y consignas
Para un ciclo térmico se fija la velocidad de rampa, la consigna y el rango del calefactor de la salida que corresponda:
ls.write("RAMP 1,1,2.0") # salida 1: rampa activada, 2 K/min
ls.write("SETP 1,250.0") # consigna de la salida 1: 250 K
ls.write("RANGE 1,3") # calefactor de la salida 1 en rango alto
Antes de dar potencia hay que tener configurado el calefactor (resistencia y corriente máxima, con HTRSET) y unos PID razonables; el 336 tiene autoajuste (ATUNE) para encontrarlos. Después, el programa solo tiene que leer cada pocos segundos, guardar los datos y comprobar que la temperatura sigue a la consigna.
Del script al banco de ensayo
Con esto se tiene un script que funciona. Para un banco de ensayo de verdad falta lo que hace que se pueda dejar solo: reconectar si se corta la red, registrar las temperaturas junto a las del resto de equipos, avisar si algo se sale de rango y encadenar el ciclo térmico con la adquisición. Eso es lo que hacemos a medida para cada laboratorio.