// Inizio inizializzare variabile

OldTool = Convert.ToDouble (AS3.Getfield (3000)); 			//Utensile in mandrino
X_palp = Convert.ToDouble (AS3.Getfield (3001));			//posizione X del palpatore 
Y_palp = Convert.ToDouble (AS3.Getfield (3002));			//posizione Y del palpatore
X_UT1 = Convert.ToDouble (AS3.Getfield (3003));
Y_UT1 = Convert.ToDouble (AS3.Getfield (3004));
ToolY = Y_UT1-50;   							// Y fuori rastelliera
ToolDown = Convert.ToDouble (AS3.Getfield (3005)); 			// DISTANZA DISCESA SU PORTAUTENSILE
UTpres = Convert.ToDouble (AS3.Getfield (3006));			// posizione maassima presetting

if (UTpres > 10)
{
	UTpres = 10;
}

// Fine inizializzare variabile

if(!exec.GetLED(56)||!exec.GetLED(57)||!exec.GetLED(58)) 		// controllo se la macchina e referenziata.
{
  MessageBox.Show("La macchina dovrebbe essere referenziata!", "ATTENZIONE");
  exec.Stop();
  return;
}

for (NewTool=1; NewTool<= UTpres; NewTool++)
{
	exec.Code ("G00 G53 Z" + ToolUp); 				//Z sopra
	while(exec.IsMoving()){}
	exec.AddStatusmessage("Utensile nel mandrino: " + OldTool);

	MovePos(Convert.ToInt32 (OldTool));											//posizione data dal DRO es.1200

	while(exec.IsMoving()){}
	exec.Code ("G00 G53 Z" + ToolDown);				//abbassa la Z
	exec.Code ("G4 P1");
	while (exec.IsMoving ()) {}

	exec.Setoutpin (1, 17);						//Sets pin17 High
	exec.Code ("G4 P1.0"); 						//Wait for tool release
	
	exec.Code ("G01 F500 G53 Z" + ToolMove);			//alza la z
	exec.Code ("G00 G53 Y" + ToolY); 				//Y fuori
	while (exec.IsMoving ()) {}

	exec.AddStatusmessage ("Utensile nuovo: " + NewTool);
 
	OldTool=NewTool;

	MovePos(NewTool);						//muove verso il nuovo strumento

	while (exec.IsMoving ()) {}
	exec.Code ("G01 F400 G53 Z" + ToolDown);			//abbassa la Z
	exec.Code ("G4 P2");
	while (exec.IsMoving ()) {}

	exec.Clroutpin (1, 17); 					//Sets pin17 Low

	exec.Code ("G4 P2"); 						//prende lo strumento
	while (exec.IsMoving ()) {}

	exec.Code ("G01 F700 G53 Z" + ToolUp);				//alza la Z

	exec.Setcurrenttool (NewTool);
	AS3.Setfield (NewTool, 3000);
	AS3.Validatefield (3000);

//+++++++++++++++++++++++ROUTINE DI MISURA ++++++++++++++++++


	exec.Code ("G0 G53 Y" + ToolY); 				//Y fuori
	while (exec.IsMoving ()) {}

	//mi allineo sul palpatore

	exec.Code ("G1 G53 X" + X_palp + "F" + fmax); 
	while (exec.IsMoving ()) {}
	exec.Code ("G1 G53 Y" + Y_palp + "F" + fmax); 
	while (exec.IsMoving ()) {}

	exec.AddStatusmessage ("Misura utensile: " + NewTool);

	//scendo sul palpatore per vedere la misura della punta attuale
	exec.Code ("F" + fminZ);
	exec.Code ("G31 Z" + zmin);
	while (exec.IsMoving ()) {}

	Zuno = exec.Getvar (5063);					//memorizzo il valore di Z della punta attuale

if (NewTool == 1)
{
	Zzero = Zuno;
	counter = (196 + NewTool) - 1;
	AS3.Setfield (0.0000, counter);
	AS3.Validatefield (counter);
}
else
{
	if (Zuno < Zzero)
	{
		Zdelta = Zzero - Zuno;
		counter = (196 + NewTool) - 1;
		AS3.Setfield (Zdelta, counter);
		AS3.Validatefield (counter);
	}
	else
	{
		Zdelta = Zuno - Zzero;
		counter = (196 + NewTool) - 1;
		AS3.Setfield (Zdelta, counter);
		AS3.Validatefield (counter);
	}
}

exec.Code ("G01 F700 G53 Z" + ToolUp);					//alza la z
while (exec.IsMoving ()) {}
exec.Code ("G00 G53 Y" + ToolY); 					//Y fuori
while (exec.IsMoving ()) {}
Zuno = exec.GetZpos ();							//memorizzo il valore di Z della punta attuale

}

	//Muovo verso origine pezzo
	exec.Code ("G00 G53 Z" + ToolUp);				//Z sopra
	while (exec.IsMoving ()) {}
	exec.AddStatusmessage ("Procedura terminata");


#Events

// Start global variables 

int NewTool = 0;
int ToolUp = -1; 		// Z Hieght to Rapid from tool to tool
int ToolMove= -45; 		// movimento mentre cambia
int fminZ = 200;
int fmin = 1000;
int fmax = 3000;
int zmin = -200;
int counter = 0;

double OldTool;			//Utensile in mandrino
double X_palp;			//posizione X del palpatore (Settings -> Tool Change Location)
double Y_palp;			//posizione Y del palpatore
double X_UT1;
double Y_UT1;
double ToolY;   		// Y fuori rastelliera
double ToolDown; 		// DISTANZA DISCESA SU PORTAUTENSILE
double UTpres;			// posizione maassima presetting
double XPos, YPos;

double Zzero = 0;
double Zuno = 0;
double Zdelta = 0;
double ZoffsetParam = 2;

// End global variables



void MovePos(int NumeroUtensile)
{
	switch (NumeroUtensile)
	{
			case 1 :
				XPos = X_UT1;
				YPos = Y_UT1;
				break;
			case 2 :
				XPos = X_UT1+45;
				YPos = Y_UT1;
				break;
			case 3 :
				XPos = X_UT1+90;
				YPos = Y_UT1;
				break;
			case 4 :
				XPos = X_UT1+135;
				YPos = Y_UT1;
				break;
			case 5 :
				XPos = X_UT1+180;
				YPos = Y_UT1;
				break;
			case 6 :
				XPos = X_UT1+225;
				YPos = Y_UT1;
				break;
			case 7 :
				XPos = X_UT1+270;
				YPos = Y_UT1;
				break;
			case 8 :
				XPos = X_UT1+315;
				YPos = Y_UT1;
				break;
			case 9 :
				XPos = X_UT1+360;
				YPos = Y_UT1;
				break;
			case 10 :
				XPos = X_UT1+405;
				YPos = Y_UT1;
				break;
			default :
				break;
	}
exec.Code ("G01 F2000 G53 X" + XPos);
exec.Code ("G01 F2000 G53 Y" + YPos); 
exec.AddStatusmessage ("Posizione utensile n: " + NumeroUtensile + " X= " + XPos + " Y= " + YPos);
}

              
