diff --git a/python/shapepath.py b/python/shapepath.py index 90eb0ce..22e40dc 100755 --- a/python/shapepath.py +++ b/python/shapepath.py @@ -694,21 +694,6 @@ class ShapePath(MotionBase): ''' 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 comm=self.comm 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=16,h=16,pitch=120,rnd=0,ofs=(0,+2000));sp.sort_points(False,16); sp.meta['pt2pt_time']=10 #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... - #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_spiral_points(rStart=100,rInc=20,numSeg=8,numCir=32, ofs=(0, 0)) diff --git a/src/triggerSync/triggerSync b/src/triggerSync/triggerSync index 7aa55cb..c04b8cf 100755 Binary files a/src/triggerSync/triggerSync and b/src/triggerSync/triggerSync differ diff --git a/src/triggerSync/triggerSync.c b/src/triggerSync/triggerSync.c index d7562f2..7372bbb 100644 --- a/src/triggerSync/triggerSync.c +++ b/src/triggerSync/triggerSync.c @@ -41,15 +41,6 @@ static float timeCor=0.f; //time correction (frame to frame time adjustment) #define SIMFLAG0 (pshm->Coord[1].Q[10]) #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 SIMFLAG1 (pshm->P[11]) //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; 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 - double srvPer,srvPer2; - double mtAct,mtDes; //mt* motion time. Actual and desired. this is the accumulated time that controls motion speed + double srvPer; unsigned int maxDiff; struct GateArray3* gate3_1=GetGate3MemPtr(1); @@ -91,15 +81,14 @@ void trigsync_func(void *arg) //unsigned int lastQ12=0; //Q12 value for further sync double mvTimer; - double mxActPos,mxDesPos,mxHomePos=pshm->Motor[2].HomePos; - double myActPos,myDesPos,myHomePos=pshm->Motor[1].HomePos; + double mxActPos,mxDesPos,mxErr,mxHomePos=pshm->Motor[2].HomePos; + double myActPos,myDesPos,myErr,myHomePos=pshm->Motor[1].HomePos; printf("Wait motion program arrived at start position...\n"); while(pshm->Coord[1].Q[0]!=-3) rt_task_wait_period(NULL); pshm->Coord[1].Q[0]=-2; srvPer=pshm->ServoPeriod; - srvPer2=pshm->ServoPeriod; rtStart=rt_timer_read(); 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 pshm->Gather.Enable=2; //start gathering data pshm->Coord[1].Q[0]=-1; - ENCVAL=0; printf("Flag 1: %.5f ms\n", (rt_timer_read() - rtStart)/1E6); rtStart=rtLast=rt_timer_read(); scStart=scLast=pshm->ServoCount; - mtAct=0.f; pshm->Coord[1].Q[0]=0; - //pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed - pshm->Coord[1].DesTimeBase=srvPer*(mtPt2Pt+timeOfs)/mtPt2Pt; //start motion at default speed + pshm->Coord[1].DesTimeBase=srvPer; //start motion at default speed 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++) { @@ -159,43 +145,21 @@ void trigsync_func(void *arg) while(FLAG1) { rt_task_wait_period(NULL); - ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000; } while(!FLAG1) { rt_task_wait_period(NULL); - ENCVAL=( (i-1)*mtPt2Pt + (pshm->ServoCount-scLast)*srvPer )*1000; } } //FEL shot arrived FLAG1 0->1 - //ENCVAL+=mtPt2Pt*1000; //ENCVAL in us - ENCVAL=i*mtPt2Pt*1000; //ENCVAL in us rtCur = rt_timer_read(); 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; scDiff=scCur-scLast; - mtAct+=scDiff*srvPer+timeCor; - mtDes=i*mtPt2Pt+timeOfs; - srvPer=(mtPt2Pt+mtDes-mtAct)/scDiff; //srvPer=pshm->ServoPeriod; //default speed - // mvTimer > 0 motion leading FEL -> decrease srvPer // mvTimer < 0 motion lagging FEL -> increase srvPer // rtDiff > mtPt2Pt -> increase srvPer @@ -204,19 +168,20 @@ void trigsync_func(void *arg) if(mvTimer>mtPt2Pt/2) //lagging 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]++; if(mode&8) { mxActPos=pshm->Motor[2].ActPos;mxDesPos=pshm->Motor[2].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 Nsync:(%d) ", pshm->Coord[1].Nsync); //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, rtDiff:%.3fms scDiff:%d mtAct:%.3f mtDes:%.3f srvPer:%.6f ENCVAL:%u \n", i, rtDiff/1E6,scDiff, mtAct,mtDes,srvPer,ENCVAL); + 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); } rtLast=rtCur; scLast=scCur;