esrf

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

#%TITLE% jena.mac
#%NAME%
#   Jena
#%DESCRIPTION%
#  Macros to work with a Jena piezosystem both trough a GPIB
#  connection or a serial interface. Piezos will be seen as
#  motors in SPEC
#
#  This macro set was adapted by DFC from another one installed 
#  on ID13 by Vicente Rey. Uses a new Interface EDA3 (RS232 and GPIB)
#  12 bits or EDA5 16 bits
#
#  How to configure the jena piezos as pseudo motors
#  in the setup file.
#  	jenasetup 1 1 0 0 2 "xd 0 40" "z 1 40"
#
#       jenasetup <no_ctrls><gpib/ser><addr><12/16 bits><mot_mne><chan><40>
#              
#
#%UU%
#%MDESC%
#   Prompts or receive parameters for the piezos
def jenasetup '
{
 global JENA_NO JENA_MNE JENA_NOMOT JENA_ADD JENA_OLD 
 global JENA_CH JENA_TYPE JENA_ITF JENA_DAC
 global JENAON JENA_FEEDBACK
 global JENA_CNTRL JENA_RANGE

 local nparam cparam param

 # max channels per unit
 JENA_CNTRL = 8

 jenaoff

 if (!$#) {

   tty_cntl("md")
   printf("\nPiezosystem Jena Setup\n")
   printf("\n jenasetup <no> {<gpib|ser> <addr> <12|16bit> <nomot> {<mne> <ch> <type> <fdbk>}\n\n")
   tty_cntl("me")

   JENA_NO  = getval("  How many JENA controllers do you have",JENA_NO)

   for (i=0;i<JENA_NO;i++) {

     tty_cntl("md")
     printf("\n  JENA controller %d:\n",i+1)
     tty_cntl("me")

     JENA_ITF[i] = getval("\tInterface (0=gpib/1=serial) " ,JENA_ITF[i])
     if (JENA_ITF[i] != 1) {
        JENA_ADD[i] = getval("\tGpib address:               " ,JENA_ADD[i])
     } else {
        JENA_ADD[i] = getval("\tSpec serial ifce number:    " ,JENA_ADD[i])
     }
     JENA_DAC[i] = getval("\tDAC 0=12 bits / 1=16 bits   ", JENA_DAC[i])

      JENA_NOMOT[i] = getval("\tNumber of piezos            ",JENA_NOMOT[i])

     for (j=0;j<JENA_NOMOT[i];j++) {
        tty_cntl("md")
        printf("\n\tPiezo %d\n",j+1)
        tty_cntl("me")
        JENA_MNE[i*JENA_CNTRL+j] = getval("\t\tMotor name                 ",JENA_MNE[i*JENA_CNTRL+j])
        JENA_CH[i*JENA_CNTRL+j]  = getval("\t\tChannel                    ",JENA_CH[i*JENA_CNTRL+j])

        if (JENA_TYPE[i*JENA_CNTRL+j] & 0x08000000) JENA_TYPE[i*JENA_CNTRL+j] = 40

        JENA_TYPE[i*JENA_CNTRL+j]= getval("\t\tENV board type(40,150,400) ",JENA_TYPE[i*JENA_CNTRL+j])

        if ((JENA_TYPE[i*JENA_CNTRL+j] != 40) &&  (JENA_TYPE[i*JENA_CNTRL+j] != 150) && (JENA_TYPE[i*JENA_CNTRL+j] != 400 )) {
                printf("\t\t   Bad board type. Setting ENV40\n")
                JENA_TYPE[i*JENA_CNTRL+j] = 40
        } else {
		JENA_RANGE[i*JENA_CNTRL+j] = 0 # 0 => 0..10V
				    # 1 => 0..5V
				    # 2 => +-10 V
				    # 3 => +- 5 V
	}
        JENA_FEEDBACK[i*JENA_CNTRL+j]  = yesno("\t\tRead Values from Jena      ",JENA_FEEDBACK[i*JENA_CNTRL+j])
     }
   }
 } else {
   nparam = split("$*",param)
   JENA_NO = param[0]
   for (i=0;i<JENA_NO;i++) {
      JENA_ITF[i]   = param[1 + cparam] 
      JENA_ADD[i]   = param[2 + cparam] 
      JENA_DAC[i]   = param[3 + cparam] 
      JENA_NOMOT[i] = param[4 + cparam]
      cparam+=4
      for (j=0;j<JENA_NOMOT[i];j++) {
         JENA_MNE[i*JENA_CNTRL+j]   = param[1 + cparam]
         JENA_CH[i*JENA_CNTRL+j]    = param[2 + cparam]
         JENA_TYPE[i*JENA_CNTRL+j]  = param[3 + cparam]
         JENA_FEEDBACK[i*JENA_CNTRL+j]  = param[4 + cparam]
         cparam+=4
      }
    }
   
 }

   jena_def
   jenainit

   setup_tail("jena")
}
'

