esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]

#%TITLE% LS300.MAC
#%NAME% 
#   Macros for LakeShore Cryotronics Temperature Controller, series #300
#
#%CATEGORY% Temperature
#
#%LOG%
# $Log: ls300.mac,v $
# Revision 1.2  2008/07/17 15:19:44  rey
# doc changes
#
#  Revision 1.1  2004/07/06 09:15:19  beteva
#  Initial revision
#
#%DESCRIPTION%
# The %B%RS232%B% serial interface allows remote control. The parameters
#of the serial line are:%BR%
#       - 7 bits%BR%
#       - odd%BR%
#       - 1 stop bit%BR%
#       - 9600 bauds%BR%
#       - raw oddp (in the SPEC config)%BR%
#       _ terminators CR(0xd)LF(0xa)
#%SETUP%
#The serial line cable is connected to the serial line interface card
#COMU 2000 (COMU 30), known as IBAM. A "device server" called SerialLine
#should be running in the VME crate, where the IBAM is. The configuration
#of the "server" can be found in a the resource file xxxSerilaLine.res,
#where xxx is the name of the crate (i.e. d291, id011 ...).
#%END%

#%UU% [sl_number]
#%MDESC% Set the serial line %B%sl_nb%B% to be used, as in the config of SPEC.
def ls_setup '{
global LS_SL LS_TOUT LS_PAR[]
local ret tmp
  if ($# == 2) {
    LS_SL = $1
    LS_TOUT = $2
  } else {
    LS_SL = getval("Serial line number (starting from 0):", LS_SL)
    LS_TOUT = getval ("Timeout between the commands [s] (recommended 0.3):", LS_TOUT)
  }
  ret = lsflush()
  if (ret == -1)
    LS_SL = 888
  else {
    ret = _t_ls_idn()
    if (ret == -1)
    LS_SL = 888
    else {
      split (ret,tmp,",")
      printf ("**** LakeShore %s set ****\n", tmp[1])
    }
  }
}'

def lsflush () '{
  return (ser_par(LS_SL,"flush",2))
}'
def ls_sp '{
local loop cmd
  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  loop = $1
  if ((loop != 1) && (loop != 2))
      loop = input("Loop number (1 or 2): ")
  cmd = sprintf ("SETP? %d", loop)
  printf ("loop %d setpoint %g\n", loop, _t_ls_cmd(LS_SL,cmd,0))
}'

def ls_ramp '{
local loop cmd ret res
  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  loop = $1
  cmd = sprintf ("RAMP? %d", loop)
  ret = _t_ls_cmd(LS_SL,cmd,0)
  split (ret,res,",")
  printf ("loop %d ramp rate %g degK/min, ramping %s\n", \
	loop, res[1], (res[0]==0)?"off":"on")
}'


#%UU%
#%MDESC%
def ls_analog '{
global LS_PAR[]
local i tmp par
local ret
  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  ret = _t_ls_analog(0,LS_PAR)
  if (ret == -1)
    eprintf ("Cannot get the analog output parameters\n")
  else {
    tty_cntl("md")
    printf ("  Current configuration:\n")
    tty_cntl("me")
    printf ("     Analog output: %s\n", LS_PAR[0] == 0 ? "unipolar":"bipolar")
    printf ("      Monitor mode: %s\n", LS_PAR[1] == 0 ? "off":\
	LS_PAR[1]==1?"input":LS_PAR[1]==2?"manual":LS_PAR[1]==3?"loop":"???")
    printf ("   Monitored input: %s\n", LS_PAR[2])
    printf ("        Input data: %s\n", LS_PAR[3] == 1 ? "Kelvin":\
	LS_PAR[3]==2?"Celsius":LS_PAR[3]==3?"Sensor units":\
	LS_PAR[3]==4?"linear equation":"???")
    printf (" High output value: %g\n", LS_PAR[4])
    printf ("  Low output value: %g\n", LS_PAR[5])
    printf ("Manual ouput value: %g\n", LS_PAR[6])
  }
  if ($# == 0)
    exit
  if ($# == 7) {
    split("$*",tmp)
    for (i=0; i<7; i++)
      LS_PAR[i] = tmp[i]
  } else {
    LS_PAR[0] = getval("Analog output - 0 (positive only) or 1 (bipolar):",\
	LS_PAR[0])
    LS_PAR[1] = getval("Monitor mode - 0(off), 1(input), 2(manual), 3(loop):",\
	LS_PAR[1])
    LS_PAR[2] = getval("Which input to monitor (A or B):", LS_PAR[2])
    LS_PAR[3] = getval("Input data - 1(Kelvin), 2(Celsius), 3(sensor units), 4(linear equation):",LS_PAR[3])
    LS_PAR[4] = getval("High output value:", LS_PAR[4])
    LS_PAR[5] = getval("Low output value:", LS_PAR[5])
    LS_PAR[6] = getval("Manual ouput value", LS_PAR[6])
  }
  if ((LS_PAR[0] != 0) && (LS_PAR[0] != 1)) {
    eprintf ("wrong unipolar/bipolan value %g\n", LS_PAR[0])
    exit
  }
  if ((LS_PAR[1] < 0) && (LS_PAR[1] > 3)) {
    eprintf("Wrong mode value %g\n", LS_PAR[1])
    exit
  }
  if ((LS_PAR[1] == 1) && (LS_PAR[4] <= LS_PAR[5])) {
    eprintf ("Wrong high/low values\n")
    exit
  }
  _t_ls_analog(1,LS_PAR)
}'

