FEDRA emulsion software from the OPERA Collaboration
AcqSerialPlateChanger Class Reference

#include <AcqSerialPlateChanger.h>

Inheritance diagram for AcqSerialPlateChanger:
Collaboration diagram for AcqSerialPlateChanger:

Public Member Functions

 AcqSerialPlateChanger ()
 
void AddToBank (int bnk, TPlateS *plate)
 
int ArmVacuumControl (bool VacOn, int timeout)
 
int FindEmulsion (IdentifierS id, int Bank)
 
int GetLoadedId (int *id0=NULL, int *id1=NULL, int *id2=NULL, int *id3=NULL)
 
int GoOnHAxis (int position, int timeout)
 
int GoOnVAxis (int position, int timeout)
 
int Initialize (AcqStage1 *Stage=NULL)
 
void LoadBrick (int Brick, int Nemulsions=57, int SrcBank=1, int DestBank=2, bool Separators=true, bool FirstIsSeparator=true)
 
int LoadPlate (IdentifierS id)
 
int LoadPlate (int id0, int id1, int id2=0, int id3=0)
 
int MoveEmulsion (int isrc, int idst)
 
void OnReset ()
 
int Park (int idst)
 
int PowerOFF (int timeout=100)
 
int PowerON (int timeout=100)
 
virtual void Print ()
 
int ReadStatusFile ()
 
void ResetBanks ()
 
int TableVacuumControl (bool VacOn, int timeout, bool BlowOn=false)
 
TPlateS * TakeFromBank (int bnk)
 
void UnloadBrick ()
 
int UnloadPlate (bool TurnPowerOff=true)
 
void UpdateStatusFile ()
 
virtual ~AcqSerialPlateChanger ()
 

Public Attributes

int ComBaud
 
int ComPort
 
bool Debug
 
int DestinationBank
 
bool InitDone
 
bool LiftCorners
 
int NumberOfAttempt
 
int NumberOfBanks
 
int PositionTimeout
 
bool Ready
 
int SeparationAttempts
 
int SourceBank
 
AcqStage1 * ST
 
bool StageError
 
int VacuumTimeout
 
float XLoadPosition
 
float YLoadPosition
 
float ZLoadPosition
 

Private Attributes

AcqCOM * port
 
float StX
 
float StY
 
float StZ
 
char VacRegister
 

Constructor & Destructor Documentation

◆ AcqSerialPlateChanger()

AcqSerialPlateChanger::AcqSerialPlateChanger ( )
31 {
32  InitDone=false;
33  Ready=false;
34  PositionTimeout=50;
35  NumberOfBanks=3;
36  VacuumTimeout=10;
37  LiftCorners=false;
38  NumberOfAttempt=20;
40  ST=NULL;
41  XLoadPosition=-63082;
42  YLoadPosition=12485;
43  ZLoadPosition=5000;
44  SourceBank=1;
46  StageError=false;
47  ComPort=1; //default COM1
48  ComBaud=19200;
49  VacRegister=0;
50  Debug=0; // default - no debug messages produced
51 
52 
53 }
bool StageError
Definition: AcqSerialPlateChanger.h:105
bool Ready
Definition: AcqSerialPlateChanger.h:104
int PositionTimeout
Definition: AcqSerialPlateChanger.h:110
int SourceBank
Definition: AcqSerialPlateChanger.h:108
float XLoadPosition
Definition: AcqSerialPlateChanger.h:119
bool LiftCorners
Definition: AcqSerialPlateChanger.h:113
float YLoadPosition
Definition: AcqSerialPlateChanger.h:120
int ComPort
Definition: AcqSerialPlateChanger.h:92
float ZLoadPosition
Definition: AcqSerialPlateChanger.h:121
int ComBaud
Definition: AcqSerialPlateChanger.h:93
int SeparationAttempts
Definition: AcqSerialPlateChanger.h:116
int NumberOfAttempt
Definition: AcqSerialPlateChanger.h:115
int DestinationBank
Definition: AcqSerialPlateChanger.h:109
bool Debug
Definition: AcqSerialPlateChanger.h:126
int VacuumTimeout
Definition: AcqSerialPlateChanger.h:111
int NumberOfBanks
Definition: AcqSerialPlateChanger.h:112
char VacRegister
Definition: AcqSerialPlateChanger.h:64
AcqStage1 * ST
Definition: AcqSerialPlateChanger.h:123
bool InitDone
Definition: AcqSerialPlateChanger.h:103
#define NULL
Definition: nidaqmx.h:84

◆ ~AcqSerialPlateChanger()

AcqSerialPlateChanger::~AcqSerialPlateChanger ( )
virtual
80 {
81  OnReset();
82 }
void OnReset()
Definition: AcqSerialPlateChanger.cxx:85

Member Function Documentation

◆ AddToBank()

void AcqSerialPlateChanger::AddToBank ( int  bnk,
TPlateS *  plate 
)
734 {
735  // puts the info on plate to the container (nothing is done physically)
736  // to keep track of real world situation
737  for(int i=BankS[bnk].NEmulsions+BankS[bnk].NSeparators;i>0;i--) {
738  BankS[bnk].Plates[i]=BankS[bnk].Plates[i-1];
739  }
740  plate->InBank=bnk;
741  plate->SeqNumber=0;
742  BankS[bnk].Plates[0]=plate;
743  if(plate->IsSeparator) BankS[bnk].NSeparators++;
744  else BankS[bnk].NEmulsions++;
746 
747 }
TBankS BankS[5]
Definition: AcqSerialPlateChanger.cxx:25
void UpdateStatusFile()
Definition: AcqSerialPlateChanger.cxx:346
Int_t plate
Definition: merge_Energy_SytematicSources_Electron.C:1
int NEmulsions
Definition: AcqSerialPlateChanger.h:51
TPlateS * Plates[MAX_NUMBER_OF_PLATES *2]
Definition: AcqSerialPlateChanger.h:53
int NSeparators
Definition: AcqSerialPlateChanger.h:52

◆ ArmVacuumControl()

