generate data to analyse MXTuning/19_01_29
This commit is contained in:
@@ -9,13 +9,14 @@
|
||||
tuning functions for ESB-MX
|
||||
|
||||
Modes:
|
||||
bit 0=1: record/plot current step
|
||||
bit 1=2: custom chirp record/plot for IdCmd->ActPos transfer function
|
||||
bit 1=4: custom chirp record/plot for DesPos->ActPos transfer function
|
||||
bit 2=8: plot the full bode recording
|
||||
bit 3=16: plot the full bode recording with an approximation model
|
||||
bit 4=32: plot all raw acquired data files
|
||||
bit 5=64: generate observer code (after files generated with matlab)
|
||||
bit 0=1: record/plot current step
|
||||
bit 1=2: custom chirp record/plot for IdCmd->ActPos transfer function
|
||||
bit 2=4: custom chirp record/plot for DesPos->ActPos transfer function
|
||||
bit 3=8: custom chirp record/plot for various transfer function
|
||||
bit 4=16: plot the full bode recording
|
||||
bit 5=32: plot the full bode recording with an approximation model
|
||||
bit 6=64: plot all raw acquired data files
|
||||
bit 7=128: generate observer code (after files generated with matlab)
|
||||
|
||||
-> check https://github.com/klauer/ppmac for fast data gathering server which supports
|
||||
phase gathering -> not yet compiling: /home/zamofing_t/Documents/prj/SwissFEL/PowerBrickInspector/ppmac/fast_gather
|
||||
@@ -44,9 +45,10 @@ class MXTuning(Tuning):
|
||||
self.homed=False
|
||||
|
||||
|
||||
def init_stage(self,fn=''):
|
||||
def init_stage(self,mot=3,fn=''):
|
||||
print(fn)
|
||||
comm=self.comm
|
||||
if comm is None or self.homed or os.path.isfile(fn):
|
||||
if comm is None or (self.homed&mot)==mot or os.path.isfile(fn):
|
||||
return
|
||||
gpascii=comm.gpascii
|
||||
|
||||
@@ -60,7 +62,7 @@ class MXTuning(Tuning):
|
||||
break
|
||||
sys.stdout.write('.');sys.stdout.flush()
|
||||
time.sleep(.2)
|
||||
self.homed=True
|
||||
self.homed=3
|
||||
|
||||
def bode_model_plot(self, mot):
|
||||
self.bode_full_plot(mot,self.baseDir)
|
||||
@@ -347,14 +349,17 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
||||
|
||||
def run(self,mode):
|
||||
#plt.ion()
|
||||
self.homed=0
|
||||
if mode&1: # full recording current step
|
||||
plt.close('all')
|
||||
self.homed=False
|
||||
for mot in (1, 2):
|
||||
fn=os.path.join(self.baseDir, 'curr_step%d.npz' % mot)
|
||||
self.init_stage(fn)
|
||||
self.init_stage(mot,fn)
|
||||
plt.close('all')
|
||||
self.bode_current(motor=mot, magMove=1000, magPhase=500, dwell=10, file=fn)
|
||||
self.homed&=~mot
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
f=np.load(fn)
|
||||
fn=fn[:-3]+'mat'
|
||||
import scipy.io
|
||||
@@ -362,8 +367,6 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
||||
print('save to matlab file:'+fn)
|
||||
|
||||
if mode&2:
|
||||
plt.close('all')
|
||||
self.homed=False
|
||||
motLst = (1, 2) # (2,)#
|
||||
#recType:
|
||||
# IA 0 IqCmd,ActPos (for plant transfer function)
|
||||
@@ -374,25 +377,30 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
||||
#>>>>> IqCmd->ActPos transfer function (plant) using closed loop for low frequencies
|
||||
for mot in motLst:
|
||||
fn = os.path.join(self.baseDir, 'chirp_IA_%da.npz' % mot)
|
||||
self.init_stage(fn)
|
||||
self.custom_chirp(motor=mot, minFrq=1, maxFrq=15, amp=1000, tSec=15, recType=0,openLoop=False, file=fn)
|
||||
self.homed=False
|
||||
self.init_stage(mot,fn)
|
||||
plt.close('all')
|
||||
self.custom_chirp(motor=mot, minFrq=1, maxFrq=15, amp=1000, tSec=15, recType=0,mode=1, file=fn)
|
||||
self.homed &= ~mot
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
|
||||
#>>>>> IqCmd->ActPos transfer function (plant) using open loop for high frequencies
|
||||
for ext,amp,minFrq,maxFrq,tSec in (('b', 10, 10, 100*1.5, 30),
|
||||
('c', 50, 100, 300*1.5, 30),
|
||||
('d', 50, 300, 1000*1.5, 10),
|
||||
('e', 100, 1000, 2000, 10)):
|
||||
self.homed=False
|
||||
for mot in motLst:
|
||||
fn = os.path.join(self.baseDir, 'chirp_IA_%d%s.npz' % (mot,ext))
|
||||
self.init_stage(fn)
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=0,openLoop=True, file=fn)
|
||||
self.init_stage(mot,fn)
|
||||
plt.close('all')
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=0,mode=0, file=fn)
|
||||
self.homed&=~mot
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
|
||||
if mode&4:
|
||||
plt.close('all')
|
||||
self.homed = False
|
||||
motLst = (1, 2) # (2,)#
|
||||
motLst = (1, 2) #(2,)#
|
||||
#>>>>> desPos->actPos transfer function (regulation) using closed loop
|
||||
#motor1: 0dB at 20.4 Hz
|
||||
#motor2: 0dB at 11.3 Hz
|
||||
@@ -408,49 +416,59 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
||||
('b', 20, 30, 75*1.5, 15),
|
||||
('c', 5, 75, 150*1.5, 5),
|
||||
('d', 1, 150, 750, 5)):
|
||||
self.homed=False
|
||||
for mot in motLst:
|
||||
fn = os.path.join(self.baseDir, 'chirp_DA_%d%s.npz' % (mot,ext))
|
||||
self.init_stage(fn)
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=1,openLoop=False, file=fn)
|
||||
self.init_stage(mot,fn)
|
||||
plt.close('all')
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=1,mode=1, file=fn)
|
||||
self.homed&=~mot
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
|
||||
if mode & 8:
|
||||
#>>>>> all data for different transfer function
|
||||
for ext,amp,minFrq,maxFrq,tSec in (('a', 5, 10, 250, 10),):
|
||||
self.homed=False
|
||||
for mot in motLst:
|
||||
fn = os.path.join(self.baseDir, 'chirp_all_%d%s.npz' % (mot,ext))
|
||||
self.init_stage(fn)
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=2,openLoop=False, file=fn)
|
||||
#using closed loop with 1/w^2 lower amplitude
|
||||
for ext,amp,minFrq,maxFrq,tSec,crpMd,mot in (('a', 800, 10, 250, 20, 2, 1),
|
||||
('a', 800, 10, 250, 20, 2, 2),
|
||||
('b', 5, 10, 220, 20, 1, 1),
|
||||
('b', 5, 10, 220, 20, 1, 2),
|
||||
):
|
||||
fn = os.path.join(self.baseDir, 'chirp_all_%d%s.npz' % (mot,ext))
|
||||
self.init_stage(mot,fn)
|
||||
plt.close('all')
|
||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=2,mode=crpMd, file=fn)
|
||||
self.homed&=~mot
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
|
||||
if os.path.isfile(fn):
|
||||
f = np.load(fn)
|
||||
data = f['data']
|
||||
meta = f['meta'].item()
|
||||
meta['file'] = file
|
||||
if len(meta['address']) == 4:
|
||||
for xy in ((0, 1), (0, 3), (2, 3)):
|
||||
self.bode_plot(data, xy=xy, mode=25, **meta)
|
||||
|
||||
if mode&8: #plot the full bode recording
|
||||
if mode&16: #plot the full bode recording
|
||||
plt.close('all')
|
||||
self.bode_full_plot(mot=1,base=self.baseDir)
|
||||
self.bode_full_plot(mot=2,base=self.baseDir)
|
||||
plt.show(block=False)
|
||||
save_figs(os.path.join(self.baseDir,'bode_full_plot'))
|
||||
|
||||
if mode&16: #plot the full bode recording with an approximation model
|
||||
if mode&32: #plot the full bode recording with an approximation model
|
||||
plt.close('all')
|
||||
self.bode_model_plot(mot=1)
|
||||
self.bode_model_plot(mot=2)
|
||||
plt.show(block=False)
|
||||
save_figs(os.path.join(self.baseDir,'bode_model_plot'))
|
||||
|
||||
if mode&32: # plot all raw acquired data files
|
||||
if mode&64: # plot all raw acquired data files
|
||||
# display bode plots
|
||||
import glob
|
||||
for fn in glob.glob(os.path.join(self.baseDir,'*.npz')):
|
||||
print(fn)
|
||||
fh = np.load(fn)
|
||||
meta = fh['meta'].item()
|
||||
data = fh['data']
|
||||
self.bode_plot(data, mode=25, **meta)
|
||||
plt.close('all')
|
||||
self.bode_plot(data, mode=25, kwargs=meta)
|
||||
plt.show(block=False)
|
||||
save_figs(fn)
|
||||
|
||||
if mode&64: #generater code
|
||||
if mode&128: #generater code
|
||||
#before this can be done, the observer controller has to be designed with matlab:
|
||||
#s.a.ESB_MX/matlab/Readme.md
|
||||
#clear;
|
||||
@@ -487,6 +505,18 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
||||
print('done')
|
||||
plt.show()
|
||||
|
||||
def save_figs(fn):
|
||||
figures = [manager.canvas.figure
|
||||
for manager in mpl._pylab_helpers.Gcf.get_all_fig_managers()]
|
||||
#print(figures)
|
||||
fnBase=fn.rsplit('.')[0]
|
||||
(a,b)=os.path.split(fnBase)
|
||||
fnBase=os.path.join(a,'img',b)
|
||||
for i, figure in enumerate(figures):
|
||||
#figure.savefig('figure%d.png' % i)
|
||||
fn=fnBase+'%d.png' % i
|
||||
figure.savefig(fn)
|
||||
#figure.savefig(fn.rsplit('.')[0]+'%d.eps' % i)
|
||||
|
||||
|
||||
def bode(mdl):
|
||||
|
||||
Reference in New Issue
Block a user