generate data to analyse MXTuning/19_01_29
This commit is contained in:
@@ -9,13 +9,14 @@
|
|||||||
tuning functions for ESB-MX
|
tuning functions for ESB-MX
|
||||||
|
|
||||||
Modes:
|
Modes:
|
||||||
bit 0=1: record/plot current step
|
bit 0=1: record/plot current step
|
||||||
bit 1=2: custom chirp record/plot for IdCmd->ActPos transfer function
|
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=4: custom chirp record/plot for DesPos->ActPos transfer function
|
||||||
bit 2=8: plot the full bode recording
|
bit 3=8: custom chirp record/plot for various transfer function
|
||||||
bit 3=16: plot the full bode recording with an approximation model
|
bit 4=16: plot the full bode recording
|
||||||
bit 4=32: plot all raw acquired data files
|
bit 5=32: plot the full bode recording with an approximation model
|
||||||
bit 5=64: generate observer code (after files generated with matlab)
|
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
|
-> 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
|
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
|
self.homed=False
|
||||||
|
|
||||||
|
|
||||||
def init_stage(self,fn=''):
|
def init_stage(self,mot=3,fn=''):
|
||||||
|
print(fn)
|
||||||
comm=self.comm
|
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
|
return
|
||||||
gpascii=comm.gpascii
|
gpascii=comm.gpascii
|
||||||
|
|
||||||
@@ -60,7 +62,7 @@ class MXTuning(Tuning):
|
|||||||
break
|
break
|
||||||
sys.stdout.write('.');sys.stdout.flush()
|
sys.stdout.write('.');sys.stdout.flush()
|
||||||
time.sleep(.2)
|
time.sleep(.2)
|
||||||
self.homed=True
|
self.homed=3
|
||||||
|
|
||||||
def bode_model_plot(self, mot):
|
def bode_model_plot(self, mot):
|
||||||
self.bode_full_plot(mot,self.baseDir)
|
self.bode_full_plot(mot,self.baseDir)
|
||||||
@@ -347,14 +349,17 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
|||||||
|
|
||||||
def run(self,mode):
|
def run(self,mode):
|
||||||
#plt.ion()
|
#plt.ion()
|
||||||
|
self.homed=0
|
||||||
if mode&1: # full recording current step
|
if mode&1: # full recording current step
|
||||||
plt.close('all')
|
plt.close('all')
|
||||||
self.homed=False
|
|
||||||
for mot in (1, 2):
|
for mot in (1, 2):
|
||||||
fn=os.path.join(self.baseDir, 'curr_step%d.npz' % mot)
|
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.bode_current(motor=mot, magMove=1000, magPhase=500, dwell=10, file=fn)
|
||||||
|
self.homed&=~mot
|
||||||
plt.show(block=False)
|
plt.show(block=False)
|
||||||
|
save_figs(fn)
|
||||||
f=np.load(fn)
|
f=np.load(fn)
|
||||||
fn=fn[:-3]+'mat'
|
fn=fn[:-3]+'mat'
|
||||||
import scipy.io
|
import scipy.io
|
||||||
@@ -362,8 +367,6 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
|||||||
print('save to matlab file:'+fn)
|
print('save to matlab file:'+fn)
|
||||||
|
|
||||||
if mode&2:
|
if mode&2:
|
||||||
plt.close('all')
|
|
||||||
self.homed=False
|
|
||||||
motLst = (1, 2) # (2,)#
|
motLst = (1, 2) # (2,)#
|
||||||
#recType:
|
#recType:
|
||||||
# IA 0 IqCmd,ActPos (for plant transfer function)
|
# 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
|
#>>>>> IqCmd->ActPos transfer function (plant) using closed loop for low frequencies
|
||||||
for mot in motLst:
|
for mot in motLst:
|
||||||
fn = os.path.join(self.baseDir, 'chirp_IA_%da.npz' % mot)
|
fn = os.path.join(self.baseDir, 'chirp_IA_%da.npz' % mot)
|
||||||
self.init_stage(fn)
|
self.init_stage(mot,fn)
|
||||||
self.custom_chirp(motor=mot, minFrq=1, maxFrq=15, amp=1000, tSec=15, recType=0,openLoop=False, file=fn)
|
plt.close('all')
|
||||||
self.homed=False
|
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
|
#>>>>> 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),
|
for ext,amp,minFrq,maxFrq,tSec in (('b', 10, 10, 100*1.5, 30),
|
||||||
('c', 50, 100, 300*1.5, 30),
|
('c', 50, 100, 300*1.5, 30),
|
||||||
('d', 50, 300, 1000*1.5, 10),
|
('d', 50, 300, 1000*1.5, 10),
|
||||||
('e', 100, 1000, 2000, 10)):
|
('e', 100, 1000, 2000, 10)):
|
||||||
self.homed=False
|
|
||||||
for mot in motLst:
|
for mot in motLst:
|
||||||
fn = os.path.join(self.baseDir, 'chirp_IA_%d%s.npz' % (mot,ext))
|
fn = os.path.join(self.baseDir, 'chirp_IA_%d%s.npz' % (mot,ext))
|
||||||
self.init_stage(fn)
|
self.init_stage(mot,fn)
|
||||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=0,openLoop=True, file=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:
|
if mode&4:
|
||||||
plt.close('all')
|
plt.close('all')
|
||||||
self.homed = False
|
motLst = (1, 2) #(2,)#
|
||||||
motLst = (1, 2) # (2,)#
|
|
||||||
#>>>>> desPos->actPos transfer function (regulation) using closed loop
|
#>>>>> desPos->actPos transfer function (regulation) using closed loop
|
||||||
#motor1: 0dB at 20.4 Hz
|
#motor1: 0dB at 20.4 Hz
|
||||||
#motor2: 0dB at 11.3 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),
|
('b', 20, 30, 75*1.5, 15),
|
||||||
('c', 5, 75, 150*1.5, 5),
|
('c', 5, 75, 150*1.5, 5),
|
||||||
('d', 1, 150, 750, 5)):
|
('d', 1, 150, 750, 5)):
|
||||||
self.homed=False
|
|
||||||
for mot in motLst:
|
for mot in motLst:
|
||||||
fn = os.path.join(self.baseDir, 'chirp_DA_%d%s.npz' % (mot,ext))
|
fn = os.path.join(self.baseDir, 'chirp_DA_%d%s.npz' % (mot,ext))
|
||||||
self.init_stage(fn)
|
self.init_stage(mot,fn)
|
||||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=1,openLoop=False, file=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
|
#>>>>> all data for different transfer function
|
||||||
for ext,amp,minFrq,maxFrq,tSec in (('a', 5, 10, 250, 10),):
|
#using closed loop with 1/w^2 lower amplitude
|
||||||
self.homed=False
|
for ext,amp,minFrq,maxFrq,tSec,crpMd,mot in (('a', 800, 10, 250, 20, 2, 1),
|
||||||
for mot in motLst:
|
('a', 800, 10, 250, 20, 2, 2),
|
||||||
fn = os.path.join(self.baseDir, 'chirp_all_%d%s.npz' % (mot,ext))
|
('b', 5, 10, 220, 20, 1, 1),
|
||||||
self.init_stage(fn)
|
('b', 5, 10, 220, 20, 1, 2),
|
||||||
self.custom_chirp(motor=mot, minFrq=minFrq, maxFrq=maxFrq, amp=amp, tSec=tSec, recType=2,openLoop=False, file=fn)
|
):
|
||||||
|
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):
|
if mode&16: #plot the full bode recording
|
||||||
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
|
|
||||||
plt.close('all')
|
plt.close('all')
|
||||||
self.bode_full_plot(mot=1,base=self.baseDir)
|
self.bode_full_plot(mot=1,base=self.baseDir)
|
||||||
self.bode_full_plot(mot=2,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')
|
plt.close('all')
|
||||||
self.bode_model_plot(mot=1)
|
self.bode_model_plot(mot=1)
|
||||||
self.bode_model_plot(mot=2)
|
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
|
# display bode plots
|
||||||
import glob
|
import glob
|
||||||
for fn in glob.glob(os.path.join(self.baseDir,'*.npz')):
|
for fn in glob.glob(os.path.join(self.baseDir,'*.npz')):
|
||||||
|
print(fn)
|
||||||
fh = np.load(fn)
|
fh = np.load(fn)
|
||||||
meta = fh['meta'].item()
|
meta = fh['meta'].item()
|
||||||
data = fh['data']
|
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:
|
#before this can be done, the observer controller has to be designed with matlab:
|
||||||
#s.a.ESB_MX/matlab/Readme.md
|
#s.a.ESB_MX/matlab/Readme.md
|
||||||
#clear;
|
#clear;
|
||||||
@@ -487,6 +505,18 @@ EXPORT_SYMBOL(obsvr_servo_ctrl_{motid});'''.format(motid=motid)
|
|||||||
print('done')
|
print('done')
|
||||||
plt.show()
|
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):
|
def bode(mdl):
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<ActiveTarget name="Debug" />
|
<ActiveTarget name="Debug" />
|
||||||
<File name="triggerSync.c" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
<File name="triggerSync.c" open="1" top="1" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||||
<Cursor>
|
<Cursor>
|
||||||
<Cursor1 position="2887" topLine="63" />
|
<Cursor1 position="1460" topLine="10" />
|
||||||
</Cursor>
|
</Cursor>
|
||||||
</File>
|
</File>
|
||||||
<File name="Makefile" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
<File name="Makefile" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||||
|
|||||||
Reference in New Issue
Block a user