int AcqSerialPlateChanger::ArmVacuumControl ( bool  VacOn,
int  timeout 
)
210 {
211  // Switches the vacuum on/off at arm holder, if vacuum is not reached within given timeout returns -timeout,
212  // otherwise returns actual time spent to reach vacuum
213  if(Debug) printf("ArmVacuumControl(%d,%d) called.\n",VacOn,timeout);
214  int tme=0;
215  int res;
216  char str[8];
217  char rep[128];
218  str[0]='V';
219  if(VacOn) VacRegister= VacRegister | 0x01; else VacRegister = VacRegister & 0xFE;
220  str[1]=VacRegister;
221  bool Reached=false;
222  if(port->SendString(str,2)!=2) return -tme;
223  while( !Reached && tme<timeout)
224  {
225  str[0]='Q';
226  if(port->SendString(str,1)!=1) return -tme;
227  port->Flush();
228  gSystem->Sleep(50);tme++;
229  port->Flush();
230  res=port->RecvString(rep,5);
231 if(Debug) printf("res=0x%x rep[0]=0x%x rep[4]=0x%x \n",res,rep[0],((unsigned)(rep[4])));
232 // port->CleanAll();
233  if(res==0) continue;
234  // if(res==5 && rep[0]=='D' && (rep[4] & 0x01)) Reached=true;
235  if(rep[0]=='D' && (rep[4] & 0x01)) Reached=true;
236  }
237  if(Debug) printf("ArmVacuumControl reached %d, timeout is %d. Done.\n",tme,timeout);
238  if(tme>=timeout) return -tme;
239  else return tme;
240 
241 }
int RecvString(char *string, int N)
Definition: AcqCOM.cxx:126
void Flush()
Definition: AcqCOM.cxx:101
int SendString(char *string, int N)
Definition: AcqCOM.cxx:119
AcqCOM * port
Definition: AcqSerialPlateChanger.h:63

◆ FindEmulsion()

int AcqSerialPlateChanger::FindEmulsion ( IdentifierS  id,
int  Bank 
)
897 {
898  // returns the sequence number of the given emulsion in the bank
899  // if not found, returns -1
900  for(int i=0;i<BankS[bnk].NEmulsions+BankS[bnk].NSeparators;i++) {
901  if(BankS[bnk].Plates[i]->IsSeparator==false)
902  if(BankS[bnk].Plates[i]->id.Part[0]==id.Part[0])
903  if(BankS[bnk].Plates[i]->id.Part[1]==id.Part[1])
904  if(BankS[bnk].Plates[i]->id.Part[2]==id.Part[2])
905  if(BankS[bnk].Plates[i]->id.Part[3]==id.Part[3])
906  return i;
907  }
908 
909  return -1;
910 }

◆ GetLoadedId()

int AcqSerialPlateChanger::GetLoadedId ( int *  id0 = NULL,
int *  id1 = NULL,
int *  id2 = NULL,
int *  id3 = NULL 
)
577 {
578  //returns 0 if no emulsion on the stage
579  if(!EmulsionOnTableS) return 0;
580  if(id0) (*id0)=EmulsionOnTableS->id.Part[0];
581  if(id1) (*id1)=EmulsionOnTableS->id.Part[1];
582  if(id2) (*id2)=EmulsionOnTableS->id.Part[2];
583  if(id3) (*id3)=EmulsionOnTableS->id.Part[3];
584  return 1;
585 }
TPlateS * EmulsionOnTableS
Definition: AcqSerialPlateChanger.cxx:24
int Part[4]
Definition: AcqSerialPlateChanger.h:34
IdentifierS id
Definition: AcqSerialPlateChanger.h:41

◆ GoOnHAxis()

int AcqSerialPlateChanger::GoOnHAxis ( int  position,
int  timeout 
)
279 {
280  // Moves arm horisontally to position <position>, if not reached within given timeout returns -timeout,
281  // otherwise returns actual time spent to reach position
282  // ************ WARNING!!!!!!! This low level function is not mechanically safe!!
283  // ************ It may damage the plate changer
284  // ************ if used without caution to set the arm into UPMOST POSITION!
285 
286  int tme=0;
287  int res;
288  char str[8];
289  char rep[128];
290 if(Debug) printf("GoOnHAxis(%d, %d) called.\n",position,timeout);
291  str[0]='X';
292  str[1]=position & 0x07;
293  bool Reached=false;
294  if(port->SendString(str,2)!=2) return -tme;
295  while( !Reached && tme<timeout)
296  {
297  str[0]='Q';
298  if(port->SendString(str,1)!=1) return -tme;
299  port->Flush();
300  gSystem->Sleep(50);tme++;
301  port->Flush();
302  res=port->RecvString(rep,5);
303 if(Debug) printf("res=0x%x rep[0]=0x%x rep[1]=0x%x rep[4]=0x%x \n",res,rep[0],rep[1],((unsigned)(rep[4])));
304  if(res==0) continue;
305  if(rep[0]=='D' && (rep[1] & 0x40) && (rep[1] & 0x10) && !(rep[1] & 0x80) && !(rep[1] & 0x20)) Reached=true;
306  }
307  if(Debug) printf("GoOnHAxis reached %d, timeout is %d. Done.\n",tme,timeout);
308  if(tme>=timeout) return -tme;
309  else return tme;
310 
311 
312 }
MFTYPE32 long position
Definition: Milproto.h:644

◆ GoOnVAxis()

int AcqSerialPlateChanger::GoOnVAxis ( int  position,
int  timeout 
)
314 {
315  // Moves arm vertically to position <position>, if not reached within given timeout returns -timeout,
316  // otherwise returns actual time spent to reach position
317  int tme=0;
318  int res;
319  char str[8];
320  char rep[128];
321 if(Debug) printf("GoOnVAxis(%d, %d) called.\n",position,timeout);
322  str[0]='Y';
323  str[1]=position & 0x07;
324  bool Reached=false;
325  if(port->SendString(str,2)!=2) return -tme;
326  while( !Reached && tme<timeout)
327  {
328  str[0]='Q';
329  if(port->SendString(str,1)!=1) return -tme;
330  port->Flush();
331  gSystem->Sleep(50);tme++;
332  port->Flush();
333  res=port->RecvString(rep,5);
334  if(res==0) continue;
335 if(Debug) printf("res=0x%x rep[0]=0x%x rep[2]=0x%x rep[4]=0x%x \n",res,rep[0],rep[2],((unsigned)(rep[4])));
336  if(rep[0]=='D' && (rep[2] & 0x40) && (rep[2] & 0x10) && !(rep[2] & 0x80) && !(rep[2] & 0x20)) Reached=true;
337  }
338  if(Debug) printf("GoOnVAxis reached %d, timeout is %d. Done.\n",tme,timeout);
339  if(tme>=timeout) return -tme;
340  else return tme;
341 
342 
343 }