#%UU%
#%MDESC% Control Loop Mode
def ls_cmode '{
global LS_LOOP
local par[] tmp[]
  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  nb = split("$*",tmp)
  if (nb < 1)
    LS_LOOP = getval("Which control loop - 1 or 2:", LS_LOOP)
  else
   LS_LOOP = $1
  par[0] = LS_LOOP
  par[1] = _t_ls_cmode(0,par)
  tty_cntl("md")
  printf ("Present mode: %s\n", par[1] == 1 ? "Manual PID":par[1]==2?"Zone":\
	par[1]==3?"Open Loop":par[1]==4?"AutoTune PID":\
	par[1]==5?"AutoTune PI":par[1]==6?"AutoTune P":"???")
  tty_cntl("me")

  if (ret == -1) {
    eprintf ("Cannot get the control loop mode\n")
    exit
  }

  if ((tmp[1] < 1) || (tmp[1] > 6)) {
    par[1] = getval("Mode - 1(Manual PID), 2(Zone), 3(Open Loop), 4(AutoTune PID), 5(AutoTune PI), 6 (AutoTune P):", par[1])
    tmp[1] = par[1]
  }
  par[1] = tmp[1]
  _t_ls_cmode(1,par)
  tty_cntl("md")
  printf ("    New mode: %s\n", par[1] == 1 ? "Manual PID":par[1]==2?"Zone":\
	par[1]==3?"Open Loop":par[1]==4?"AutoTune PID":\
	par[1]==5?"AutoTune PI":par[1]==6?"AutoTune P":"???")
  tty_cntl("me")
}'
  
#%UU%
#%MDESC% Control Loop Parameter
def ls_cset '{
global LS_LOOP
local par[] tmp[] nb ret

  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  nb = split("$*",tmp)
  if (nb < 1)
    par[4]  = getval("Which control loop - 1 or 2:", par[4])
  else
    par[4] = $1
  ret = _t_ls_cset(0,par)
  if (ret == -1) {
    eprintf ("Cannot get the control loop parameters\n")
    exit
  }
  tty_cntl("md")
  printf ("Current parameters for loop %d:\n", par[4])
  tty_cntl("me")
  printf ("          Input: %s\n", par[0])
  printf ("          Units: %s\n", par[1] == 1 ? "Kelvin":\
	par[1]==2?"Celsius":par[1]==3?"Sensor units":"???")
  printf ("Power-up enable: %s\n", par[2] == 0 ? "off":par[2]==1?"on":"???")
  printf (" Heater display: %s\n\n", par[3] == 1 ? "current":\
	par[3]==2?"power":"???")
  if ((tmp[1] != "A") && (tmp[1] != "B")) {
    par[0] = getval("Input (A or B):", par[0])
    par[1] = getval("Units - 1(Kelvin), 2(Celsius), 3(Sensor units):", par[1])
    par[2] = getval("Power-up enable - 0(off), 1(on):", par[2])
    par[3] = getval("Heater display 1(current) 2(power):", par[3])
  } else {
    for (i=1; i<5; i++)
     par[i-1] = tmp[i]
    par[4] = tmp[0]
  }
  _t_ls_cset(1,par)
}'

