From 41a1fd3d38329ee2d0c813e7fc094100f4585f16 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Thu, 8 Nov 2018 14:23:43 +0100 Subject: [PATCH] work on tuning --- Makefile | 3 +- Readme.md | 6 ++-- matlab/StateSpaceControlDesign.m | 42 ++++++++------------------ matlab/observer.slx | Bin 26003 -> 26153 bytes matlab/stage_closed_loop.slx | Bin 35507 -> 35992 bytes python/MXTuning.py | 49 ++++++++++++++++++++++++------- python/shapepath.py | 6 ++-- 7 files changed, 60 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 5075207..95f7951 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ MODULE = $(notdir $(shell pwd)) BUILDCLASSES = Linux ARCH_FILTER = eldk42% SL6-x86_64 EXCLUDE_VERSIONS = 3.14.8 -SCRIPTS+=$(wildcard add_EXPMX*.cmd cfg/*.cfg cfg/*.py cfg/*.pbi python/*.py) +#SCRIPTS+=$(wildcard add_EXPMX*.cmd cfg/*.cfg cfg/*.py cfg/*.pbi python/*.py) +SCRIPTS+=$(wildcard add_EXPMX*.cmd cfg/*.cfg cfg/*.pbi) #SOURCES+=src/DHVSaSub.cpp #DBDS+=src/DHVSaSub.dbd USR_CXXFLAGS+= -fno-operator-names diff --git a/Readme.md b/Readme.md index ddc8272..8448f07 100644 --- a/Readme.md +++ b/Readme.md @@ -1098,12 +1098,14 @@ Software esbMX deploy zamofing_t@ganymede:~$ ll /sf/bernina/config/swissmx/zamofing_t/ /sf/bernina/config/swissmx/ ssh saresb-cons-01 - ssh sf-cons-01 + ssh sf-cons-01 source /opt/gfa/python source activate /sf/bernina/config/swissmx/conda/envs/b440_clone -zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python$ +zamofing_t@ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python$ cp -rL ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py ~/Documents/prj/SwissFEL/PBTools/pbtools/ /sf/bernina/config/swissmx/zamofing_t/ +scp -r ganymede:~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX/python/*.py ganymede:~/Documents/prj/SwissFEL/PBTools/pbtools/ /sf/bernina/config/swissmx/zamofing_t/ + ``` diff --git a/matlab/StateSpaceControlDesign.m b/matlab/StateSpaceControlDesign.m index 2ae1427..a63f972 100644 --- a/matlab/StateSpaceControlDesign.m +++ b/matlab/StateSpaceControlDesign.m @@ -16,7 +16,6 @@ function [ssc]=StateSpaceControlDesign(mot) % % https://www.youtube.com/watch?v=Lax3etc837U - %ss_ol=mot.ssPlt; ssPlt=mot.ssPlt; %real plant (model of real plant) ssPlt.Name='open loop plant'; ssMdl=mot.ssMdl;%ssMdl; %simplified model (observable,controlable) for observer @@ -93,6 +92,7 @@ function [ssc]=StateSpaceControlDesign(mot) P=[p1 p1' p2 p2' p3 p3'];% p4 p4' p5 p5' p6 p6']; end end + %P=P*.1; % P was too aggressive K = place(Am,Bm,P); %K = acker(Am,Bm,Pm); end %if lqr @@ -118,29 +118,7 @@ function [ssc]=StateSpaceControlDesign(mot) % *** observer controller *** % %observer poles-> 5 times farther left than system poles - if mot.id==1 - op1=(p1*5); - op2=(p2*5); - if length(poles)>4 - op3=(p3*5); - OP=[op1 op1' op2 op2' op3 op3']; - else - OP=[op1 op1' op2 op2']; - end - - else - op1=(p1*2); - op2=(p2*2); - if length(poles)>4 - op3=(p3*2); - op4=(p4*2); - op5=(p5*2); - op6=(p6*2); - OP=[op1 op1' op2 op2' op3 op3'];% op4 op4' op5 op5' op6 op6']; - else - OP=[op1 op1' op2 op2']; - end - end + OP=2*P; L=place(Am',Cm',OP)'; %L=acker(A',C',OP)'; @@ -150,8 +128,9 @@ function [ssc]=StateSpaceControlDesign(mot) zeros(size(Bm)) ]; Ct = [ Cm zeros(size(Cm)) ]; + Dt=0; % step answer on closed loop with observer controller: - ss_t = ss(At,Bt,Ct,0,'Name','observer controller','InputName',{'desPos'},'OutputName',mot.ssMdl.OutputName); + ss_t = ss(At,Bt,Ct,Dt,'Name','observer controller','InputName',{'desPos'},'OutputName',mot.ssMdl.OutputName); figure();lsim(ss_t,ones(size(t)),t,[xm0 xm0]);title('step on closed loop with observer'); @@ -159,12 +138,12 @@ function [ssc]=StateSpaceControlDesign(mot) % Ts=1/5000; % 5kHz ss_tz = c2d(ss_t,Ts); + [Atz,Btz,Ctz,Dtz]=ssdata(ss_tz ); ss_tz .Name='discrete obsvr ctrl'; % step answer on closed loop with disctrete observer controller: t = 0:Ts:.05; figure();lsim(ss_tz ,ones(size(t)),t,[xm0 xm0]);title('step on closed loop with observer discrete'); - %plot all bode diagrams of desPos->actPos figure(); h=bodeplot(ss_cl(3),ss_t(3),ss_tz(3)); @@ -182,20 +161,23 @@ function [ssc]=StateSpaceControlDesign(mot) Do=zeros(size(Co,1),size(Bo,2)); ss_o = ss(Ao,Bo,Co,Do,'Name','observer controller','InputName',{'desPos','iqMeas','iqVolts','actPos'},'OutputName',{'k*xt'}); - + + %discrete plant + ssPltz = c2d(ssPlt,Ts); + [Apz,Bpz,Cpz,Dpz]=ssdata(ssPltz); + + %discrete observer controller ss_oz = c2d(ss_o,Ts); [Aoz,Boz,Coz,Doz]=ssdata(ss_oz); mdlName='observer'; open(mdlName); -ssPltz = c2d(ssPlt,Ts); -[Apz,Bpz,Cpz,Dpz]=ssdata(ssPltz); %state space controller ssc=struct(); - for k=["Ts","Ap","Bp","Cp","Dp","Ao","Bo","Co","Do","Apz","Bpz","Cpz","Dpz","Aoz","Boz","Coz","Doz","V","K","L","ss_cl","ss_o","ss_oz","numV","denV"] + for k=["Ts","At","Bt","Ct","Dt","Atz","Btz","Ctz","Dtz","Ap","Bp","Cp","Dp","Am","Bm","Cm","Dm","Ao","Bo","Co","Do","Apz","Bpz","Cpz","Dpz","Aoz","Boz","Coz","Doz","V","K","L","ss_cl","ss_o","ss_oz","numV","denV"] ssc=setfield(ssc,k,eval(k)); end save(sprintf('/tmp/ssc%d.mat',mot.id),'-struct','ssc'); diff --git a/matlab/observer.slx b/matlab/observer.slx index 9e2673c5b669ef1418b252f41b0bc70c9e42ae6a..25462e5ba9bfc479be9f4367f410af30c6fa1e8a 100644 GIT binary patch delta 12893 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 ZL}yM1vHA=2>lZc1-y98Q#_0cg`aiC9^ppSq delta 12735 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 diff --git a/matlab/stage_closed_loop.slx b/matlab/stage_closed_loop.slx index 0a29f9a1fff79aef90fc1653bfcc78244f15ebf8..6afde47fbe978e22d8a71e3bc94af0c9dd702b80 100644 GIT binary patch delta 13934 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 diff --git a/python/MXTuning.py b/python/MXTuning.py index 30d7c14..88daf45 100755 --- a/python/MXTuning.py +++ b/python/MXTuning.py @@ -335,8 +335,8 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n ' args=parser.parse_args() #plt.ion() - args.host='MOTTEST-CPPM-CRM0573' - args.host=None + #args.host='MOTTEST-CPPM-CRM0573' + #args.host=None if args.host is None: comm=gt=None else: @@ -412,7 +412,8 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n ' elif mode == 6: # plot all raw acquired data files # display bode plots - for fn in args.plot: + import glob + for fn in glob.glob(os.path.join(base,'*.npz')): if os.path.basename(fn).startswith('sine_ol_mot'): tune.bode_sine(openloop=True, file=fn) if os.path.basename(fn).startswith('chirp_ol_mot'): @@ -421,14 +422,33 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n ' tune.bode_sine(openloop=False, file=fn) if os.path.basename(fn).startswith('chirp_cl_mot'): tune.bode_chirp(openloop=False, file=fn) - print('done') elif mode==7: #further tests - #tune.init_stage(); - plt.close('all') - #tune.custom_chirp() - tune.custom_chirp(motor=1,minFrq=100,maxFrq=3000,amp=10,tSec=5,mode=0,file='/tmp/cst_chirp0.npz') - #tune.custom_chirp(motor=2,minFrq=1,maxFrq=1000,tSec=5,mode=1,file='/tmp/cst_chirp1.npz') - #tune.custom_chirp(motor=1,minFrq=1,maxFrq=3000,tSec=5,mode=2,file='/tmp/cst_chirp2.npz') + fn='/tmp/cst_chirp0.npz' + motLst=(1, 2)#(2,)# + init_stage=False + for mot in motLst: + fn=os.path.join(base, 'cst_chirp_s_ol_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=100,maxFrq=1000,amp=50,tSec=15,mode=0,file=fn) + init_stage=False + for mot in motLst: + fn=os.path.join(base, 'cst_chirp_s_cl1_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=1,maxFrq=100,amp=20,tSec=15,mode=1,file=fn) + init_stage=False + for mot in motLst: + fn=os.path.join(base, 'cst_chirp_s_cl2a_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=1,maxFrq=30,amp=100,tSec=30,mode=2,file=fn) + for mot in motLst: + fn=os.path.join(base, 'cst_chirp_s_cl2b_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=20,maxFrq=150,amp=10,tSec=30,mode=2,file=fn) + init_stage=False + for mot in motLst: + fn=os.path.join(base, 'cst_chirp_s_cl2c_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=100,maxFrq=300,amp=1,tSec=30,mode=2,file=fn) elif mode==8: #generater code #before this can be done, the observer controller has to be designed with matlab: #s.a.ESB_MX/matlab/Readme.md @@ -462,6 +482,15 @@ Examples:'''+''.join(map(lambda s:cmd+s, exampleCmd))+'\n ' fh.close() print(fnc+' generated.') print('now compile it looking at PBTools/pbtools/usr_servo_phase/usrServoSample') + elif mode==9: #SCRATCH + motLst=(1, 2)#(2,)# + init_stage=False + for mot in motLst: + fn=os.path.join(base, 'scratch_%d.npz' % mot) + if not init_stage and not os.path.isfile(fn):tune.init_stage();init_stage=True + tune.custom_chirp(motor=mot,minFrq=1,maxFrq=20,amp=200,tSec=15,mode=2,file=fn) + + print('done') plt.show() #------------------ Main Code ---------------------------------- #ssh_test()'/tmp/usrcode.c' diff --git a/python/shapepath.py b/python/shapepath.py index f397259..fb5e4b2 100755 --- a/python/shapepath.py +++ b/python/shapepath.py @@ -552,16 +552,16 @@ if __name__=='__main__': #setup_gather(self, acq_per=1) - sp.setup_gather() + 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(mode=1) #sync with timing system #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(scale=10);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10,acq_per=1) + sp.gen_swissmx_points(scale=10);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=40,acq_per=1) #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_rand_points(n=500, scale=1000);sp.sort_points(xy);sp.setup_motion(fnPrg=fn+'.prg',mode=1,pt2pt_time=10,acq_per=1) #>>>setup gather and sync<<<