◆ Initialize()

int AcqSerialPlateChanger::Initialize ( AcqStage1 *  Stage = NULL)
106 {
107  // initializes the arm drives, vacuum generators,
108  // moves the arm to position 1 up,
109  // reads the status file and sets flags InitDone, Ready
110  ST=Stage;
111  int tme=0;
112  int res;
113 // int32 read;
114 // int32 bytesPerSamp;
115 // uInt8 datain[8];
116 // uInt8 dataout[8] = {0,0,0,0,0,0,0,0};
117  printf("Initializing Plate changer..\n");
118  port=new AcqCOM();
119  port->Close();
120  if(!port->Open(ComPort,ComBaud)) {printf("Can't open COM port! PlateChanger Init failed.\n"); return 0;}
121  PowerON();
123  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
124  Park(1);
125  InitDone=true;
126  Ready=false;
127  printf("Reading status file.."); fflush(stdout);
128 
129  ReadStatusFile();
130 
132  printf("Done!"); fflush(stdout);
133  Dump();
134  PowerOFF();
135  return 1;
136 }
#define VPOS_UP
Definition: AcqPlateChanger.h:25
FILE * stdout
Definition: AcqCOM.h:14
int Open(int port, int baud)
Definition: AcqCOM.cxx:28
void Close()
Definition: AcqCOM.cxx:91
int PowerOFF(int timeout=100)
Definition: AcqSerialPlateChanger.cxx:173
int Park(int idst)
Definition: AcqSerialPlateChanger.cxx:911
int ReadStatusFile()
Definition: AcqSerialPlateChanger.cxx:382
int PowerON(int timeout=100)
Definition: AcqSerialPlateChanger.cxx:138
int TableVacuumControl(bool VacOn, int timeout, bool BlowOn=false)
Definition: AcqSerialPlateChanger.cxx:243
int GoOnVAxis(int position, int timeout)
Definition: AcqSerialPlateChanger.cxx:313

◆ LoadBrick()

void AcqSerialPlateChanger::LoadBrick ( int  Brick,
int  Nemulsions = 57,
int  SrcBank = 1,
int  DestBank = 2,
bool  Separators = true,
bool  FirstIsSeparator = true 
)
464 {
465  // Lets user load the emulsion pile into <isrc> bank, updates StatusFile.
466 if(Debug) printf(" LoadBrick(%d,%d,%d,%d,%d,%d) called.\n",Brick,Nemulsions, isrc,idest,Separators,FirstIsSeparator);
467  int res,inumem,ibrick;
468  ibrick=Brick;
469  inumem=Nemulsions;
470  if(isrc<1 || isrc>3 || idest<1 || idest>3 || isrc==idest || inumem<=0) {
471  printf("Wrong bank assignements!\n");
472  return;
473  }
474 if(!InitDone) Initialize();
475  PowerON();
476 Park(idest);
477 printf("Load source bank, top sheet must be ");
478 if( FirstIsSeparator) printf("the separator sheet ");
479 else printf("the first emulsion ");
480 printf(", then press any key :"); fflush(stdout);
481 getchar();
482 printf("\n");
483 
485 while(res>=0){
486  printf("Please remove emulsion from the stage, then press any key :");
487  getchar();
488  printf("\n");
490 }
491 //for(int bnk=0; bnk<NumberOfBanks+1;bnk++){
492 // BankS[bnk].NEmulsions=0;
493 // BankS[bnk].NSeparators=0;
494 // }
495 ResetBanks();
496 SourceBank=isrc;
497 DestinationBank=idest;
498 
499 BankS[isrc].NEmulsions=inumem;
500 if( Separators ) BankS[isrc].NSeparators=inumem;
501 if( FirstIsSeparator ) {
502  (BankS[isrc].NSeparators)++;
503  BankS[isrc].Plates[0]=new TPlateS; //add sep
504  BankS[isrc].Plates[0]->SeqNumber=0;
505  BankS[isrc].Plates[0]->InBank=isrc;
506  BankS[isrc].Plates[0]->IsSeparator=true;
507  BankS[isrc].Plates[0]->id.Part[0]=ibrick;
508  BankS[isrc].Plates[0]->id.Part[1]=0;
509  BankS[isrc].Plates[0]->id.Part[2]=0;
510  BankS[isrc].Plates[0]->id.Part[3]=0;
511 
512 }
513 int Fsep;
514 Fsep=FirstIsSeparator?1:0;
515 if( Separators ) for(int i=0;i<inumem;i++) {
516  BankS[isrc].Plates[i*2+Fsep]=new TPlateS; //add plate
517  BankS[isrc].Plates[i*2+Fsep]->SeqNumber=i*2+Fsep;
518  BankS[isrc].Plates[i*2+Fsep]->InBank=isrc;
519  BankS[isrc].Plates[i*2+Fsep]->IsSeparator=false;
520  BankS[isrc].Plates[i*2+Fsep]->id.Part[0]=ibrick;
521  BankS[isrc].Plates[i*2+Fsep]->id.Part[1]=i+1;
522  BankS[isrc].Plates[i*2+Fsep]->id.Part[2]=0;
523  BankS[isrc].Plates[i*2+Fsep]->id.Part[3]=0;
524 
525  BankS[isrc].Plates[i*2+1+Fsep]=new TPlateS; //add sep
526  BankS[isrc].Plates[i*2+1+Fsep]->SeqNumber=i*2+1+Fsep;
527  BankS[isrc].Plates[i*2+1+Fsep]->InBank=isrc;
528  BankS[isrc].Plates[i*2+1+Fsep]->IsSeparator=true;
529  BankS[isrc].Plates[i*2+1+Fsep]->id.Part[0]=ibrick;
530  BankS[isrc].Plates[i*2+1+Fsep]->id.Part[1]=i+1;
531  BankS[isrc].Plates[i*2+1+Fsep]->id.Part[2]=0;
532  BankS[isrc].Plates[i*2+1+Fsep]->id.Part[3]=0;
533 
534 }
535 else for(int i=0;i<inumem;i++) {
536  BankS[isrc].Plates[i]=new TPlateS; //add emulsion
537  BankS[isrc].Plates[i]->SeqNumber=i;
538  BankS[isrc].Plates[i]->InBank=isrc;
539  BankS[isrc].Plates[i]->IsSeparator=false;
540  BankS[isrc].Plates[i]->id.Part[0]=ibrick;
541  BankS[isrc].Plates[i]->id.Part[1]=i+1;
542  BankS[isrc].Plates[i]->id.Part[2]=0;
543  BankS[isrc].Plates[i]->id.Part[3]=0;
544 
545 }
546 
547 
548 Ready=true;
549 
551 PowerOFF();
552  if(Debug) printf(" LoadBrick() done.\n");
553 
554 }
int Initialize(AcqStage1 *Stage=NULL)
Definition: AcqSerialPlateChanger.cxx:105
void ResetBanks()
Definition: AcqSerialPlateChanger.cxx:557
Definition: AcqSerialPlateChanger.h:40
bool IsSeparator
Definition: AcqSerialPlateChanger.h:44
int InBank
Definition: AcqSerialPlateChanger.h:43
int SeqNumber
Definition: AcqSerialPlateChanger.h:42

