Files
PBSwissMX/qt/ESB_MX_SmarAct_home.py

147 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python
#*-----------------------------------------------------------------------*
#| |
#| Copyright (c) 2014 by Paul Scherrer Institute (http://www.psi.ch) |
#| |
#| Author Thierry Zamofing (thierry.zamofing@psi.ch) |
#*-----------------------------------------------------------------------*
'''
Homing procedure for PPRM.
Long Doc'''
#for ID in 1 2 3 4 5 6
#do
#caput MYPREFIX:MOTOR_$ID.RLV 55
#caput MYPREFIX:MOTOR_$ID.SET Set
#caput MYPREFIX:MOTOR_$ID.VAL 0
#caput MYPREFIX:MOTOR_$ID.SET Use
#done
#for ID in 1 2 3 4 5 6
#do
#caput MYPREFIX:MOTOR_$ID.RLV -10
#done
import logging, sys, os, json
import CaChannel,time
class EsbMxSmaract:
def __init__(self, args):
self.args=args
prefix=self.args.var[0]
if prefix[-1]==':':prefix[:-1]
self.prefix=prefix
self.pv=pvDict=dict()
for i in range(1,16):
#SARES30-ESBMX1:FRM_FORW.PROC
#SARES30-ESBMX1:DRIVE
s1=prefix+'%i'%i
for j in ('DRIVE','MOTRBV','FRM_FORW.PROC','FRM_BACK.PROC','GET_HOMED','STATUS'):
s2=s1+':'+j
print(s2)
pv = CaChannel.CaChannel(s2)
pv.setTimeout(10.0)
pv.search()
pvDict[s2]=pv
CaChannel.ca.pend_io(10.0)
#print(pvDict)
#pvDict['cryorbv'] = CaChannel.CaChannel("SAR-EXPMX:MOT_CRYO.RBV")
#pvDict['cryorbv'].search()
def home(self,idx,fwd):
print('home motor %i fwd:%d...'%(idx,fwd))
if fwd:
pv=self.pv[self.prefix+'%i'%idx+':'+'FRM_FORW.PROC']
else:
pv=self.pv[self.prefix+'%i'%idx+':'+'FRM_BACK.PROC']
pv.putw(1) #set position and move
CaChannel.ca.pend_event(0.1)
def waitHomed(self,idx):
pv=self.pv[self.prefix+'%i'%idx+':'+'GET_HOMED']
while pv.getw()==0:
print('wait motor %i homing done ...'%idx)
CaChannel.ca.pend_event(0.2)
def moveAbs(self,idx,val):
pv=self.pv[self.prefix+'%i'%idx+':'+'DRIVE']
pv.putw(val) #set position and move
def check_pos(self, idx, val, tolerance=0.1):
pvrbv = self.pv[self.prefix+'%i'%idx+':'+'MOTRBV']
pvst = self.pv[self.prefix+'%i'%idx+':'+'STATUS']
CaChannel.ca.pend_event(0.2)
while pvst.getw():
CaChannel.ca.pend_event(0.2)
rbv=pvrbv.getw()
if abs(val - rbv) > tolerance:
raise Exception("failed to reach target value %g,%g,%g"%(val,rbv,tolerance))
def homing(self):
#start homing in desired direction
#cryorbv = self.pv['cryorbv']
#if cryorbv.getw() < 4.9:
# raise Exception("Cryojet is too close, move it to 5.0 mm")
# home Colli Y first and move it to the TOP
self.home(2, True)
CaChannel.ca.pend_event(0.5)
self.waitHomed(2)
CaChannel.ca.pend_event(0.5)
self.moveAbs(2, 10.0)
self.check_pos(2, 10.0)
for idx,fwd in ((1,True),(4,True),(5,True),(6,True),(7,True),(8,True),(10,True),(11,True),(12,True),(13,True),(14,True),(15,True),):
self.home(idx,fwd)
CaChannel.ca.pend_event(0.5)
#wait homing done
for idx in (1,4,5,6,7,8,10,11,12,13,14,15,):
self.waitHomed(idx)
#move to desired position
for idx,val in ((1,-10),(4,.4),(5,.5),(6,.6),(7,.7),(8,.8),(10,1.0),(11,1.1),(12,1.2),(13,1.3),(14,1.4),(15,1.5),):
self.moveAbs(idx,val)
print('Homing done')
if __name__=='__main__':
from optparse import OptionParser, IndentedHelpFormatter
class MyFormatter(IndentedHelpFormatter):
'helper class for formating the OptionParser'
def __init__(self):
IndentedHelpFormatter.__init__(self)
def format_epilog(self, epilog):
if epilog:
return epilog
else:
return ""
def parse_args():
'main command line interpreter function'
#usage: gpasciiCommunicator.py --host=PPMACZT84 myPowerBRICK.cfg
(h, t)=os.path.split(sys.argv[0]);cmd='\n '+(t if len(h)>3 else sys.argv[0])+' '
exampleCmd=('SARES30-ESBMX',
)
epilog=__doc__+'''
Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n '
fmt=MyFormatter()
parser=OptionParser(epilog=epilog, formatter=fmt)
#parser.add_option('', '--host', dest='host', help='hostname (or none to use locally)', metavar='HOST')
#parser.add_option('-v', '--verbose', type="int", dest='verbose', help='verbosity bits (see below)', default=0)
(args, other)=parser.parse_args()
print(args,other)
args.var=other
esbMxSmaract=EsbMxSmaract(args)
esbMxSmaract.homing()
#os.environ['EPICS_CA_ADDR_LIST']='localhost'
parse_args()