#%IU%
#%MDESC%
#
def jenabody(mode) '{
    if (mode == 1) {
       if (JENAON) {
          jenaoff
       } else {
          jenaon
       }
    }
    return(JENAON?"On":"Off")
}'

#%IU%
#%MDESC%
#
def jenaoff '{
   JENAON=0
   for (i=0;i<JENA_NO;i++) {
      for (j=0;j<JENA_NOMOT[i];j++) {
        cdef("","",JENA_MNE[i*JENA_CNTRL+j],"delete")
      }
   }
   cdef("","","JENA","delete")
}'

#%IU%
#%MDESC%
#
def jenaon '{
   JENAON=1
   jena_def
}'

#%IU%
#%MDESC%
#
def jenaunsetup '{
   jenaoff
}'

#%IU%
#%MDESC%
#  Initializes all channels and sets current/voltage to zero
#  It is called from setup and the after each reconfig/resetup
def jenainit '{
local i j cmd num ret

  for (i=0;i<JENA_NO; i++) {
     for (j=0;j<JENA_NOMOT[i];j++) {
        cmd = sprintf("cset,%d,1",JENA_CH[i*JENA_CNTRL+j])
        ret = jenacmd(i,cmd)
        if (ret == -1) {
          # It the device is down or unreachable for some reason, it is best to
          # disable the corresponding counter because of the gpib timeout.
          print "Jena motor \""JENA_MNE[i*JENA_CNTRL+j]"\" is unusable."
          motor_par(motor_num(JENA_MNE[i*JENA_CNTRL+j]),"disable",1)
        } else {
          cmd = sprintf("setk,%d,1",JENA_CH[i*JENA_CNTRL+j])
          jenacmd(i,cmd)
          cmd= sprintf("amt,%d,10", JENA_CH[i*JENA_CNTRL+j])
          jenacmd(i,cmd)
        }
     }
     #cmd = "ke"
     #jenacmd(i,cmd)
  }

  for (i=0;i<JENA_NO;i++) {
    for (j=0;j<JENA_NOMOT[i];j++) {
        num = motor_num(JENA_MNE[i*JENA_CNTRL+j])
        if (!motor_par(num,"disable")) {JENA_OLD[i*JENA_CNTRL+j] = 0;chg_dial(num,A[num])}
    } 
  }


}'

#%IU%
#%MDESC%
#
def jena_def '{
  for (i=0;i<JENA_NO; i++) {
    for (j=0;j<JENA_NOMOT[i]; j++) {
        cdef("user_checkall",sprintf("jenamove(%d,%d)\n",i,j),JENA_MNE[i*JENA_CNTRL+j],0x01)
        cdef("user_getpangles",sprintf("jenaget(%d,%d)\n",i,j),JENA_MNE[i*JENA_CNTRL+j],0x01)
        cdef("user_getcounts", sprintf("jenacount(%d,%d)\n",i,j), JENA_MNE[i*JENA_CNTRL+j])
    }
  } 
  cdef("user_config","jenainit;","JENA")
}'


#%IU%
#%MDESC%
#
def jenamove(i,j) '{
  local num max value cmd

  num = motor_num(JENA_MNE[i*JENA_CNTRL+j])
  if (num != -1 && JENA_OLD[i*JENA_CNTRL+j] != A[num]) {
      value = A[num]*motor_par(num,"step_size")
      max = JENA_DAC[i]?65535:4095;  # 16 or 12 bits
      if (value>max) 
	      printf("Jena Warning: Sending %d, Max %d\n",value,max)
      cmd = sprintf("set,%d,%d",JENA_CH[i*JENA_CNTRL+j],value)
      jenacmd(i,cmd)

      JENA_OLD[i*JENA_CNTRL+j] = A[num]
      chg_dial(num,A[num])
#      chg_offset(num,A[num])
  }
}'