◆ LoadPlate() [1/2]

int AcqSerialPlateChanger::LoadPlate ( IdentifierS  id)
784 {
785  // Loads the plate with given Id
786  // returns 0 if failed,
787  // 1 if succeeded,
788  // 2 if plate is already on the table
789  printf("LoadPlate is in progress...\n"); fflush(stdout);
790  int SeqN=-1,sn,BankN;
791  int Mfrom, Mto;
792  int res;
793  if(FindEmulsion(id,0)>=0) {printf("Load Plate is complete (plate was already on the stage).\n"); return 2; }//Already loaded
794  for(int bnk=1; bnk<NumberOfBanks+1;bnk++) {
795  sn=FindEmulsion(id,bnk);
796  if(sn>=0){ SeqN=sn; BankN=bnk; break;}
797  }
798  if(SeqN<0) {printf("Load Plate is failed. Emulsion is not found in banks!\n"); return 0; }//Emulsion is not found anywhere
799  printf("Required emulsion is found in bank #%d at position %d\n",BankN,SeqN+1);
800  // Emulsion is in bank BankN at the position SeqN, SeqN=0 means at the top
801  //Now put it onto the table
802  if(ST)
803  { //Move stage to exchange position
804  ST->Z->PosMove(ZLoadPosition,1e9,1e9);
805  ST->X->PosMove(XLoadPosition,1e9,1e9);
806  ST->Y->PosMove(YLoadPosition,1e9,1e9);
807  printf("Waiting for stage to reach exchange position..\n"); fflush(stdout);
808  res=ST->X->WaitForMoveComplete(5e3);
809  res*=ST->Y->WaitForMoveComplete(5e3);
810  res*=ST->Z->WaitForMoveComplete(3e3);
811  if(res==0) {printf("Stage didn't reach exchange position! Unload Plate is failed. \n"); return 0; }
812  }
813  else { printf("No connection with the stage (stage pointer is not set)!!! Unload Plate is failed. \n"); return 0; }
814  printf("OK.\n"); //reached position;
815 
816  if(BankN==SourceBank) { Mfrom=BankN; Mto=DestinationBank;}
817  else { Mto=SourceBank; Mfrom=BankN;}
818  PowerON();
819  if(EmulsionOnTableS!=NULL) {
820  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
821  printf("OK..\nMoving emulsion from the stage..\n"); fflush(stdout);
822  if(MoveEmulsion(0,Mto)!=1) { Park(Mto); return 0;};
825  printf("Done.\n"); fflush(stdout);
826  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
827 
828  }
829  if(SeqN>0) printf("Moving emulsions from bank #%d to #%d\n", Mfrom,Mto); fflush(stdout);
830  for(int num=0;num<SeqN;num++){ //move from one bank to another all unnecessary plates
831  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
832  AddToBank(Mto,TakeFromBank(Mfrom));
833  if(MoveEmulsion(Mfrom,Mto)!=1) { Park(Mto); return 0;};
834  }
835  printf("Done.\n"); fflush(stdout);
836  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
837 
838  //Now top in Mfrom bank must be emulsion that we search for
839  if(FindEmulsion(id,Mfrom)!=0) {
840  printf("Brick structure incosistent!!! Reload the brick!\n");
841  return 0; //Inconsistency!!!!!
842  }
843  printf("OK..moving emulsion to the stage.."); fflush(stdout);
844  EmulsionOnTableS=TakeFromBank(Mfrom); //if movement is OK update database
846  if(MoveEmulsion(Mfrom,0)!=1) { Park(Mto); return 0;};
847  printf("Done.\n"); fflush(stdout);
848  Park(Mfrom);
849 
850  printf("Load Plate is complete.\n");
852  PowerOFF();
853  return 1;
854 }
void PosMove(float Pos, float Speed, float Acc)
Definition: AcqStage1.cxx:524
int WaitForMoveComplete(u32 Timeout)
Definition: AcqStage1.cxx:514
void AddToBank(int bnk, TPlateS *plate)
Definition: AcqSerialPlateChanger.cxx:733
int MoveEmulsion(int isrc, int idst)
Definition: AcqSerialPlateChanger.cxx:591
int FindEmulsion(IdentifierS id, int Bank)
Definition: AcqSerialPlateChanger.cxx:896
TPlateS * TakeFromBank(int bnk)
Definition: AcqSerialPlateChanger.cxx:750
AcqAxis * Y
Definition: AcqStage1.h:146
AcqAxis * Z
Definition: AcqStage1.h:147
AcqAxis * X
Definition: AcqStage1.h:145

◆ LoadPlate() [2/2]

int AcqSerialPlateChanger::LoadPlate ( int  id0,
int  id1,
int  id2 = 0,
int  id3 = 0 
)
770 {
771  // Loads the plate with given indices (id0 is brick number, id1 is plate number)
772  // returns 0 if failed,
773  // 1 if succeeded,
774  // 2 if plate is already on the table
776 id.Part[0]=id0;
777 id.Part[1]=id1;
778 id.Part[2]=id2;
779 id.Part[3]=id3;
780 return LoadPlate(id);
781 }
int LoadPlate(IdentifierS id)
Definition: AcqSerialPlateChanger.cxx:783
UInt_t id
Definition: tlg2pattern.C:118
Definition: AcqSerialPlateChanger.h:33

◆ MoveEmulsion()

