This commit is contained in:
2022-10-06 13:56:32 +02:00
parent 9c6d9df97f
commit fab5ecdc2b
3 changed files with 12 additions and 62 deletions

View File

@@ -694,21 +694,6 @@ class ShapePath(MotionBase):
''' '''
prg=['close all buffers','open prog %d'%(prgId)] prg=['close all buffers','open prog %d'%(prgId)]
#Use EncTable 20 as Frame counter
#dont use Coord[1].DesTimeBase as the time base but use the virtual encoder:
# Coord[1].pDesTimeBase=Coord[1].DesTimeBase.a #(default)
prg.append('''\
EncTable[20].type = 1 //32 Bit uint
EncTable[20].pEnc = Sys.Udata[0].a
EncTable[20].index1 = 0
EncTable[20].index2 = 0
EncTable[20].index3 = 0
EncTable[20].index4 = 0
EncTable[20].index5 = 0
EncTable[20].index5 = 0
EncTable[20].ScaleFactor=1E-3
//Coord[1].pDesTimeBase=EncTable[20].DeltaPos.a
''')
verb=self.verbose verb=self.verbose
comm=self.comm comm=self.comm
if comm is not None: if comm is not None:
@@ -914,9 +899,9 @@ if __name__=='__main__':
#sp.gen_grid_points(w=50,h=50,pitch=120,rnd=0,ofs=(0,+2000));sp.sort_points(False,50); sp.meta['pt2pt_time']=10 #sp.gen_grid_points(w=50,h=50,pitch=120,rnd=0,ofs=(0,+2000));sp.sort_points(False,50); sp.meta['pt2pt_time']=10
#sp.gen_grid_points(w=16,h=16,pitch=120,rnd=0,ofs=(0,+2000));sp.sort_points(False,16); sp.meta['pt2pt_time']=10 #sp.gen_grid_points(w=16,h=16,pitch=120,rnd=0,ofs=(0,+2000));sp.sort_points(False,16); sp.meta['pt2pt_time']=10
#12.5x12.5 #12.5x12.5
sp.gen_grid_points(w=78,h=78,pitch=120,rnd=0,ofs=(-10000,-12000));sp.sort_points(False,78); sp.meta['pt2pt_time']=10 #sp.gen_grid_points(w=78,h=78,pitch=120,rnd=0,ofs=(-10000,-12000));sp.sort_points(False,78); sp.meta['pt2pt_time']=10
#23.0x23.0 -> only 3 data points from shot to shot: 6,9,12,14,17,20... #23.0x23.0 -> only 3 data points from shot to shot: 6,9,12,14,17,20...
#sp.gen_grid_points(w=162,h=162,pitch=120,rnd=0,ofs=(-10000,-12000));sp.sort_points(False,162); sp.meta['pt2pt_time']=10 sp.gen_grid_points(w=162,h=162,pitch=120,rnd=0,ofs=(-10000,-12000));sp.sort_points(False,162); sp.meta['pt2pt_time']=10
#sp.gen_grid_points(w=1,h=10,pitch=100,rnd=0,ofs=(0,0)) #sp.gen_grid_points(w=1,h=10,pitch=100,rnd=0,ofs=(0,0))
#sp.gen_spiral_points(rStart=100,rInc=20,numSeg=8,numCir=32, ofs=(0, 0)) #sp.gen_spiral_points(rStart=100,rInc=20,numSeg=8,numCir=32, ofs=(0, 0))

Binary file not shown.

View File

