280 lines
8.2 KiB
Python
Executable File
280 lines
8.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# *-----------------------------------------------------------------------*
|
|
# | |
|
|
# | Copyright (c) 2016 by Paul Scherrer Institute (http://www.psi.ch) |
|
|
# | |
|
|
# | Author Thierry Zamofing (thierry.zamofing@psi.ch) |
|
|
# *-----------------------------------------------------------------------*
|
|
|
|
#Testing the interferometer
|
|
'''
|
|
zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg$ gpasciiCommander --host $PPMAC -i
|
|
$$$***
|
|
!common()
|
|
!SAR-EXPMX1()
|
|
enable plc 1
|
|
Motor[1].MaxSpeed=25
|
|
Motor[2].MaxSpeed=25
|
|
|
|
X -12000 ..12000
|
|
Y -12000 .. 12000
|
|
Gather.Enable=0
|
|
Gather.Items=6
|
|
Gather.MaxSamples=1000000
|
|
Gather.Period=10
|
|
Gather.Addr[0]=Motor[1].DesPos.a
|
|
Gather.Addr[1]=Motor[2].DesPos.a
|
|
Gather.Addr[2]=Motor[1].ActPos.a
|
|
Gather.Addr[3]=Motor[2].ActPos.a
|
|
Gather.Addr[4]=Motor[6].ActPos.a
|
|
Gather.Addr[5]=Motor[7].ActPos.a
|
|
open prog 2
|
|
linear abs
|
|
X-12000 Y-12000
|
|
dwell 10
|
|
Gather.Enable=2
|
|
X-12000 Y12000
|
|
dwell 100
|
|
X-12000 Y-12000
|
|
dwell 100
|
|
X12000 Y-12000
|
|
dwell 100
|
|
X-12000 Y-12000
|
|
dwell 1000
|
|
Gather.Enable=0
|
|
close
|
|
#1..7j/
|
|
&1
|
|
b2r
|
|
|
|
download data with
|
|
PPMAC=SAR-CPPM-EXPMX1
|
|
PBGatherPlot -m24 -v7 --host $PPMAC --dat gather.txt
|
|
|
|
cat /tmp/gather.txt
|
|
|
|
Motor[2].MaxSpeed=20;Motor[3].MaxSpeed=20
|
|
Motor[2].MaxSpeed=5;Motor[3].MaxSpeed=5
|
|
Motor[2].MaxSpeed=2
|
|
Motor[3].MaxSpeed=2
|
|
b2r
|
|
|
|
|
|
|
|
'''
|
|
|
|
import os, sys, json, time
|
|
import numpy as np
|
|
import matplotlib as mpl
|
|
import matplotlib.pyplot as plt
|
|
import subprocess as sprc
|
|
import telnetlib
|
|
|
|
class Interferometer():
|
|
def __init__(self,**kwargs):
|
|
for k,v in kwargs.iteritems():
|
|
setattr(self,k,v)
|
|
|
|
|
|
def gen_prog(self,prgId=2,mode=0,**kwargs):
|
|
'''
|
|
kwargs:
|
|
acq_per : acquire period: acquire data all acq_per servo loops (default=1)
|
|
mode=0: test motion
|
|
xrng:
|
|
yrng:
|
|
spd:
|
|
'''
|
|
prg=[]
|
|
acq_per=kwargs.get('acq_per',10)
|
|
gather={"MaxSamples":1000000, "Period":acq_per}
|
|
#Sys.ServoPeriod is dependent of !common() macro
|
|
ServoPeriod= .2 #0.2ms
|
|
#ServoPeriod = .05
|
|
self.meta = {'timebase': ServoPeriod*gather['Period']}
|
|
channels=["Motor[1].DesPos","Motor[2].DesPos","Motor[1].ActPos","Motor[2].ActPos","Motor[6].ActPos","Motor[7].ActPos"]
|
|
prg.append('Gather.Enable=0')
|
|
prg.append('Gather.Items=%d'%len(channels))
|
|
for k,v in gather.iteritems():
|
|
prg.append('Gather.%s=%d'%(k,v))
|
|
for i,c in enumerate(channels):
|
|
prg.append('Gather.Addr[%d]=%s.a'%(i,c))
|
|
|
|
|
|
prg.append('open prog %d'%(prgId))
|
|
prg.append(' P1000=0')
|
|
# this uses Coord[1].Tm and limits with MaxSpeed
|
|
|
|
#******** mode -1 ********
|
|
if mode==0: #### jog all motors 10000um (or 10000 mdeg)
|
|
xRng = kwargs.get('xRng', (-12000,12000))
|
|
yRng = kwargs.get('yRng', (-12000,12000))
|
|
spd = kwargs.get('spd', 10)
|
|
prg.append('Motor[1].MaxSpeed=%f'%spd)
|
|
prg.append('Motor[2].MaxSpeed=%f'%spd)
|
|
prg.append('''
|
|
linear abs
|
|
X%g Y%g
|
|
dwell 10
|
|
Gather.Enable=2
|
|
X%g Y%g
|
|
dwell 100
|
|
X%g Y%g
|
|
dwell 100
|
|
X%g Y%g
|
|
dwell 100
|
|
X%g Y%g
|
|
dwell 100
|
|
Gather.Enable=0
|
|
'''%(xRng[0],yRng[0],xRng[0],yRng[1],xRng[0],yRng[0],xRng[1],yRng[0],xRng[0],yRng[0]))
|
|
|
|
prg.append(' P1000=1')
|
|
prg.append('close')
|
|
prg.append('&1\nb%dr\n'%prgId)
|
|
|
|
self.download(prg,mode=3,file='/tmp/prg.cfg')
|
|
|
|
|
|
def download(self,prg=None,mode=0,file='/tmp/interfero.cfg'):
|
|
'''
|
|
mode bits:
|
|
bit 0 (1): wait execution finished (P1000==1)
|
|
bit 1 (2): gather and save data
|
|
bit 2 (4): ...
|
|
'''
|
|
host=self.host
|
|
if prg is not None and self.verbose & 4:
|
|
for ln in prg:
|
|
print(ln)
|
|
|
|
if file is not None and prg is not None:
|
|
fh=open(file,'w')
|
|
fh.write('\n'.join(prg))
|
|
fh.close()
|
|
if host is not None:
|
|
# ***download and start the program***
|
|
cmd ='gpasciiCommander --host '+host+' '+ file
|
|
print(cmd)
|
|
p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT)
|
|
#res=p.stdout.readlines(); print res
|
|
retval = p.wait()
|
|
|
|
if mode &1:
|
|
# ***wait program finished P1000=1***
|
|
com=GpasciiCommunicator().connect(host,prompt='# ')
|
|
ack=GpasciiCommunicator.gpascii_ack
|
|
sys.stdout.write('wait execution...');sys.stdout.flush()
|
|
while(True):
|
|
#Gather.MaxLines calculates maximum numbewr of gathering into memory
|
|
com.write('P1000\n')
|
|
val=com.read_until(ack)
|
|
#print val
|
|
val=int(val[val.find('=')+1:].rstrip(ack))
|
|
if val==1:break
|
|
#com.write('Gather.Index\n')
|
|
#val=com.read_until(ack)
|
|
#print val
|
|
time.sleep(.2)
|
|
sys.stdout.write('.');sys.stdout.flush()
|
|
if mode &2:
|
|
fnRmt = '/var/ftp/gather/out.txt'
|
|
fnLoc = '/tmp/gather.txt'
|
|
print('\ngather data to %s...' % fnRmt)
|
|
p = sprc.Popen(('ssh', 'root@' + host, 'gather ', '-u', fnRmt), shell=False, stdin=sprc.PIPE, stdout=sprc.PIPE,
|
|
stderr=sprc.PIPE)
|
|
res = p.wait()
|
|
if res:
|
|
print('ssh failed. ssh root@%s to open a session' % host)
|
|
return
|
|
|
|
print('transfer data to %s...' % fnLoc)
|
|
p = sprc.Popen(('scp', 'root@' + host + ':' + fnRmt, fnLoc), shell=False, stdin=sprc.PIPE, stdout=sprc.PIPE,
|
|
stderr=sprc.PIPE)
|
|
res = p.wait()
|
|
self.rec = np.genfromtxt(fnLoc, delimiter=' ')
|
|
|
|
def show_pos(self):
|
|
rec=self.rec
|
|
#"M1.DesPos","M2.DesPos","M1.ActPos","M2.ActPos","M6.ActPos","M7.ActPos"]
|
|
#idx 0 1 2 3 4 5
|
|
f1=plt.figure()
|
|
ax1 = f1.add_subplot(1,1,1)
|
|
|
|
x=range(len(rec[:,0]))
|
|
|
|
hl=ax1.plot(x,-(rec[:,0]-rec[0,0]),'k')
|
|
hl=ax1.plot(x,-(rec[:,2]-rec[0,2]),'r')
|
|
hl=ax1.plot(x,-(rec[:,4]-rec[0,4])/100,'m')
|
|
hl=ax1.plot(x,rec[:,1]-rec[0,1],'k')
|
|
hl=ax1.plot(x,rec[:,3]-rec[0,3],'b')
|
|
hl=ax1.plot(x,-(rec[:,5]-rec[0,5])/100,'c')
|
|
#hl=ax1.plot(x,-(rec[:,0]-rec[0,0]),'k')
|
|
#hl=ax1.plot(x,-(rec[:,2]-rec[0,2]),'r')
|
|
#hl=ax1.plot(x,-(rec[:,4]-rec[0,4])/100,'m')
|
|
#hl=ax1.plot(x,rec[:,1]-rec[0,1],'k')
|
|
#hl=ax1.plot(x,rec[:,3]-rec[0,3],'b')
|
|
#hl=ax1.plot(x,-(rec[:,5]-rec[0,5])/100,'c')
|
|
|
|
plt.show()
|
|
|
|
def show_poserr(self):
|
|
rec=self.rec
|
|
#"M1.DesPos","M2.DesPos","M1.ActPos","M2.ActPos","M6.ActPos","M7.ActPos"]
|
|
#idx 0 1 2 3 4 5
|
|
f1=plt.figure()
|
|
ax1 = f1.add_subplot(1,1,1)
|
|
|
|
t=range(len(rec[:,0]))
|
|
actYerr=(rec[:,2]-rec[:,0]);actYerr-=actYerr[0]
|
|
actXerr=(rec[:,3]-rec[:,1]);actXerr-=actXerr[0]
|
|
infYerr=(rec[:,4]-rec[:,0]);infYerr-=infYerr[0]
|
|
infXerr=(rec[:,5]-rec[:,1]);infXerr-=infXerr[0]
|
|
|
|
hl=ax1.plot(t,actYerr,'r',label='actYerr')
|
|
hl=ax1.plot(t,actXerr,'b',label='actXerr')
|
|
hl=ax1.plot(t,infYerr,'m',label='infYerr')
|
|
hl=ax1.plot(t,infXerr,'c',label='infXerr')
|
|
|
|
#plt.legend(handles=h)
|
|
ax1.legend()
|
|
plt.show()
|
|
|
|
class GpasciiCommunicator():
|
|
'''Communicates with the Delta Tau gpascii programm
|
|
'''
|
|
gpascii_ack="\x06\r\n"
|
|
gpascii_inp='Input\r\n'
|
|
|
|
def connect(self, host, username='root', password='deltatau',prompt='ppmac# ',verbose=0):
|
|
p=telnetlib.Telnet(host)
|
|
s=p.read_until('login: ')
|
|
if verbose: print(s)
|
|
p.write(username+'\n')
|
|
s =p.read_until('Password: ')
|
|
if verbose: print(s)
|
|
p.write(password+'\n')
|
|
s =p.read_until(prompt) # command prompt
|
|
if verbose: print(s)
|
|
p.write('gpascii -2\n') # execute gpascii command
|
|
s=p.read_until(self.gpascii_inp)
|
|
if verbose: print(s)
|
|
return p
|
|
|
|
|
|
if __name__=='__main__':
|
|
|
|
ifm=Interferometer(verbose = 255,host='SAR-CPPM-EXPMX1')
|
|
os.chdir(os.path.join(os.path.dirname(__file__), '../cfg'))
|
|
ifm.download(['$$$***','!common()','!SAR-EXPMX1()','#1..7j/','enable plc 1','Motor[1].MaxSpeed=25','Motor[2].MaxSpeed=25'])
|
|
raw_input('press return when homed')
|
|
#ifm.gen_prog(mode=0)
|
|
#ifm.show_poserr()
|
|
#ifm.gen_prog(mode=0,xRng=(-10000,10000),yRng=(-10000,10000),spd=10)
|
|
ifm.gen_prog(mode=0,xRng=(-5000,5000),yRng=(-5000,5000),spd=5)
|
|
ifm.show_poserr()
|
|
#ifm.gen_prog(mode=0,xRng=(-2000,2000),yRng=(4000,8000),spd=5)
|
|
#ifm.show_poserr()
|
|
|
|
#ifm.rec = np.genfromtxt('/scratch/gather.txt', delimiter=' ')
|
|
#ifm.show_pos()
|