int AcqSerialPlateChanger::MoveEmulsion ( int  isrc,
int  idst 
)
592 {
593  // Moves one sheet from bank to bank, whatever it is : emulsion or separator
594  if(Debug) printf(" --- MoveEmulsion(%d,%d)\n",isrc,idest);
595  int res,attempt=0;
596  int cornpos;
597  if((isrc<0) || (isrc>3)) {printf("Wring Source Position assignement!\n");return 0;}
598  if((idest<0) || (idest>3)) {printf("Wring Scanned Position assignement!\n");return 0;}
599  if(isrc==idest) {printf("Same Source and Scanned Position assignement!\n");return 0;}
600 // if(!PowerON()) return -1;
601  printf("\n%d > %d",isrc,idest); fflush(stdout);
602  if(isrc==0) {
603  if(!LiftCorners) {
604  res=GoOnHAxis(isrc,PositionTimeout);
605  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
607  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
609  TableVacuumControl(false,1,true);
610  if(res<0) {printf("ArmVacuum is not reached in 2 seconds!\n");}
611  if(res<0) { GoOnVAxis(VPOS_UP,PositionTimeout); return 0;} //error
612  }
613  TableVacuumControl(false,1,true);
614  attempt=0;
615  while(attempt<NumberOfAttempt){
616  attempt++;
617  if((!LiftCorners) || (attempt>1)) {
618  TableVacuumControl(false,1,true);
619  gSystem->Sleep(100);
621  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
622 // res=GoOnVAxis(VPOS_UP,PositionTimeout);
624  if(res>=0) break; //The emulsion is taken succesfully
625  }
626 //if not: try to lift up corners
627  res=ArmVacuumControl(false,1); // leave emulsion
628  TableVacuumControl(false,1);
629 // if((attempt/2.)==int(attempt/2.)) cornpos=4; else cornpos=5; //try to lift the corner = pos #4 or #5
630  cornpos=4; //try to lift the corner = pos #4 or #5
631  res=GoOnHAxis(cornpos,PositionTimeout); //try to lift the corner = pos #4 or #5
632  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
634  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
635  res=ArmVacuumControl(true,VacuumTimeout); //vacuum ON
636  res=GoOnVAxis(VPOS_ABOVE_STAGE,2*PositionTimeout); //lift the corner
637  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
638 
640  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
641  res=ArmVacuumControl(false,1); //Vacuum OFF
642  res=GoOnVAxis(VPOS_UP,PositionTimeout); // Go UP
643  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
644  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
645 
646  cornpos=5; //try to lift the corner = pos #4 or #5
647  res=GoOnHAxis(cornpos,PositionTimeout); //try to lift the corner = pos #4 or #5
648  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
650  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
651  res=ArmVacuumControl(true,VacuumTimeout); //vacuum ON
652  res=GoOnVAxis(VPOS_ABOVE_STAGE,2*PositionTimeout); //lift the corner
653  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
654 
656  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
657  res=ArmVacuumControl(false,1); //Vacuum OFF
658  res=GoOnVAxis(VPOS_UP,PositionTimeout); // Go UP
659  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
660  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return 0; else printf(" Continue.\n");}
661  // res=ArmVacuumControl(true,VacuumTimeout); //Vacuum ON
662 
663 
664  res=GoOnHAxis(isrc,PositionTimeout); //go back to 0 position
665  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
666 // res=ArmVacuumControl(true,VacuumTimeout); //Vacuum ON
667  res=GoOnVAxis(VPOS_DOWN_TO_STAGE,PositionTimeout); //and DOWN again, ready for the next attempt
668  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
669  res=ArmVacuumControl(true,VacuumTimeout); //Vacuum ON
670  }
671  TableVacuumControl(false,1);
672 
673  if(attempt==NumberOfAttempt) {
674  ArmVacuumControl(false,1);
676  printf("Robot can't take plate from the stage!\n");
677  return 0;}
678  }
679  else { //taking from the bank - perform attempts to separate top emulsion from the rest
680  res=GoOnHAxis(isrc,PositionTimeout);
681  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
683  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
684  if(isrc==0) TableVacuumControl(false,1);
686  if(res<0 && isrc==0) {printf("ArmVacuum is not reached in 2 seconds!\n");}
687  if(res<0) { GoOnVAxis(VPOS_UP,PositionTimeout); return 0;} //no more emulsion in the bank
688  if(Debug) printf("Arm vac seems ok... trying to separate emulsions..\n");
689  for(int att=0;att<SeparationAttempts;att++){
690  if(Debug) printf("Attempt %d..going up..\n",att+1);
691  res=GoOnVAxis(VPOS_UP,PositionTimeout); // Go UP
692  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
693  if(Debug) printf("..going down..\n",att+1);
695  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
696  }
697  if(Debug) printf("Separation loop is complete..\n");
698 
699  }
700  printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%d > %d",isrc,idest); fflush(stdout);
701 
703  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
704  if(Debug) printf("Ready to go to bank idest=%d\n",idest);
705  res=GoOnHAxis(idest,PositionTimeout);
706  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
708  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
709  printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%d > %d",isrc,idest); fflush(stdout);
710  res=ArmVacuumControl(false,1);
711  if(idest==0) {
713  if(res<0)
714  {
715  printf("TableVacuum is not reached in 5 seconds!\n");
717  if(res<0) printf("Vpos is not reached in 5 seconds!\n");
718  return 0;
719 
720  }
721 
722  }
724  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
725  printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); fflush(stdout);
726  if(Debug) printf(" --- MoveEmulsion is done, returns 1.\n");
727 
728  return 1;
729 
730 }
#define VPOS_ABOVE_STAGE
Definition: AcqPlateChanger.h:28
#define VPOS_DOWN_TO_STAGE
Definition: AcqPlateChanger.h:27
#define VPOS_DOWN
Definition: AcqPlateChanger.h:26
int ArmVacuumControl(bool VacOn, int timeout)
Definition: AcqSerialPlateChanger.cxx:209
int GoOnHAxis(int position, int timeout)
Definition: AcqSerialPlateChanger.cxx:278

◆ OnReset()

