#%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%
|