towards python 3

This commit is contained in:
2017-09-29 10:38:24 +02:00
parent f6b3853550
commit 3764e27d13
6 changed files with 90 additions and 30 deletions

View File

@@ -20,9 +20,9 @@
file PPMACMotor.template { file PPMACMotor.template {
pattern {DESC ,P ,M ,PORT ,ADDR ,DIR,VMAX,VELO,JVEL,HVEL,ACCL,JAR,MRES ,PREC,EGU ,DHLM,DLLM} pattern {DESC ,P ,M ,PORT ,ADDR ,DIR,VMAX,VELO,JVEL,HVEL,ACCL,JAR,MRES ,PREC,EGU ,DHLM,DLLM}
{ "Rotation Y" ,"$(P_M)","MOTOR_ROT_Y1","$(PORT_M)","$(M1)",0 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"deg",0 ,0} { "Rotation Y" ,"$(P_M)","MOTOR_ROT_Y1","$(PORT_M)","$(M1)",1 ,50 ,50 ,50 ,1 ,0.1 ,20 ,-0.001,3 ,"deg",0 ,0}
{ "Translation X","$(P_M)","MOTOR_X1" ,"$(PORT_M)","$(M2)",0 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0} { "Translation X","$(P_M)","MOTOR_X1" ,"$(PORT_M)","$(M2)",1 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0}
{ "Translation Y","$(P_M)","MOTOR_Y1" ,"$(PORT_M)","$(M3)",0 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0} { "Translation Y","$(P_M)","MOTOR_Y1" ,"$(PORT_M)","$(M3)",1 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0}
{ "TransBase X", "$(P_M)","MOTOR_AX" ,"$(PORT_M)","$(M7)",0 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0} { "TransBase X", "$(P_M)","MOTOR_AX" ,"$(PORT_M)","$(M7)",1 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0}
{ "TransBase Z", "$(P_M)","MOTOR_AZ" ,"$(PORT_M)","$(M8)",0 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0} { "TransBase Z", "$(P_M)","MOTOR_AZ" ,"$(PORT_M)","$(M8)",1 ,2 ,2 ,2 ,1 ,0.1 ,20 ,-0.001,3 ,"mm",0 ,0}
} }

View File