void AcqSerialPlateChanger::OnReset ( )
86 {
87  // resets the power on platechanger arm, turns off the vacuums
88 /* uInt8 dataout[8] = {0,0,0,0,0,0,0,0};
89  int32 read;
90  //Writing to P5
91  DAQmxWriteDigitalLines (writehandle, 1, 1, 10.0, DAQmx_Val_GroupByChannel , dataout, &read, NULL);
92  DAQmxWaitUntilTaskDone (writehandle, 10.0);
93  DAQmxStopTask (writehandle);
94  //Writing to P4
95  DAQmxWriteDigitalLines (writehandlez, 1, 1, 10.0, DAQmx_Val_GroupByChannel , dataout, &read, NULL);
96  DAQmxWaitUntilTaskDone (writehandlez, 10.0);
97  DAQmxStopTask (writehandlez);
98 */ if(Debug) printf("OnReset called\n");
99  InitDone=false;
100  Ready=false;
101  PowerOFF(100);
102  if(Debug) printf("OnReset done.\n");
103 }

◆ Park()

int AcqSerialPlateChanger::Park ( int  idst)
912 {
913  // Moves the arm up and to the idest position
914  PowerON();
915  int res;
916  if((idest<0) || (idest>3)) {printf("Wrong Scanned Position assignement!\n");return 0;}
918  if(res<0) {printf("Vpos is not reached in 5 seconds!\n");return 0;}
919  res=GoOnHAxis(idest,PositionTimeout);
920  if(res<0) {printf("Hpos is not reached in 5 seconds!\n");return 0;}
921  PowerOFF();
922  return 1;
923 }

◆ PowerOFF()

int AcqSerialPlateChanger::PowerOFF ( int  timeout = 100)
174 {
175  // Turns arm drives power OFF.
176  if(Debug) printf("PowerOFF called.\n");
177 
178  int tme=0;
179  int res;
180  char str[8];
181  char rep[128];
182  str[0]='V';
183  VacRegister = VacRegister & 0xEF;
184  str[1]=VacRegister;
185  bool Reached=false;
186  if(port->SendString(str,2)!=2) return -tme;
187  while( !Reached && tme<timeout)
188  {
189  str[0]='Q';
190  if(port->SendString(str,1)!=1) return -tme;
191  port->Flush();
192  gSystem->Sleep(50);tme++;
193  port->Flush();
194  res=port->RecvString(rep,5);
195 if(Debug) printf("res=0x%x rep[0]=0x%x rep[1]=0x%x \n",res,rep[0],rep[1]);
196  if(res==0) continue;
197  if(rep[0]=='D' && !(rep[1] & 0x08)) Reached=true;
198  }
199  if(Debug) printf("PowerOFF reached %d, timeout is %d. Done.\n",tme,timeout);
200 
201  if(tme>=timeout) return -tme;
202  else return tme;
203  // check if stage coordinate changed during arm movements and rise StageError
204 // if(fabs(StX - ST->X->GetPos()) >10.) StageError=true;
205 // if(fabs(StY - ST->Y->GetPos()) >10.) StageError=true;
206 // if(fabs(StZ - ST->Z->GetPos()) >5.) StageError=true;
207 
208 }

◆ PowerON()

int AcqSerialPlateChanger::PowerON ( int  timeout = 100)
139 {
140  // Turns arm drives power ON.
141 // StX=ST->X->GetPos();
142 // StY=ST->Y->GetPos();
143 // StZ=ST->Z->GetPos(); //save current stage positions
144  if(Debug) printf("PowerON called\n");
145  StageError=false;
146  int tme=0;
147  int res;
148  char str[8];
149  char rep[128];
150  str[0]='V';
151  VacRegister= VacRegister | 0x10;
152  str[1]=VacRegister;
153  bool Reached=false;
154  if(port->SendString(str,2)!=2) return -tme;
155  while( !Reached && tme<timeout)
156  {
157  str[0]='Q';
158  if(port->SendString(str,1)!=1) return -tme;
159  port->Flush();
160  gSystem->Sleep(50);tme++;
161  port->Flush();
162  res=port->RecvString(rep,5);
163 if(Debug) printf("res=0x%x rep[0]=0x%x rep[1]=0x%x \n",res,rep[0],rep[1]);
164  if(res==0) continue;
165  if( rep[0]=='D' && (rep[1] & 0x08)) Reached=true;
166  }
167  if(Debug) printf("PowerON reached %d, timeout is %d. Done.\n",tme,timeout);
168  if(tme>=timeout) return -tme;
169  else return tme;
170 
171 }

◆ Print()

void AcqSerialPlateChanger::Print ( )
virtual
56 {
57  // prints the content of emulsion banks
58  for(int bnk=0;bnk<NumberOfBanks+1;bnk++)
59  {
60  if(bnk==0) printf("\nTable:",BankS[bnk].Number);
61  else printf("\nBank #%d content:",BankS[bnk].Number);
62  if(BankS[bnk].NEmulsions==0 && BankS[bnk].NSeparators==0) printf(" Empty.\n\n");
63  else printf("\n\n");
64 
65  for(int i=0;i<BankS[bnk].NEmulsions+BankS[bnk].NSeparators;i++)
66  {
67  if(BankS[bnk].Plates[i]->IsSeparator) printf("---Separator---\n");
68  else printf("Emulsion %d %d %d %d\n",BankS[bnk].Plates[i]->id.Part[0],
69  BankS[bnk].Plates[i]->id.Part[1],
70  BankS[bnk].Plates[i]->id.Part[2],
71  BankS[bnk].Plates[i]->id.Part[3]);
72  }
73  }
74 
75 
76 }

◆ ReadStatusFile()

int AcqSerialPlateChanger::ReadStatusFile ( )

UpdateBanksView();

