Files
x11ma/script/beamline_init/InitFE.py
2021-12-14 14:25:13 +01:00

124 lines
3.7 KiB
Python

import time
import traceback
running = False
counts = {}
encoder_raw = {}
def crossZero(encoder):
global counts
global encoder_raw
try:
time.sleep(1.0)
counts[encoder]=0
if caget(encoder+".RVAL") > 0:
encoder_raw[encoder]=1
elif caget(encoder+".RVAL") < 0:
encoder_raw[encoder]=-1
def on_change(value):
global counts
global encoder_raw
if (encoder_raw[encoder]==1 and value < 0):
counts[encoder]=counts[encoder]+1
encoder_raw[encoder]=-1
print "Zero on" , encoder, "crossed"
elif(encoder_raw[encoder]==-1 and value > 0):
counts[encoder]=counts[encoder]+1
encoder_raw[encoder]=1
print "Zero on" , encoder, "crossed"
#if int(value) == 0:
# print "Raw vlaue on" , encoder, "crossed", value
# counts[encoder]=counts[encoder]+1
with Channel(encoder+".RVAL", callback=on_change, monitored=True, name="test") as ch:
while(running==True):
time.sleep(0.1)
print "Encoder "+encoder +" crossed 0 "+ str(counts[encoder]) + " times"
return counts[encoder]
except:
print "Exception counting "+str(encoder)
traceback.print_exc()
raise
def init():
try:
global running
running = True
print "startint FE slit initilization"
cenV = caget('X11MA-FE-SV:center')
cenH = caget('X11MA-FE-SH:center')
offV = caget('X11MA-FE-DSVER.A')
offH = caget('X11MA-FE-DSHOR.A')
print "Old motor positions: centerV = " +str(cenV)+ \
", centerH = " +str(cenH)+ \
", offset V = " +str(offV)+ \
", offset H = " +str(offH)
print "Initializing UP motor."
caput('X11MA-FE-DSUP:II.PROC',1)
time.sleep(1.0)
cawait('X11MA-FE-SV1:TR1.DMOV', 1)
print "Initializing DOWN motor."
caput('X11MA-FE-DSDW:II.PROC',1)
time.sleep(1.0)
cawait('X11MA-FE-SV1:TR2.DMOV', 1)
print "Initializing RING motor."
caput('X11MA-FE-DSRI:II.PROC',1)
time.sleep(1.0)
cawait('X11MA-FE-SH1:TR1.DMOV', 1)
print "Initializing WALL motor."
caput('X11MA-FE-DSWA:II.PROC',1)
time.sleep(1.0)
cawait('X11MA-FE-SH1:TR2.DMOV', 1)
print "Setting offH and offV to 0."
caput('X11MA-FE-DSVER.A',0)
caput('X11MA-FE-DSHOR.A',0)
print "Checking encoder offset values."
if(abs(caget('X11MA-FE-SV1:EC1Off')+42683)>10):
print "Up position not ok"
elif(abs(caget('X11MA-FE-SV1:EC2Off')+41362)>10):
print "Down position not ok"
elif(abs(caget('X11MA-FE-SH1:EC1Off')+40782)>10):
print "Ring position not ok"
elif(abs(caget('X11MA-FE-SH1:EC2Off')+39548)>10):
print "Wall position not ok"
else:
print "All positions OK"
print "restoring Center and off values"
caput('X11MA-FE-SV:center',cenV)
caput('X11MA-FE-SH:center',cenH)
caput('X11MA-FE-DSVER.A',offV)
caput('X11MA-FE-DSHOR.A',offH)
running = False
return 0
except:
print "Exception in init"
traceback.print_exc()
raise
#Fork and join
futures = fork(init,(crossZero,("X11MA-FE-SV1:EC1",)), \
(crossZero,("X11MA-FE-SV1:EC2",)), \
(crossZero,("X11MA-FE-SH1:EC1",)), \
(crossZero,("X11MA-FE-SH1:EC2",)) )
ret = join(futures)
#check zero crossing status after init
zerocr=True
for i in range(1,4):
if(ret[i] != 2):
zerocr=False
#final status report
print "Zero crossing status for all motors: %s" %("OK" if zerocr == True else "Not OK")
print "init FE-slits: ==> done. %s" % ("OK" if zerocr == True else "Not OK")