#%UU%
#%MDESC%
def ls_range '{
local par tmp

  if (lsflush () == -1) {
    eprintf("Serial Line error, exiting...\n")
    exit
  }
  par = _t_ls_range(0,par)
  tty_cntl("md")
  printf ("Present range: %s\n", par == 0 ? "Off":par==1?"Low (0.5W)":\
	par==2?"Medium (5W)":"???")
  tty_cntl("me")

  if (par == -1)
    exit
  if ($# == 0)
    exit
  tmp = $1
  if (tmp != par) {
    if ((tmp < 0) || (tmp > 2)) {
      par = getval("Range - 0(Off), 1(Low - 0.5W), 2(Medium - 5W):", par)
      tmp = par
    }
    par = tmp
    _t_ls_range(1,par)
    tty_cntl("md")
    printf ("    New range: %s\n", par == 0 ? "Off":par==1?"Low (0.5W)":\
	par==2?"Medium (5W)":"???")
    tty_cntl("me")
  }
}'

#%UU%
#%MDESC%



###################### internal macros ###############################
#%IU%
#%MDESC%
def _t_ls_idn() '{
  return (_t_ls_cmd(LS_SL,"*IDN?",0))
}'

#%IU%
#%MDESC%
def _t_ls_analog(flag,par) '{
local cmd ret tmp
  if (flag == 0) {
    cmd = sprintf("ANALOG?")
    ret = _t_ls_cmd(LS_SL,cmd,0)
    if (ret != -1) {
      split(ret,par,",")
      ret = 0
    }
  } else if (flag == 1) {
    tmp = sprintf ("%g",LS_PAR[0])
    for (i=1; i<7; i++)
      tmp = sprintf ("%s,%s",tmp, LS_PAR[i])
    cmd = sprintf("ANALOG %s",tmp)
    ret = _t_ls_cmd(LS_SL,cmd,1)
  } else {
    cmd = sprintf("AOUT?")
    ret = _t_ls_cmd(LS_SL,cmd,0)
    if (ret != -1) {
      split(ret,par,",")
      ret = 0
    }
  }
  return (ret)
}'

#%IU%
#%MDESC%
def _t_ls_cmode(flag,par) '{
local cmd ret
  if (flag == 0) {
    cmd = sprintf("CMODE? %d", par[0])
    ret = _t_ls_cmd(LS_SL,cmd,0)
  } else {
    cmd = sprintf("CMODE %d,%d",par[0],par[1])
    ret = _t_ls_cmd(LS_SL,cmd,1)
  }
  return (ret)
}'

#%IU%
#%MDESC%
def _t_ls_cset(flag,par) '{
local cmd ret
local i l
  l = par[4]
  if (flag == 0) {
    cmd = sprintf("CSET? %d", l)
    ret = _t_ls_cmd(LS_SL,cmd,0)
    if (ret != -1) {
      split(ret,par,",")
      par[4] = l
    }
  } else {
    cmd = sprintf ("%g", par[4])
    for (i=0; i<4; i++)
      cmd = sprintf ("%s,%s",cmd,par[i])
    cmd = sprintf ("CSET %s", cmd)
    ret = _t_ls_cmd(LS_SL,cmd,1)
  }
  return (ret)
}'

#%IU% (flag,par)
#%MDESC%
def _t_ls_range(flag,par) '{
local cmd ret
  if (flag == 0) {
    cmd = sprintf("RANGE?")
    ret = _t_ls_cmd(LS_SL,cmd,0)
  } else {
    cmd = sprintf ("RANGE %d", par)
    ret = _t_ls_cmd(LS_SL,cmd,1)
  }
  return (ret)
}'

#%IU%
#%MDESC%

#%IU% (sl, cmd)
#%MDESC%
def _t_ls_cmd(sl, cmd, flag) '{
local lcmd ret

  ret = 0
  lcmd = sprintf ("%s\r\n", cmd)
  ret = ser_put(sl, lcmd)
  if ((ret != -1) && (flag == 0)) {
    sleep(LS_TOUT)
    ret = ser_get(sl)
    if (ret != -1)
      ret = substr(ret, 0, length(ret)-2)
  }
  return (ret)
}'

#%MACROS%
#%IMACROS%
#%AUTHOR% A.Beteva, BLISS%BR%
#$Revision: 1.2 $, $Date: 2008/07/17 15:19:44 $
#%TOC%