383 {
384  //restores the banks content from the status file
385 if(Debug) printf(" ReadStatusFile() called.\n");
386  char line[128];
387  char key[32];
388  int I,bnk,seps,plts,a,b,c,d,ip;
389  FILE *fp=fopen("c:\\ChangerStatus.txt","r");
390  if(fp==NULL) return 0;
391  if(fgets(line,128,fp)==NULL) return 0; //date/time line is gisregarded
392  ResetBanks();
393 
394  while(fgets(line,128,fp)!=NULL){
395  sscanf(line,"%s %d",key,&I);
396  if(strcmp(key,"Bank")==0) bnk=I;
397  if(strcmp(key,"SEPARATORS")==0) seps=I;
398  if(strcmp(key,"PLATES")==0) plts=I;
399  if(strcmp(key,"PLATE")==0){
400  sscanf(line,"%s %d %d %d %d",key,&a,&b,&c,&d);
401  ip=BankS[bnk].NEmulsions+BankS[bnk].NSeparators;
402  BankS[bnk].Plates[ip]=new TPlateS; //add plate
403  BankS[bnk].Plates[ip]->SeqNumber=ip;
404  BankS[bnk].Plates[ip]->InBank=bnk;
405  BankS[bnk].Plates[ip]->IsSeparator=false;
406  BankS[bnk].Plates[ip]->id.Part[0]=a;
407  BankS[bnk].Plates[ip]->id.Part[1]=b;
408  BankS[bnk].Plates[ip]->id.Part[2]=c;
409  BankS[bnk].Plates[ip]->id.Part[3]=d;
410  BankS[bnk].NEmulsions++;
411  }
412  if(strcmp(key,"SEPARATOR")==0){
413  ip=BankS[bnk].NEmulsions+BankS[bnk].NSeparators;
414  BankS[bnk].Plates[ip]=new TPlateS; //add separator
415  BankS[bnk].Plates[ip]->SeqNumber=ip;
416  BankS[bnk].Plates[ip]->InBank=bnk;
417  BankS[bnk].Plates[ip]->IsSeparator=true;
418  BankS[bnk].Plates[ip]->id.Part[0]=0;
419  BankS[bnk].Plates[ip]->id.Part[1]=0;
420  BankS[bnk].Plates[ip]->id.Part[2]=0;
421  BankS[bnk].Plates[ip]->id.Part[3]=0;
422  BankS[bnk].NSeparators++;
423  }
424  if(strcmp(key,"EndBank")==0){
425  if((bnk!=I) || (BankS[bnk].NSeparators!=seps) || (BankS[bnk].NEmulsions!=plts))
426  {
427  printf("Plate Changer Error: ChangerStatus.txt file is corrupted!!! Resetting banks.\n");
428  ResetBanks();
429  if(Debug) printf(" ReadStatusFile() done. returns 0.\n");
430 
432  return 0;
433  }
434  }
435 
436  }
437  fclose(fp);
439  Ready=true;
441  if(Debug) printf(" ReadStatusFile() done. returns 1.\n");
442  return 1;
443 }
void d()
Definition: RecDispEX.C:381
void a()
Definition: check_aligned.C:59
fclose(pFile)

◆ ResetBanks()

void AcqSerialPlateChanger::ResetBanks ( )
558 {
559  //resets the banks content
560  if(Debug) printf(" ResetBanks() called.\n");
563  for(int i=0;i<NumberOfBanks+1;i++) {
564  BankS[i].Number=i; //0- microscope, 1-3 banks
565  BankS[i].NEmulsions=0; //not known how many plates it contains
566  BankS[i].NSeparators=0;
567  for(int j=0;j<MAX_NUMBER_OF_PLATES*2;j++) {if(BankS[i].Plates[j]) delete BankS[i].Plates[j]; BankS[i].Plates[j]=NULL; }
568  }
569  Ready=false;
570 //UpdateStatusFile();
571  if(Debug) printf(" ResetBanks() done.\n");
572 
573 }
#define MAX_NUMBER_OF_PLATES
Definition: AcqPlateChanger.h:24
int Number
Definition: AcqSerialPlateChanger.h:50

◆ TableVacuumControl()

int AcqSerialPlateChanger::TableVacuumControl ( bool  VacOn,
int  timeout,
bool  BlowOn = false 
)
244 {
245  // Switches the vacuum on/off at the table, if vacuum is not reached within given timeout returns -timeout,
246  // otherwise returns actual time spent to reach vacuum
247  if(Debug) printf("TableVacuumControl(%d,%d,%d) called.\n",VacOn,timeout,BlowOn);
248  if(VacOn) BlowOn=false;
249  int tme=0;
250  int res;
251  char str[8];
252  char rep[128];
253  str[0]='V';
254  if(VacOn) VacRegister= VacRegister | 0x02; else VacRegister = VacRegister & 0xFD;
255  if(BlowOn) VacRegister= VacRegister | 0x04; else VacRegister = VacRegister & 0xFB;
256  str[1]=VacRegister;
257  bool Reached=false;
258  if(port->SendString(str,2)!=2) return -tme;
259  while( !Reached && tme<timeout)
260  {
261  str[0]='Q';
262  if(port->SendString(str,1)!=1) return -tme;
263  port->Flush();
264  gSystem->Sleep(50);tme++;
265  port->Flush();
266  res=port->RecvString(rep,5);
267 if(Debug) printf("res=0x%x rep[0]=0x%x rep[4]=0x%x \n",res,rep[0],((unsigned)(rep[4])));
268  if(res==0) continue;
269  if(rep[0]=='D' && (rep[4] & 0x02)) Reached=true;
270  }
271  if(Debug) printf("TableVacuumControl reached %d, timeout is %d. Done.\n",tme,timeout);
272  if(tme>=timeout) return -tme;
273  else return tme;
274 
275 
276 }

◆ TakeFromBank()

TPlateS * AcqSerialPlateChanger::TakeFromBank ( int  bnk)
751 {
752  // takes info on plate from the container (nothing is done physically)
753  // to keep track of real world situation
754  TPlateS* retvalue;
755  if(BankS[bnk].NEmulsions+BankS[bnk].NSeparators<=0) return NULL;
756  retvalue=BankS[bnk].Plates[0];
757  for(int i=0;i<BankS[bnk].NEmulsions+BankS[bnk].NSeparators-1;i++) {
758  BankS[bnk].Plates[i]=BankS[bnk].Plates[i+1];
759 
760  }
761  if(retvalue->IsSeparator) BankS[bnk].NSeparators--;
762  else BankS[bnk].NEmulsions--;
763  //if(bnk==0) EmulsionOnTableS=NULL;
765  retvalue->InBank=-1; //unknown
766  return retvalue;
767 }

◆ UnloadBrick()

void AcqSerialPlateChanger::UnloadBrick ( )
446 {
447  // Moves all emulsions and separators back to
448  // the source bank to allow user to withdraw the brick.
449  // Doesnt' reset banks!!!! Make sure to execute LoadBrick if you change the brick!
450 if(Debug) printf(" UnloadBrick() called.\n");
451 UnloadPlate(false);
452  printf("Moving emulsions from bank %d back to %d..",DestinationBank,SourceBank); fflush(stdout);
453  while( (BankS[DestinationBank].NEmulsions + BankS[DestinationBank].NSeparators) > 0 )
454  {
455  if(kbhit()){getch();printf("Paused. Continue? (y/n)"); if(getchar()=='n') return; else printf(" Continue.\n");}
456  if(MoveEmulsion(DestinationBank,SourceBank)!=1) { printf("MoveEmulsion returned FAILED!\n"); Park(DestinationBank); return;};
458  }
460  printf("Done. \nPlease take the brick from the bank %d\n", SourceBank);
461 }
int UnloadPlate(bool TurnPowerOff=true)
Definition: AcqSerialPlateChanger.cxx:856