#%IU%
#%MDESC%
#
def jenaget(i,j) '{
  local num ans bla cmd

  if (JENA_FEEDBACK[i*JENA_CNTRL+j]) {
  	num = motor_num(JENA_MNE[i*JENA_CNTRL+j])

  	#if (num != -1 && JENA_OLD[i*JENA_CNTRL+j] != A[num]) {
  	if (num != -1) {
      		cmd = sprintf("rk,%d,%d",JENA_CH[i*JENA_CNTRL+j],JENA_RANGE[i*JENA_CNTRL+j])
      		ans = jenaread(i,cmd)

      		split(ans,bla,",")
      		A[num] = bla[2]/motor_par(num,"step_size")

      		#JENA_OLD[i*JENA_CNTRL+j] = A[num]
      		chg_dial(num,A[num])
      		#chg_offset(num,A[num])
  	}
  }
  
}'

def jenacount(i,j) '{
    local cntmne cntnum cmd ans bla motnum
    if (JENA_FEEDBACK[i*JENA_CNTRL+j]) {
       cntmne= sprintf("%scnt", JENA_MNE[i*JENA_CNTRL+j])
       cntnum= cnt_num(cntmne)
       motnum= motor_num(JENA_MNE[i*JENA_CNTRL+j])
       if (cntnum != -1) {
          cmd = sprintf("rk,%d,%d",JENA_CH[i*JENA_CNTRL+j],JENA_RANGE[i*JENA_CNTRL+j])
          ans = jenaread(i,cmd)

          split(ans,bla,",")
          S[cntnum]= bla[2]/motor_par(motnum,"step_size")
       }
    }
}'

#%UU% 
#%MDESC% start the current programmed function on channel 0, see jena_setsin macro.
def jena_start '{
  local cmd
  jenacmd(0,"start,0")
}'
#%UU% 
#%MDESC% stop the current programmed function on channel 0, see jena_setsin macro.
def jena_stop '{
  local cmd
  jenacmd(0,"stop,0")
}'

#%UU% <offset> <amplitude> <frequency> <points/period> <num. periods> <initial angle> <divider>
#%MDESC% set parameters for the SINUS function on channel 0.
def jena_setsin '{
  local cmd
  if ($#!= 7) {
    print "$0 usage: $0 <offset> <amplitude> <frequency> <points/period> <num. periods> <initial angle> <divider>"
    exit
  }
  cmd = sprintf("setsi,0,%d,%d,%d,%d,%d,%d,%d,%d",$1,$2,$3,$4,$5,$6,0,$7,1)
  jenacmd(0,cmd)
}'

#%IU%
#%MDESC%
#
def jenacmd(unit,cmd) '{
   local addr
   local ret

   addr = JENA_ADD[unit]

   if (JENA_ITF[unit] == 0 ) {
      ret=gpib_put(addr,sprintf("%s\r\n",cmd))
      #if the write failed 0 is returned as the number of char written.   
      ret = ((ret==0)?-1:ret)
   } else {
      ret = ser_put(addr,sprintf("%s\r\n",cmd))
   }
   return ret 
}'
#%IU%
#%MDESC%
#
def jenaread(unit,cmd) '{
   local addr
   local ret

   addr = JENA_ADD[unit]

   if (JENA_ITF[unit] == 0 ) {
      gpib_put(addr,sprintf("%s\r\n",cmd))
      sleep(.2)
      ret=gpib_get(addr)
   } else {
      ser_put(addr,sprintf("%s\r\n",cmd))
      ret=ser_get(addr,"\n")
   } 
   return(ret)
}'

#%MACROS%
#%IMACROS%
#%DEPENDENCIES%
#  To use a jena as a motor the following conditions have to be fulfilled:
#%UL%
#%LI% The file jena.mac has to be read in         done by: startup script
#%LI% the jena motors have to be configured       done by: config
#       (Controller NONE, mnemonic as in startupscript)
#%LI% setup the jenas ( with jenasetup )          done by: setup
#%XUL%
#%AUTHOR% V.Rey Bakaikoa 28/1/1997 . DFC 27/06/2001
#%TOC%