@@ -3,7 +3,7 @@ MODULE = $(notdir $(shell pwd))
BUILDCLASSES = Linux BUILDCLASSES = Linux
ARCH_FILTER = eldk42% SL6-x86_64 ARCH_FILTER = eldk42% SL6-x86_64
EXCLUDE_VERSIONS = 3.14.8 EXCLUDE_VERSIONS = 3.14.8
SCRIPTS+=$(wildcard add_device*.cmd cfg/*.cfg cfg/*.py cfg/*.pbi qt/*.ui qt/*.jpg) SCRIPTS+=$(wildcard add_device*.cmd cfg/*.cfg cfg/*.py cfg/*.pbi qt/*.ui qt/*.jpg python/*.py)
#SOURCES+=src/DHVSaSub.cpp #SOURCES+=src/DHVSaSub.cpp
#DBDS+=src/DHVSaSub.dbd #DBDS+=src/DHVSaSub.dbd
USR_CXXFLAGS+= -fno-operator-names USR_CXXFLAGS+= -fno-operator-names

View File

@@ -4,6 +4,7 @@ Various motor documents
Parker stage Parker stage
------------ ------------
```
- encoder is incremental encoder - encoder is incremental encoder
25mm or 50mm travel stage 25mm or 50mm travel stage
Stall Current Continuous 0.8 Stall Current Continuous 0.8
@@ -14,7 +15,7 @@ Max.BuxVoltage V 80
Continous Force 4N -> assume 1kg load -> acceleration=a=F/m=4m/s^2 Continous Force 4N -> assume 1kg load -> acceleration=a=F/m=4m/s^2
Weight top stage: 250g=2.5N Weight top stage: 250g=2.5N
```
Mecapion rot stage Mecapion rot stage
@@ -27,15 +28,16 @@ http://www.parkem.ch/medien/produkte/direktantriebstechnik/pdf/MDM_Rundtisch_kat
http://www.goto.si/wp-content/uploads/2016/kat/L7%20Series%20catalog.pdf http://www.goto.si/wp-content/uploads/2016/kat/L7%20Series%20catalog.pdf
http://farasys.ir/wp-content/uploads/2015/Direct%20Drive%20Rotary%20Motors.pdf http://farasys.ir/wp-content/uploads/2015/Direct%20Drive%20Rotary%20Motors.pdf
http://www.inmoco.co.uk/Upload/product/1037_DD_Series_Motors_79.pdf http://www.inmoco.co.uk/Upload/product/1037_DD_Series_Motors_79.pdf
```
- encoder is biss 20 bit - encoder is biss 20 bit
- Rated Current 1.46 Arms - Rated Current 1.46 Arms
- Max Current 4.38 Arms - Max Current 4.38 Arms
- 32 pole (16 einraster per rev) - 32 pole (16 einraster per rev)
```
Servo Test Motor QBL 4208-41-04-006 Servo Test Motor QBL 4208-41-04-006
----------------------------------- -----------------------------------
```
8 pole (4 lock position per rev) 8 pole (4 lock position per rev)
24 V rated voltage 24 V rated voltage
1.79 A rated phase current 1.79 A rated phase current
@@ -43,10 +45,12 @@ Servo Test Motor QBL 4208-41-04-006
4000 rpm rated speed 4000 rpm rated speed
1.8 ohm line to line resistance 1.8 ohm line to line resistance
2.6 mH line to line inductance 2.6 mH line to line inductance
```
2Phase Stepper Test Motor Vextra PK244M 2Phase Stepper Test Motor Vextra PK244M
--------------------------------------- ---------------------------------------
```
- 200 pole (100 einraster per rev) - 200 pole (100 einraster per rev)
@@ -61,28 +65,31 @@ gpasciiCommander --host SAR-CPPM-EXPMX1 -i
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python
./shapepath.py -v255 ./shapepath.py -v255
```
Testing ServoFrq. Testing ServoFrq.
----------------- -----------------
```
!common(PhaseFreq=20000,PhasePerServo=4) -> 25000points, 20um error leads the trajectory in x !common(PhaseFreq=20000,PhasePerServo=4) -> 25000points, 20um error leads the trajectory in x
!common(PhaseFreq=20000,PhasePerServo=2) -> 25000points, 6.6um error !common(PhaseFreq=20000,PhasePerServo=2) -> 25000points, 6.6um error
!common(PhaseFreq=20000,PhasePerServo=1) -> 25000points, 6.1um error ossilates in y, x is quite good !common(PhaseFreq=20000,PhasePerServo=1) -> 25000points, 6.1um error ossilates in y, x is quite good
-> the servo loop has to be optimized! -> the servo loop has to be optimized!
```
Testing linear,pvt,spline moves Testing linear,pvt,spline moves
------------------------------- -------------------------------
```
Tested with shapepath.py: THE BEST TRAJECTORY RESULT IST WITH PVT MOTION Tested with shapepath.py: THE BEST TRAJECTORY RESULT IST WITH PVT MOTION
```
Optimize/Test Parameters with Parker Stage Optimize/Test Parameters with Parker Stage
------------------------------------------ ------------------------------------------
```
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/cfg
gpasciiCommander --host SAR-CPPM-EXPMX1 -i gpasciiCommander --host SAR-CPPM-EXPMX1 -i
!mx-stage() !mx-stage()
@@ -119,12 +126,12 @@ average error x 0.313575 um, y 0.461707 um, 0.629583 um
./shapepath.py ./shapepath.py
average error x 0.371877 um, y 0.317152 um, 0.542073 um average error x 0.371877 um, y 0.317152 um, 0.542073 um
```
Start motion on external signal Start motion on external signal
------------------------------- -------------------------------
```
open plc 1 open plc 1
Coord[1].DesTimeBase=0 // freezes timebase at boot Coord[1].DesTimeBase=0 // freezes timebase at boot
while(1) while(1)
@@ -144,3 +151,32 @@ close
enable plc 1 enable plc 1
-> run motion program. press gpio 0 to run at 100% -> run motion program. press gpio 0 to run at 100%
```
29.9.17 Testing in MX-LAB
-------------------------
```
Start the powerbrick. ioc is started automatically
zamofing_t@ganymede:~$ ssh x06mx-cons-1
caget SAR-ESB_MX:MOTOR_AX
cd /net/slsfs-crtl/export/sf/common/config/qt/
startDM -macro 'P=SAR-ESB_MX' ESB_MX_exp
press homing button
-> all axes can be moved.
(on thierrys laptop only)
cd /home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python
./shapepath.py
will execute the custom motion. No problems with EPICS
(on other machines)
module is installed in:
ls /net/slsfs-crtl/export/sf/ioc/modules/ESB_MX/zamofing_t/R3.14.12/
PATH=/net/slsfs-crtl/export/sf/controls/bin/:$PATH
source /opt/gfa/python-2.7/2.3.0/bin/activate xblpython > /dev/null 2>&1
cd /net/slsfs-crtl/export/sf/ioc/modules/ESB_MX/zamofing_t/R3.14.12/
./shapepath.py
```

View File

@@ -41,7 +41,7 @@ Motor[1].pPhaseEnc=Acc84B[0].Chan[0].SerialEncDataA.a
//Motor[1].pAbsPhasePos=Acc84B[0].Chan[0].SerialEncDataA.a //Motor[1].pAbsPhasePos=Acc84B[0].Chan[0].SerialEncDataA.a
!motor_servo(mot=1,ctrl='ServoCtrl',Kp=0.8,Kvfb=20,Ki=0.001,Kvff=40,Kaff=0,MaxInt=1000) !motor_servo(mot=1,ctrl='ServoCtrl',Kp=0.8,Kvfb=20,Ki=0.001,Kvff=40,Kaff=0,MaxInt=1000)
!motor(mot=1,dirCur=0,contCur=1000,peakCur=2000,timeAtPeak=1,IiGain=1.5,IpfGain=0,IpbGain=3,JogSpeed=180.,numPhase=3,invDir=True,servo=None,PhasePosSf=1./8192,PhaseFindingDac=100,PhaseFindingTime=50,SlipGain=0,AdvGain=0,PwmSf=10000,FatalFeLimit=3000,WarnFeLimit=1000,InPosBand=10) !motor(mot=1,dirCur=0,contCur=1000,peakCur=2000,timeAtPeak=1,IiGain=1.5,IpfGain=0,IpbGain=3,JogSpeed=180.,numPhase=3,invDir=True,servo=None,PhasePosSf=1./8192,PhaseFindingDac=100,PhaseFindingTime=50,SlipGain=0,AdvGain=0,PwmSf=10000,FatalFeLimit=3000,WarnFeLimit=1000,InPosBand=10, HomeOffset=228987)
//Stage Y Parker MX80L //Stage Y Parker MX80L
@@ -85,12 +85,14 @@ Motor[1].pPhaseEnc=Acc84B[0].Chan[0].SerialEncDataA.a
!encoder_biss(enc=7,numBits=32,posSf=1./20) !encoder_biss(enc=7,numBits=32,posSf=1./20)
!encoder_biss(enc=8,numBits=32,posSf=1./20) !encoder_biss(enc=8,numBits=32,posSf=1./20)
!motor(mot=7,current=200,JogSpeed=0.5,invDir=1,servoSf=204.8) !motor(mot=7,current=200,JogSpeed=0.5,invDir=1,servoSf=204.8,InPosBand=1,HomeOffset=39278)
!motor(mot=8,current=200,JogSpeed=0.5,invDir=1,servoSf=204.8) !motor(mot=8,current=200,JogSpeed=0.5,invDir=1,servoSf=204.8,InPosBand=1,HomeOffset=39736)
//turn off servon and inpos below ... user units (here 1um) //turn off servon and inpos below ... user units (here 1um)
Motor[7].InPosBand=1;Motor[7].Servo.BreakPosErr=Motor[7].InPosBand //Motor[7].InPosBand=1;Motor[7].Servo.BreakPosErr=Motor[7].InPosBand
Motor[8].InPosBand=1;Motor[8].Servo.BreakPosErr=Motor[8].InPosBand //Motor[8].InPosBand=1;Motor[8].Servo.BreakPosErr=Motor[8].InPosBand
#1,7,8hmz
//holding current //holding current
!holding_current(m7=[0,200],m8=[0,200]) !holding_current(m7=[0,200],m8=[0,200])

View File

@@ -64,7 +64,7 @@ class ShapePath:
fh=open(args.cfg,'r') fh=open(args.cfg,'r')
s=fh.read() s=fh.read()
cfg=json.loads(s, object_hook=ConvUtf8) cfg=json.loads(s, object_hook=ConvUtf8)
s=json.dumps(cfg, indent=2, separators=(',', ': '));print s s=json.dumps(cfg, indent=2, separators=(',', ': '));print(s)
else: else:
fn='/tmp/shapepath4' fn='/tmp/shapepath4'
#fn='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/data/'+time.strftime('%y-%m-%d-%H_%M_%S') #fn='/home/zamofing_t/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/data/'+time.strftime('%y-%m-%d-%H_%M_%S')
@@ -88,9 +88,11 @@ class ShapePath:
cfg = {"sequencer": ['gen_grid_points(w=5,h=5,pitch=100,rnd=0.4)', 'sort_points()','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=10,cnt=1)', 'plot_gather("'+fn+'.npz")']} cfg = {"sequencer": ['gen_grid_points(w=5,h=5,pitch=100,rnd=0.4)', 'sort_points()','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=10,cnt=1)', 'plot_gather("'+fn+'.npz")']}
#cfg = {"sequencer":['gen_rand_points(n=400, scale=1000)','sort_points()','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=20,acq_per=10)','plot_gather("'+fn+'.npz")']} #cfg = {"sequencer":['gen_rand_points(n=400, scale=1000)','sort_points()','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=20,acq_per=10)','plot_gather("'+fn+'.npz")']}
#cfg = {"sequencer": ['gen_swissfel_points(scale=300)','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=100,acq_per=10)', 'plot_gather("'+fn+'.npz")']} #cfg = {"sequencer": ['gen_swissfel_points(scale=300)','gen_prog(file="'+fn+'.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=100,acq_per=10)', 'plot_gather("'+fn+'.npz")']}
cfg = {"sequencer": ['opt_pts("'+fn+'.npz")','gen_prog(file="'+fn+'_corr.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=10,cnt=1)', 'plot_gather("'+fn+'_corr.npz")']} #cfg = {"sequencer": ['opt_pts("'+fn+'.npz")','gen_prog(file="'+fn+'_corr.prg",host="SAR-CPPM-EXPMX1",mode=1,pt2pt_time=10,cnt=1)', 'plot_gather("'+fn+'_corr.npz")']}
#cfg = {"sequencer": ['opt_pts("'+fn+'.npz")','gen_prog(file="'+fn+'.prg",mode=1,pt2pt_time=10,cnt=1)']} #cfg = {"sequencer": ['opt_pts("'+fn+'.npz")','gen_prog(file="'+fn+'.prg",mode=1,pt2pt_time=10,cnt=1)']}
#cfg = {"sequencer": ['gen_grid_points(w=5,h=5,pitch=100,rnd=0.4)', 'sort_points()','gen_prog(file="'+fn+'.prg",mode=1,pt2pt_time=10,cnt=1)']}
self.cfg=dotdict(cfg) self.cfg=dotdict(cfg)
self.args=args self.args=args
@@ -108,7 +110,7 @@ class ShapePath:
else: else:
dryrun=self.args.dryrun dryrun=self.args.dryrun
for cmd in sequencer: for cmd in sequencer:
print '>'*5+' '+cmd+' '+'<'*5 print('>'*5+' '+cmd+' '+'<'*5)
if not dryrun: if not dryrun:
eval('self.' + cmd) eval('self.' + cmd)
@@ -164,7 +166,7 @@ class ShapePath:
ptsCorr=(pts-recPts[:,1:3]+recPts[:,4:6]) ptsCorr=(pts-recPts[:,1:3]+recPts[:,4:6])
self.points=pts self.points=pts
self.ptsCorr=ptsCorr self.ptsCorr=ptsCorr
print ptsCorr print(ptsCorr)
def gen_prog(self,prgId=2,file=None,host=None,mode=0,**kwargs): def gen_prog(self,prgId=2,file=None,host=None,mode=0,**kwargs):
''' '''
@@ -221,7 +223,7 @@ class ShapePath:
try: try:
pt2pt_time=kwargs['pt2pt_time'] #how many ms to move to next point (pt2pt_time) pt2pt_time=kwargs['pt2pt_time'] #how many ms to move to next point (pt2pt_time)
except KeyError: except KeyError:
print 'missing pt2pt_time, use default=100ms' print('missing pt2pt_time, use default=100ms')
pt2pt_time=100. pt2pt_time=100.
try: try:
cnt=kwargs['cnt'] #move path multiple times cnt=kwargs['cnt'] #move path multiple times
@@ -273,7 +275,7 @@ class ShapePath:
try: try:
pt2pt_time=kwargs['pt2pt_time'] #how many ms to move to next point (pt2pt_time) pt2pt_time=kwargs['pt2pt_time'] #how many ms to move to next point (pt2pt_time)
except KeyError: except KeyError:
print 'missing pt2pt_time, use default=100ms' print('missing pt2pt_time, use default=100ms')
pt2pt_time=100. pt2pt_time=100.
pos=self.points pos=self.points
pcor=np.ndarray(pos.shape,dtype=pos.dtype);pcor[:]=np.NaN pcor=np.ndarray(pos.shape,dtype=pos.dtype);pcor[:]=np.NaN
@@ -302,13 +304,13 @@ class ShapePath:
fh.close() fh.close()
if host is not None: if host is not None:
cmd ='gpasciiCommander --host '+host+' '+ file cmd ='gpasciiCommander --host '+host+' '+ file
print cmd print(cmd)
p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT) p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT)
#res=p.stdout.readlines(); print res #res=p.stdout.readlines(); print res
retval = p.wait() retval = p.wait()
#gather -u /var/ftp/gather/out.txt #gather -u /var/ftp/gather/out.txt
cmd ='PBGatherPlot -m24 -v7 --host '+host cmd ='PBGatherPlot -m24 -v7 --host '+host
print cmd print(cmd)
p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT) p = sprc.Popen(cmd, shell=True)#, stdout=sprc.PIPE, stderr=sprc.STDOUT)
retval = p.wait() retval = p.wait()
self.prg=prg self.prg=prg
@@ -349,8 +351,8 @@ class ShapePath:
@staticmethod @staticmethod
def onclick(event): def onclick(event):
print 'button=%s, x=%d, y=%d, xdata=%f, ydata=%f'%( print('button=%s, x=%d, y=%d, xdata=%f, ydata=%f'%(
event.button, event.x, event.y, event.xdata, event.ydata) event.button, event.x, event.y, event.xdata, event.ydata))
obj=event.canvas.figure.obj obj=event.canvas.figure.obj
def plot_points(self,pts): def plot_points(self,pts):

View File

@@ -13,7 +13,7 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="5,3,4,0,0,3"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="5,3,4,0,0,0,3">
<property name="spacing"> <property name="spacing">
<number>2</number> <number>2</number>
</property> </property>
@@ -77,6 +77,26 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="caLed" name="caled_3">
<property name="minimumSize">
<size>
<width>25</width>
<height>4</height>
</size>
</property>
<property name="channel" stdset="0">
<string notr="true">$(P):$(M).DMOV</string>
</property>
<property name="trueColor">
<color>
<red>0</red>
<green>85</green>
<blue>255</blue>
</color>
</property>
</widget>
</item>
<item> <item>
<widget class="caLed" name="caled"> <widget class="caLed" name="caled">
<property name="minimumSize"> <property name="minimumSize">