◆ UnloadPlate()

int AcqSerialPlateChanger::UnloadPlate ( bool  TurnPowerOff = true)
857 {
858  // Unloads the plate from the stage to the source bank
859  // returns 1 if OK,
860  // 0 in case of error.
861  PowerON();
862 printf("Unload plate is in progress...\n");
863  int isrc,idest;
865  if(!EmulsionOnTableS) return 1;
866  isrc=SourceBank;
867  idest=DestinationBank;
868  if(isrc<1 || isrc>3 || idest<1 || idest>3 || isrc==idest) {
869  printf("Wrong bank assignements!\n");
870  printf("Unload Plate is failed.\n");
871  return 0;
872  }
873 //All is ok, now move plate to src bank
874  int res;
875  if(ST){ //Move stage to exchange position
876  ST->Z->PosMove(ZLoadPosition,1e9,1e9);
877  ST->X->PosMove(XLoadPosition,1e9,1e9);
878  ST->Y->PosMove(YLoadPosition,1e9,1e9);
879  res=ST->X->WaitForMoveComplete(5e3);
880  res*=ST->Y->WaitForMoveComplete(5e3);
881  res*=ST->Z->WaitForMoveComplete(3e3);
882  if(res==0) {printf("Stage didn't reach exchange position! Unload Plate is failed. \n"); return 0; }
883  }
886 
887  if(MoveEmulsion(0,isrc)!=1) { printf("Unload Plate is failed. "); Park(idest); return 0;};
888 
889 printf("Unload Plate is complete.\n");
891 if(TurnPowerOff)PowerOFF();
892 return 1;
893 
894 }

◆ UpdateStatusFile()

void AcqSerialPlateChanger::UpdateStatusFile ( )
347 {
348  // Syncronizes the status file with the current banks content
349 if(Debug) printf(" UpdateStatusFile() called.\n");
350  char dateStr [9];
351  char timeStr [9];
352  _strdate( dateStr);
353  _strtime( timeStr );
354  FILE *fp=fopen("c:\\ChangerStatus.txt","w");
355  FILE *fpl=fopen("c:\\ChangerLog.txt","a");
356  fprintf(fp,"Plate Changer Status on %s at %s.\n",dateStr,timeStr);
357  fprintf(fpl,"Plate Changer Status on %s at %s.\n",dateStr,timeStr);
358  for(int bnk=0;bnk<NumberOfBanks+1;bnk++){
359  fprintf(fp,"Bank %d\n",bnk);
360  fprintf(fpl,"Bank %d\n",bnk);
361  fprintf(fp,"SEPARATORS %d\n",BankS[bnk].NSeparators);
362  fprintf(fpl,"SEPARATORS %d\n",BankS[bnk].NSeparators);
363  fprintf(fp,"PLATES %d\n",BankS[bnk].NEmulsions);
364  fprintf(fpl,"PLATES %d\n",BankS[bnk].NEmulsions);
365  for(int i=0;i<BankS[bnk].NEmulsions+BankS[bnk].NSeparators;i++)
366  if(BankS[bnk].Plates[i]->IsSeparator){ fprintf(fp,"SEPARATOR\n");fprintf(fpl,"SEPARATOR\n");}
367  else {
368  fprintf(fp,"PLATE %d %d %d %d\n",BankS[bnk].Plates[i]->id.Part[0],BankS[bnk].Plates[i]->id.Part[1],BankS[bnk].Plates[i]->id.Part[2],BankS[bnk].Plates[i]->id.Part[3]);
369  fprintf(fpl,"PLATE %d %d %d %d\n",BankS[bnk].Plates[i]->id.Part[0],BankS[bnk].Plates[i]->id.Part[1],BankS[bnk].Plates[i]->id.Part[2],BankS[bnk].Plates[i]->id.Part[3]);
370  }
371  fprintf(fp,"EndBank %d\n",bnk);
372  fprintf(fpl,"EndBank %d\n",bnk);
373 
374  }
375 
376  fclose(fp);
377  fclose(fpl);
378  if(Debug) printf(" UpdateStatusFile() done.\n");
379 
380 }

Member Data Documentation

◆ ComBaud

int AcqSerialPlateChanger::ComBaud

◆ ComPort

int AcqSerialPlateChanger::ComPort

◆ Debug

bool AcqSerialPlateChanger::Debug

◆ DestinationBank

int AcqSerialPlateChanger::DestinationBank

◆ InitDone

bool AcqSerialPlateChanger::InitDone

◆ LiftCorners

bool AcqSerialPlateChanger::LiftCorners

◆ NumberOfAttempt

int AcqSerialPlateChanger::NumberOfAttempt

◆ NumberOfBanks

int AcqSerialPlateChanger::NumberOfBanks

◆ port

AcqCOM* AcqSerialPlateChanger::port
private

◆ PositionTimeout

int AcqSerialPlateChanger::PositionTimeout

◆ Ready

bool AcqSerialPlateChanger::Ready

◆ SeparationAttempts

int AcqSerialPlateChanger::SeparationAttempts

◆ SourceBank

int AcqSerialPlateChanger::SourceBank

◆ ST

AcqStage1* AcqSerialPlateChanger::ST

◆ StageError

bool AcqSerialPlateChanger::StageError

◆ StX

float AcqSerialPlateChanger::StX
private

◆ StY

float AcqSerialPlateChanger::StY
private

◆ StZ

float AcqSerialPlateChanger::StZ
private

◆ VacRegister

char AcqSerialPlateChanger::VacRegister
private

◆ VacuumTimeout

int AcqSerialPlateChanger::VacuumTimeout

◆ XLoadPosition

float AcqSerialPlateChanger::XLoadPosition

◆ YLoadPosition

float AcqSerialPlateChanger::YLoadPosition

◆ ZLoadPosition

float AcqSerialPlateChanger::ZLoadPosition

The documentation for this class was generated from the following files: