From f08cba548e75ee7913bb390f5ec207b19f2003ff Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Tue, 27 Nov 2018 11:24:39 +0100 Subject: [PATCH] wip --- Readme.md | 2 +- matlab/SCRATCH.m | 55 ++++++++++++++++++++++-- python/MXMotion.py | 61 ++++++++++++++++----------- python/MXTuningDoc/fastStageTune.odt | Bin 653794 -> 670241 bytes python/helicalscan.py | 35 +++++++++------ python/shapepath.py | 24 +++-------- 6 files changed, 118 insertions(+), 59 deletions(-) diff --git a/Readme.md b/Readme.md index 6d6a948..0e7aa9a 100644 --- a/Readme.md +++ b/Readme.md @@ -1139,7 +1139,7 @@ zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python$ cp -arL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py \ - ~/Documents/prj/SwissFEL/PBTools/pbtools/ + ~/Documents/prj/SwissFEL/PBTools/pbtools/ \ /sf/bernina/config/swissmx/zamofing_t/ cp -arL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/PBMotionAnalyzer/*.py \ /sf/bernina/config/swissmx/zamofing_t/PBMotionAnalyzer/ diff --git a/matlab/SCRATCH.m b/matlab/SCRATCH.m index 84c0d41..a883955 100644 --- a/matlab/SCRATCH.m +++ b/matlab/SCRATCH.m @@ -163,12 +163,59 @@ open('stage_closed_loop.slx') controlSystemDesigner('bode',sys); controlSystemDesigner(1,sys); % <<<<<<<<< This opens a transferfiûnction that can be edited - +1 num=[8.32795069e-11, 1.04317228e-08, 6.68431323e-05, 3.31861324e-03, 7.32824533e+00]; den=[5.26156641e-18, 1.12897840e-14, 7.67853031e-12, 1.03201301e-08, 2.05154780e-06, 1.34279894e-03, 7.19229912e-02, 1.00000000e+00]; mot2=tf(num,den); controlSystemDesigner('bode',mot2); - - +end + + +m1=10; d1=10; k1=0; +m2=.3; d2=0.15; k2=100; +m3=1.2; d3=.04; k3=10; + +%k2 determines resonance frequency k2 higher -> resfrq higher +%d2 determines the damping d2=0 no damping d2=10 strong damping +%m2 determines how much energy is in the resonance + +%m1 is big compared to the other masses +%d1 is the speed dependant friction +%k1 can be set to 0, because these is no position for no force +%-> but this means for 1/s^2 the system is not observable any more + +ks=k1+k2+k3; +ds=d1+d2+d3; + +A=[ 0 1 0 0 0 0 ; + -ks/m1 -ds/m1 k2/m1 d2/m1 k3/m1 d3/m1 ; + 0 0 0 1 0 0 ; + k2/m2 d2/m2 -k2/m2 -d2/m2 0 0 ; + 0 0 0 0 0 1 ; + k3/m1 d3/m1 0 0 -k3/m3 -d3/m3 ]; +B=[ 0 1 0 0 0 0]'; +C=[ 1 0 0 0 0 0]; +D=[0]; + +ss1=ss(A,B,C,D); +bodeplot(ss1,{.1,1000}); +tf(ss1) + + +%simplified no resonance +A=[ 0 1 ; + -k1/m1 -d1/m1 ]; +B=[ 0 1 ]'; +C=[ 1 0 ]; +D=[0]; +ss1=ss(A,B,C,D); +bodeplot(ss1,{.1,1000}); +tf(ss1) +chkCtrlObsv(ss1,'') +%but with k1=0 or d1=0 the system is neither controllable nor observable +%-> the +p = eig(A); +disp(p); + +K = place(A,B,[-5 -10]); -end \ No newline at end of file diff --git a/python/MXMotion.py b/python/MXMotion.py index b720633..249e08d 100644 --- a/python/MXMotion.py +++ b/python/MXMotion.py @@ -73,11 +73,13 @@ class MotionBase: self.sync_prg = prg self.sync_run = '&{crdId}b{prgId}r'''.format(prgId=prgId, plcId=plcId, crdId=crdId) if mode==2: + #frequence jitter 50Hz Swissgrid: + #https://www.swissgrid.ch/de/home/operation/grid-data/current-data.html# notFlag1 = 'Gate3[1].Chan[1].UserFlag!=0' try: prop=kwargs['prop'] #proportional value to adapt speed except KeyError: - prop = 1E-4 + prop = .5E-4 try: maxJitter = kwargs['maxJitter'] # proportional value to adapt speed except KeyError: @@ -86,58 +88,67 @@ class MotionBase: disable plc {plcId} open plc {plcId} Coord[1].DesTimeBase=Sys.ServoPeriod //reset to 100% timebase -Coord[1].Q[0]=0 //set CryPos counter to 0 +Coord[1].Q[0]=0 //set syncCnt counter to 0 while({flag0}){{}} //wait Jungfrau start Trigger while({flag1}){{}} //ESx detector trigger -L0=0 //CryPos counter -//L1 ServoCount event 1 -//L2 jitter: neg:motion lags trigger,pos:motion leads trigger +{syncCnt}=0 //sync counter, sent when motion is on a crystal +//{evnt} current PhaseCount event +//{jitter} jitter: neg:motion lags trigger,pos:motion leads trigger +//{syncEnvt} Prev syncEnvt PhaseCount +{sync2sync}=0 // last syncEnvt-syncEnvt PhaseCount +{dtb}=Sys.ServoPeriod //DesTimeBase +//{tmp} temp variable -while(L0>=0) //as long we are not at the last point +while({syncCnt}>=0) //as long we are not at the last point {{ - L0=Coord[1].Q[0] //CryPos counter - while({flag1} && L0==Coord[1].Q[0]){{}} //wait for event - L1=Sys.ServoCount //a event happened - L2=1000 + {syncCnt}=Coord[1].Q[0] //sync counter + while({flag1} && {syncCnt}==Coord[1].Q[0]){{}} //wait for event + {evnt}=Sys.PhaseCount //a event happened + {jitter}=1000 //send 1"event\\n" - if(L0==Coord[1].Q[0]) + if({syncCnt}==Coord[1].Q[0]) {{//it was a trigger - //send 1"trigger %d %d\\n",L0,L1 - while(Sys.ServoCount0) {{ - L3=Sys.ServoPeriod*(1-{prop}*L2) - //send 1"jitter %d timebase: %f\\n",L2,L3 - Coord[1].DesTimeBase=L3 + {dtb}=Sys.ServoPeriod*(1-{prop}*{jitter}) + //{dtb}={dtb}*(1-{jitter}/{sync2sync}*.5) + //send 1"syncCnt %d jitter %d sync2sync %d timebase: %f\\n",{syncCnt},{jitter},{sync2sync},{dtb} + Coord[1].DesTimeBase={dtb} }} }} disable plc {plcId} close enable plc {plcId} -'''.format(plcId=plcId, crdId=crdId, flag0=flag0, flag1=flag1, notFlag1=notFlag1, prop=prop, maxJitter=maxJitter) +'''.format(plcId=plcId, crdId=crdId, flag0=flag0, flag1=flag1, notFlag1=notFlag1, prop=prop, maxJitter=maxJitter, + syncCnt='L0', evnt='L1', jitter='L2', syncEnvt='L3', sync2sync='L4', dtb='L5', tmp='L6') comm=self.comm if comm is not None: gpascii=comm.gpascii diff --git a/python/MXTuningDoc/fastStageTune.odt b/python/MXTuningDoc/fastStageTune.odt index 9a338da324d937bfd173bfe5d15e39545d825658..f056f8d2d0830e38265f5d343c304e6e9df166c8 100644 GIT binary patch delta 31200 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≺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¯>!$J!`5TaV9Nqj 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 z diff --git a/python/helicalscan.py b/python/helicalscan.py index 8cce73e..5ec77ec 100755 --- a/python/helicalscan.py +++ b/python/helicalscan.py @@ -354,7 +354,7 @@ class HelicalScanGui(): def update_anim(self,frm): rec=self.helScn.rec - (cx, cz, w, fy)=rec[int(frm),:4];cx=-cx;cz=-cz + (cx, cz, w, fy)=rec[int(frm),:4];cx=-cx;cz=-cz #change sign because axes have neg direction w*=d2r/1000 # scale from deg to rad if self.manip: param = self.helScn.param @@ -781,7 +781,6 @@ a #1->I ''' pbParam=param.copy() - pbParam[:,(0,2)]=-pbParam[:,(0,2)] #change sign of x_0,x_1,z_0,z_1, because axes have neg direction sh=pbParam.shape s = ('z', 'y', 'x', 'r', 'phi') a = np.ones(sh[1], dtype=np.uint8).reshape(1, -1) @@ -790,7 +789,7 @@ a subsParam=dict(map(lambda k, i, v: (k + '_' + str(i), v), s * sh[0], c, pbParam.reshape(-1))) subsParam['d2r']=d2r/1000. subsParam['r2d']=1000./d2r - subsParam['cmt']='//' + subsParam['cmt']='' #'//' subs={'qCX':'L4', 'qCZ':'L5', 'qW':'L3', 'qFY':'L1', @@ -1003,6 +1002,7 @@ close elif mode==1: #### pvt motion #y=2.3 6.2 dx=0, dz=0 w=0..3600000 # 10 rev cnt= kwargs.get('cnt', 1) #move path multiple times + sync_frq=kwargs.get('sync_frq',10) # synchronization mark all n points cntVert = kwargs.get('cntVert', 12) cntHor = kwargs.get('cntHor', 4) hRng = kwargs.get('hRng', (-.2,.2)) @@ -1010,6 +1010,7 @@ close yRng = kwargs.get('yRng', self.param[:,1]) pt2pt_time = kwargs.get('pt2pt_time', 100) smt = kwargs.get('smt', 1) # SegMoveTime, default = 1ms -> velocity calc not yet 100% correct (smt=0 not 100% working) + numPt=cntVert*cntHor pt=np.zeros((numPt,4)) if cntHor>1: @@ -1049,7 +1050,8 @@ close prg.append(' Coord[1].SegMoveTime=%d'%smt) #to calculate every 1 ms the inverse kinematics prg.append(' pvt%g abs'%pt2pt_time) #100ms to next position for idx in range(1,pv.shape[0]): - #prg.append(' P2000=%d'%idx) + if sync_frq is not None and idx%sync_frq==0: + prg.append('Coord[1].Q[0]=%d'%(idx)) prg.append(' X%g:%g Z%g:%g B%g:%g Y%g:%g' % tuple(pv[idx, (0,4,1,5,2,6,3,7)])) #prg.append('Y%g:%g' % tuple(pv[idx, (5, 7)])) #prg.append('B%g:%g' %(idx*1000,0)) @@ -1065,9 +1067,9 @@ close prg.append(' }') else: prg.append(' dwell 1000') + if sync_frq is not None: + prg.append('Coord[1].Q[0]=-1') prg.append(' Gather.Enable=0') - - prg.append(' P1000=1') prg.append('close') #prg.append('&1\nb%dr\n'%prgId) @@ -1100,7 +1102,7 @@ close if __name__=='__main__': def run_test(args): test=args.test - args.host=None + #args.host=None if args.host is None: comm=gather=None @@ -1123,10 +1125,19 @@ if __name__=='__main__': HelicalScanTests.calcParamSim(hs) hs.setup_motion(mode=1,cntHor=5,cntVert=15,hRng=(-50,50),wRng=(0,120000),smt=0,pt2pt_time=200) + hs.setup_coord_trf() + hs.setup_sync(mode=0) # None: no sync at all mode=1: sync on timing UserFlag + hs.setup_gather() + hs.run() + print('wait until gather finished:') + fn = '/tmp/helicalscan' + hs.gather_upload(fn + '.npz') + hs.load_rec(fn + '.npz') + for manip in (False,True): hsg=HelicalScanGui(hs);hsg.interactive_cx_cz_w_fy(manip=manip) hsg=HelicalScanGui(hs);hsg.interactive_dx_dz_w_y(manip=manip) - #hsg=HelicalScanGui(hs);hsg.interactive_anim(manip=manip) + hsg=HelicalScanGui(hs);hsg.interactive_anim(manip=manip) return elif test==3: @@ -1153,9 +1164,9 @@ if __name__=='__main__': #cpx X0 Z0 B0 Y258 #cpx X0 Z0 B120000 Y258 - #hs.calcParam(x = ((-1154.4, 216.3, -250.7), ( -1330.2, 340.9, -230.4)), - # y = (1405.7,1019.2), - # z = ((-1309.6, -1010.9, -2410.3),( -1219.4, -918.8, -2510.4))) + hs.calcParam(x = ((-1154.4, 216.3, -250.7), ( -1330.2, 340.9, -230.4)), + y = (1405.7,1019.2), + z = ((-1309.6, -1010.9, -2410.3),( -1219.4, -918.8, -2510.4))) ### use simulation motors ### @@ -1171,7 +1182,7 @@ if __name__=='__main__': eval(s) hs.setup_coord_trf() - hs.setup_sync(mode=2) # None: no sync at all mode=1: sync on timing UserFlag + hs.setup_sync(mode=0) # None: no sync at all mode=1: sync on timing UserFlag hs.setup_gather() #hs.gen_prog(mode=-1) diff --git a/python/shapepath.py b/python/shapepath.py index 9d30cf3..8ede8a0 100755 --- a/python/shapepath.py +++ b/python/shapepath.py @@ -224,20 +224,10 @@ class ShapePath(MotionBase): prg.append('dwell 100') prg.append('Gather.Enable=0') elif mode==1: #### pvt motion - try: - pt2pt_time=kwargs['pt2pt_time'] #how many ms to move to next point (pt2pt_time) - except KeyError: - print('missing pt2pt_time, use default=100ms') - pt2pt_time=100. + pt2pt_time=kwargs.get('pt2pt_time', 100) self.meta['pt2pt_time']=pt2pt_time - try: - cnt=kwargs['cnt'] #move path multiple times - except KeyError: - cnt=1 - try: - sync_frq=kwargs['sync_frq'] #synchronization mark all n points - except KeyError: - sync_frq=10 + cnt=kwargs.get('cnt', 1) # move path multiple times + sync_frq=kwargs.get('sync_frq', 10) # synchronization mark all n points try: pt=self.ptsCorr except AttributeError: @@ -639,9 +629,9 @@ if __name__=='__main__': #sp.setup_gather(acq_per=1) #Gather.MaxLines=116508 580pts sp.setup_gather(acq_per=2) #setup_sync(self, crdId=1, prgId=2, plcId=2, mode=0, **kwargs): - sp.setup_sync() #no sync at all + #sp.setup_sync() #no sync at all #sp.setup_sync(mode=1) #sync with timing system (PROG) - #sp.setup_sync(mode=2) #sync with timing system and PLC to sync speed (PROG) + sp.setup_sync(mode=2) #sync with timing system and PLC to sync speed (PROG) #sp.gen_grid_points(w=2,h=2,pitch=50,rnd=.2);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10,acq_per=1) #sp.gen_swissmx_points(width=1000,ofs=(-500,0));sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=40,acq_per=1) @@ -650,8 +640,8 @@ if __name__=='__main__': #sp.gen_grid_points(w=2,h=20,pitch=50,rnd=0);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10,acq_per=1) #sp.gen_rand_points(n=500, scale=1000);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10,acq_per=1) - #sp.gen_grid_points(w=30,h=30,pitch=50,rnd=0.2);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=40) - sp.gen_rand_points(n=400, scale=1000);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10) + sp.gen_grid_points(w=30,h=30,pitch=50,rnd=0.2);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=40) + #sp.gen_rand_points(n=400, scale=1000);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10) #>>>setup gather and sync<<<