@@ -41,15 +41,6 @@ static float timeCor=0.f; //time correction (frame to frame time adjustment)
#define SIMFLAG0 (pshm->Coord[1].Q[10]) #define SIMFLAG0 (pshm->Coord[1].Q[10])
#define SIMFLAG1 (pshm->Coord[1].Q[11]) #define SIMFLAG1 (pshm->Coord[1].Q[11])
//EncTable[20].pEnc= Coord[1].Q[12].a does not work
//EncTable[20].pEnc= Sys.Udata[0].a works uint32
//EncTable[20].pEnc= Sys.Idata[0].a works int32
//EncTable[20].pEnc= Sys.Fdata[0].a works float32
//EncTable[20].pEnc= Sys.Ddata[0].a works float64
//#define ENCVAL (*((double *)pushm+0))
#define ENCVAL (*((unsigned int *)pushm+0))
//#define SIMFLAG0 (pshm->P[10]) //#define SIMFLAG0 (pshm->P[10])
//#define SIMFLAG1 (pshm->P[11]) //#define SIMFLAG1 (pshm->P[11])
//Power PMAC Software Reference Manual.pdf Gate3[i].Chan[j].Status -> page 919 UserFlag //Power PMAC Software Reference Manual.pdf Gate3[i].Chan[j].Status -> page 919 UserFlag
@@ -76,8 +67,7 @@ void trigsync_func(void *arg)
int i; int i;
RTIME rtStart,rtLast,rtCur,rtDiff; //rt* is real time of the rt-process RTIME rtStart,rtLast,rtCur,rtDiff; //rt* is real time of the rt-process
unsigned int scStart,scLast,scCur,scDiff; //sc* are servo counts of the motion unsigned int scStart,scLast,scCur,scDiff; //sc* are servo counts of the motion
double srvPer,srvPer2; double srvPer;
double mtAct,mtDes; //mt* motion time. Actual and desired. this is the accumulated time that controls motion speed
unsigned int maxDiff; unsigned int maxDiff;
struct GateArray3* gate3_1=GetGate3MemPtr(1); struct GateArray3* gate3_1=GetGate3MemPtr(1);
@@ -91,15 +81,14 @@ void trigsync_func(void *arg)
//unsigned int lastQ12=0; //Q12 value for further sync //unsigned int lastQ12=0; //Q12 value for further sync
double mvTimer; double mvTimer;
double mxActPos,mxDesPos,mxHomePos=pshm->Motor[2].HomePos; double mxActPos,mxDesPos,mxErr,mxHomePos=pshm->Motor[2].HomePos;
double myActPos,myDesPos,myHomePos=pshm->Motor[1].HomePos; double myActPos,myDesPos,myErr,myHomePos=pshm->Motor[1].HomePos;
printf("Wait motion program arrived at start position...\n"); printf("Wait motion program arrived at start position...\n");
while(pshm->Coord[1].Q[0]!=-3) while(pshm->Coord[1].Q[0]!=-3)
rt_task_wait_period(NULL); rt_task_wait_period(NULL);
pshm->Coord[1].Q[0]=-2; pshm->Coord[1].Q[0]=-2;
srvPer=pshm->ServoPeriod; srvPer=pshm->ServoPeriod;
srvPer2=pshm->ServoPeriod;
rtStart=rt_timer_read(); rtStart=rt_timer_read();
printf("Wait for 'arm' event...\n"); printf("Wait for 'arm' event...\n");
@@ -132,17 +121,14 @@ void trigsync_func(void *arg)
//FEL shot arrived FLAG1 0->1: first frame trigger before first cristall //FEL shot arrived FLAG1 0->1: first frame trigger before first cristall
pshm->Gather.Enable=2; //start gathering data pshm->Gather.Enable=2; //start gathering data
pshm->Coord[1].Q[0]=-1; pshm->Coord[1].Q[0]=-1;
ENCVAL=0;
printf("Flag 1: %.5f ms\n", (rt_timer_read() - rtStart)/1E6); printf("Flag 1: %.5f ms\n", (rt_timer_read() - rtStart)/1E6);
rtStart=rtLast=rt_timer_read(); rtStart=rtLast=rt_timer_read();
scStart=scLast=pshm->ServoCount; scStart=scLast=pshm->ServoCount;
mtAct=0.f;
pshm->Coord[1].Q[0]=0; pshm->Coord[1].Q[0]=0;
//pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed
pshm->Coord[1].DesTimeBase=srvPer*(mtPt2Pt+timeOfs)/mtPt2Pt; //start motion at default speed
if(mode&8) if(mode&8)
printf("Start: rtStart:%.3f ms scStart:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f\n", i, rtLast/1E6,scLast, mtAct,mtDes,srvPer); printf("Start: rtStart:%.3f ms scStart:%d srvPer:%.6f\n", i, rtLast/1E6,scLast, srvPer);
for(i=1;pshm->Gather.Enable;i++) for(i=1;pshm->Gather.Enable;i++)
{ {
@@ -159,43 +145,21 @@ void trigsync_func(void *arg)
while(FLAG1) while(FLAG1)
{ {
rt_task_wait_period(NULL); rt_task_wait_period(NULL);
ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000;
} }
while(!FLAG1) while(!FLAG1)
{ {
rt_task_wait_period(NULL); rt_task_wait_period(NULL);
ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000;
} }
} }
//FEL shot arrived FLAG1 0->1 //FEL shot arrived FLAG1 0->1
//ENCVAL+=mtPt2Pt*1000; //ENCVAL in us
ENCVAL=i*mtPt2Pt*1000; //ENCVAL in us
rtCur = rt_timer_read(); rtCur = rt_timer_read();
scCur=pshm->ServoCount; scCur=pshm->ServoCount;
//if (lastQ12!=(unsigned int)pshm->Coord[1].Q[12])
//{
// //'Coord[1].Q[12]=Sys.ServoCount'
// //'Coord[1].Q[13]={idxOfPoint}'
// //type of pshm->Coord[1].Q[12] is double
// lastQ12=(unsigned int)pshm->Coord[1].Q[12]; //saved ServoCount in program code
// //mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].DesPos;
// //myActPos=pshm->Motor[1].ActPos;myDesPos=pshm->Motor[1].DesPos;
// //printf("*** SYNC *** Trigger count:%d, ProgIdx:%d, ServoCount diff:%d-%d=%d", i, (unsigned int)pshm->Coord[1].Q[13], lastQ12,scCur, lastQ12-scCur);
// printf("*** SYNC *** Trigger count:%d, myDesPos:%.2f, ServoCount diff:%d-%d=%d\n", i, pshm->Coord[1].Q[13]-myHomePos, lastQ12,scCur, lastQ12-scCur);
// //printf(" X,Y ActPos:(%.5g %.5g) DesPos:(%.5g %.5g)\n", mxActPos-mxHomePos, myActPos-myHomePos, mxDesPos-mxHomePos, myDesPos-myHomePos);
//}
rtDiff=rtCur-rtLast; rtDiff=rtCur-rtLast;
scDiff=scCur-scLast; scDiff=scCur-scLast;
mtAct+=scDiff*srvPer+timeCor;
mtDes=i*mtPt2Pt+timeOfs;
srvPer=(mtPt2Pt+mtDes-mtAct)/scDiff;
//srvPer=pshm->ServoPeriod; //default speed //srvPer=pshm->ServoPeriod; //default speed
// mvTimer > 0 motion leading FEL -> decrease srvPer // mvTimer > 0 motion leading FEL -> decrease srvPer
// mvTimer < 0 motion lagging FEL -> increase srvPer // mvTimer < 0 motion lagging FEL -> increase srvPer
// rtDiff > mtPt2Pt -> increase srvPer // rtDiff > mtPt2Pt -> increase srvPer
@@ -204,19 +168,20 @@ void trigsync_func(void *arg)
if(mvTimer>mtPt2Pt/2) //lagging if(mvTimer>mtPt2Pt/2) //lagging
mvTimer-=mtPt2Pt; mvTimer-=mtPt2Pt;
//srvPer2*=(rtDiff/1E6-mvTimer)/mtPt2Pt; //srvPer2*=(rtDiff/1E6-mvTimer)/mtPt2Pt;
srvPer2=pshm->ServoPeriod*(rtDiff/1E6-mvTimer)/mtPt2Pt; srvPer=pshm->ServoPeriod*(rtDiff/1E6-mvTimer)/mtPt2Pt;
pshm->Coord[1].DesTimeBase=srvPer2; pshm->Coord[1].DesTimeBase=srvPer;
pshm->Coord[1].Q[0]++; pshm->Coord[1].Q[0]++;
if(mode&8) if(mode&8)
{ {
mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].DesPos; mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].DesPos;
myActPos=pshm->Motor[1].ActPos;myDesPos=pshm->Motor[1].DesPos; myActPos=pshm->Motor[1].ActPos;myDesPos=pshm->Motor[1].DesPos;
mxErr=mxDesPos-mxActPos;
myErr=myDesPos-myActPos;
//printf(" X,Y ActPos:(%.5g %.5g) DesPos:(%.5g %.5g) ", mxActPos-mxHomePos, myActPos-myHomePos, mxDesPos-mxHomePos, myDesPos-myHomePos); //printf(" X,Y ActPos:(%.5g %.5g) DesPos:(%.5g %.5g) ", mxActPos-mxHomePos, myActPos-myHomePos, mxDesPos-mxHomePos, myDesPos-myHomePos);
//printf(" X,Y Nsync:(%d) ", pshm->Coord[1].Nsync); //printf(" X,Y Nsync:(%d) ", pshm->Coord[1].Nsync);
//printf(" X,Y MoveTimer:(%.5g %.5g) ", pshm->Motor[1].MoveTimer,pshm->Motor[2].MoveTimer); //printf(" X,Y MoveTimer:(%.5g %.5g) ", pshm->Motor[1].MoveTimer,pshm->Motor[2].MoveTimer);
printf(" Nsync:%d, MoveTimer:(%.5g) srvPer2:%.6f ", pshm->Coord[1].Nsync,mvTimer,srvPer2); printf("Trigger count:%d, Nsync:%d, MoveTimer:%.5g srvPer:%.6f rtDiff:%.3fms scDiff:%d PosErrXY:(%.3f,%.3f)\n",i, pshm->Coord[1].Nsync,mvTimer,srvPer, rtDiff/1E6,scDiff,mxErr,myErr);
printf("Trigger count:%d, rtDiff:%.3fms scDiff:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f ENCVAL:%u \n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer,ENCVAL);
} }
rtLast=rtCur; rtLast=rtCur;
scLast=scCur; scLast=scCur;