Global	VarUnitsGlobal	VarMaxDistanceGlobal	VarFeedRateGlobal	VarStandOffGlobal	VarTouchPlateGlobal	VarSecondPlateGlobal	VarThirdPlateGlobal	VarDelayInSecGlobal 	VarInitialFeedRateGlobal	VarInitialLinearModeGlobal	VarInitialDistMode   Global	VarInitialInhibitGlobal	VarInitialZScaleGlobal	VarInitialFROSub Main	Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale Begin Dialog SelectCentering 420,120,160,110,"MACRO UTENSILE"	OKButton 30,80,40,15	CancelButton 90,80,40,15	GroupBox 10,5,140,65,"ZERO / CAMBIO UTENSILE",.GroupBox1	OptionGroup .OptionGroup1	OptionButton 17,20,125,8," ZERO UTENSILE ALTO/BASSO " ,.OptionButton0	OptionButton 17,32,125,8," ZERO UTENSILE NORMALE",.OptionButton1	OptionButton 17,44,125,8," ZERO UTENSILE DOPPIA MISURA"  ,.OptionButton2	OptionButton 17,56,125,8," CAMBIO UTENSILE AUTOMATICO"  ,.OptionButton3  End Dialog  Dim Dlg1 As SelectCentering  Button = Dialog (Dlg1)  If Button = 0 Then Exit Sub  Selected  = Dlg1.OptionGroup1    'ZERO UTENSILE ALTO/BASSO    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  If Selected = 0 ThenREM Updated 30 Aug 2018REM Auto Tool Zero Z- Metric 2 pass VersionREM Based On the BigTex scriptREM (09 Feb 2018)  Hint added To Material Thickness offset request box.REM (20 Feb 2018)  Request To touch the touch the touchoff plate To the bit To start probing added. Thanks To Glen Higgs For this addition.REM (27 Jul 2018)  Minor changes To Error Handling And Grammer correctionREM (30 Aug 2018)  Feedrate override safety Reset And restore added.Speak ("confermare ZERO UTENSILE ALTO BASSO") 'Avviso Vocal  Tasto = MsgBox("ZERO UTENSILE ALTO/BASSO" ,1+64, "CONFERMARE")If Tasto = 1 ThenElse  Exit SubEnd IfPlateThickness   = GetOEMDRO(1151) 'Spessore pannello touch e impostato quiDownStroke    = -100 'Impostare la corsa verso il basso per trovare la sondaDownFeedRate   = 250 'Imposta il FeedRate verso il bassoRetractStroke   = 10 'Imposta il tratto di ritrazioneRetractFeedRate  = 800 'Impostare la ritrazione FeedRateSmallRetractStroke  = 3 'Ritrarre 1 mm per un secondo passaggioSmallDownFeedRate  = 25 'Imposta il rallentamento del FeedRate per il 2 ° passaggioSmallDownStroke  = -(SmallRetractStroke *2) 'Impostare la corsa per la 2a passata al doppio della distanza di retrazione.CurrentFeed   = GetOemDRO(818) 'Ottieni la velocità di avanzamento corrente per tornare in un secondo momentoCurrentAbsInc   = GetOemLED(48) 'Ottieni lo stato corrente di G90 / G91CurrentGmode   = GetOemDRO(819) 'Ottieni lo stato G0 / G1 correnteCurrentFeedOverride = GetOEMDRO(821)'Ottieni l'impostazione di sostituzione della velocità di avanzamento correnteREM Request Material Thickness offsetOffset  = InputBox("Immettere  spessore del materiale Suggerimento:per sondare dalla superficie dello spoilboard, immettere lo spessore  del materiale. Immettere '0'o lasciare vuoto se si esegue il sondaggio dalla superficie del materiale "," Offset materiale "," ") REM  Toccare la placca To Cutter To Begin probemessage "Toccare brevemente la piastra sulla punta per iniziare a tastare lo zero"Touched_Flag = Falsecount  = 40seconds = 60    For i = 1 To 600        If GetOEMLed(825) <> 0 Then                           Beep            Touched_Flag = True            Exit For        End If        count = count - 1        If count = 0 Then ' 1 second elapsed            count = 40            seconds = seconds -1        End If        Sleep 25   Next iIf Touched_Flag = False Then    message "L'azzeramento automatico è scaduto, nessun tocco rilevato"    Exit SubEnd IfREM passaggio a velocità elevatasleep 2000  'dare il tempo di rimuovere il blocco dall'utensile e dalla posizione REM Code "(Z axis 1st pass)" 'inserisce questo messaggio nella barra di stato	If GetOemLed (825)=0 Then 'Verificare se la sonda è già collegata a terra o difettosa DoOEMButton (1010) 'azzerare l'asse Z in modo che il movimento della sonda inizierà da qui Sleep(500) ' questo ritardo mi dà il tempo di passare dal computer a tenere la sonda in posizione SetOEMDRO(821,100)  'Reimpostare l'override avanzamento al 100% per sicurezza Code "G90 G31 Z" &DownStroke &" F" &DownFeedRate 'mossa di sondaggio While IsMoving() 'aspetta mentre succede Wend ZProbePos = GetVar(2002) 'ottenere il punto esatto in cui è stata colpita la sonda If Abs(ZprobePos) <= Abs(DownStroke)-0.1 Then 'Verificare se la sonda è stata trovata  Code "G0 Z" &ZProbePos 'tornare a quel punto, sempre una quantità molto piccola di overrun  While IsMoving () 'aspetta mentre succede  Wend  Call SetDro (2, 0) 'impostare DRO asse Z su qualsiasi cosa sia impostata come spessore della piastra meno il valore di offset  Sleep(400) 'Pausa per l'aggiornamento di Dro.  Code "G1 Z" &SmallRetractStroke &" F" &RetractFeedRate 'ritirare  While IsMoving () 'aspetta mentre succede  Wend  REM Code "(2 ° passaggio asse Z)" 'inserisce questo messaggio nella barra di stato   Else  Rem Code "G0 Z0" 'ritrarre per iniziare pos  While IsMoving () 'aspetta mentre succede  Wend  Code "(Z-Plate non trovata, controllare connessione o la corsa e riprovare)" 'inserisce questo messaggio nella barra di stato  Code "F" &CurrentFeed 'Ritorna alla velocità di avanzamento precedente  If CurrentAbsInc = 0 Then 'se G91 era in vigore prima, tornare ad esso   Code "G91"  End If  If CurrentGMode = 0 Then 'se G0 era in vigore prima, torna ad esso   Code "G0"  End If  Exit Sub End IfElse Code "(Z-Plate collegato a terra, controllare collegamento e riprovare)" 'questo va nella barra di stato, se applicabileEnd IfCode "F" &CurrentFeed 'Ritorna alla velocità di avanzamento precedenteIf CurrentAbsInc = 0 Then 'se G91 era in vigore prima, tornare ad esso Code "G91"End IfIf CurrentGMode = 0 Then 'se G0 era in vigore prima, torna ad esso Code "G0"End IfREM 2nd pass at slow rateDoOEMButton (1010) 'azzerare l'asse Z in modo che il movimento della sonda inizi da quiSleep(1000) ' questo ritardo mi dà il tempo di passare dal computer a tenere la sonda in posizioneCode "G90 G31 Z" &SmallDownStroke &" F" &SmallDownFeedRate 'mossa di sondaggioWhile IsMoving() 'aspetta mentre succedeWendZProbePos = GetVar(2002) 'ottenere il punto esatto in cui è stata colpita la sondaIf Abs(ZprobePos) <= Abs(SmallDownStroke)-0.1 Then 'Verificare se la sonda è stata trovata Code "G0 Z" &ZProbePos 'tornare a quel punto, sempre una quantità molto piccola di overrun While IsMoving () 'aspetta mentre succede Wend Call SetDro (2, PlateThickness - offset) 'impostare il DRO dell'asse Z su qualsiasi cosa sia impostata come spessore della piastra meno il valore di offset Sleep(500) 'Pausa per l'aggiornamento di Dro. Code "G1 Z" &RetractStroke + PlateThickness &" F" &RetractFeedRate 'ritirare While IsMoving () 'aspetta mentre succede Wend Code "(L'asse Z è ora azzerato)" 'inserisce questo messaggio nella barra di stato  Else Code "G0 Z0" 'ritrarre per iniziare pos While IsMoving () 'aspetta mentre succede Wend Code "(Z-Plate non trovata, controllare connessione o corsa e riprovare)" 'inserisce questo messaggio nella barra di stato End IfCode "F" &CurrentFeed 'Ritorna alla velocità di avanzamento precedenteSetOEMDRO(821,CurrentFeedOverride) 'Riporta la sostituzione della velocità di avanzamento al valore precedenteIf CurrentAbsInc = 0 Then 'se G91 era in vigore prima, tornare ad esso Code "G91"End IfIf CurrentGMode = 0 Then 'se G0 era in vigore prima, torna ad esso Code "G0"End IfExit Sub        End If  'ZERO UTENSILE NORMALE      @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  If Selected = 1 ThenSpeak ("confermare ZERO UTENSILE NORMALE") 'Avviso Vocal  Tasto = MsgBox("ZERO UTENSILE NORMALE" ,1+64, "CONFERMARE")If Tasto = 1 ThenElse  Exit SubEnd IfMessage "************  INIZIO ZERO UTENSILE ************"	Sleep (1000) ' pausa di 1 secondi	CurrentAbsInc = GetOemLED (48) 'Copy current G90/G91 state	CurrentGMode = GetOemDRO (819) 'Copy current G0/G1 state	CurrentFeed = GetOemDRO (818) 'Copy current feedrate	Contact = 0 'Cancellare la bandiera di contatto	PlateThickness =GetOEMDRO(1151) 'Spessore pannello touch e impostato qui	ProbeFeed1 = 80 'Veloce sondaggio avanzamento e impostato qui	ProbeFeed2 = 15 'velocita' piano avanzamento e impostato qui	SetVar (1, -30) 'La distanza massima sondaggio e impostato qui	SetVar (2, 20) 'Ritrarre l'altezza e impostata qui	Code "M5" 'Assicura mandrino non e in esecuzione	Code "G21" 'Sono utilizzati  unita metriche	Zs = GetOemDRO (61) 'Copy current Z-Scale DRO	Call SetOemDRO (61,1) 'Set Z-Scale DRO to 1	DoOemButton (1010) 'Zero Z-Axis DRO	Code "(SETTAGGIO ZERO UTENSILE)" 'Messaggio per la barra di stato	Speak ("RICERCA CONTATTO") 'Avviso Vocale	While IsMoving () 'Attendere che compito e stato completato	Wend	If GetOemLED (825) = 0 Then 'Verificare se piatto touch non e gia a terra	Code "G90 G31 Z #1 F" & ProbeFeed1 'Mossa veloce sondaggio	While IsMoving () 'Attendere che compito e stato completato	Wend	If GetOemLED (825) = True Then 'Verificare se la sonda ha toccato piastra	Contact = 1 'Impostare il flag contatto	End If	'DoOemButton (1003) 'Cancellare una possibile condizione di feed-hold '****************************	ProbePos = GetVar (2002) ' esatto punto toccato dalla sonda	ProbePos = ProbePos + 1 'Spostare la posizione della sonda verso l'alto di 0,25 millimetri	Code "G0 Z" & ProbePos 'Ascensori sonda 0,25 millimetri sopra endpoint avanzamento veloce	While IsMoving () 'Attendere che compito e stato completato	Wend	Code "G90 G31 Z #1 F" & ProbeFeed2 'Movimento lento sondaggio	While IsMoving () 'Attendere che compito e stato completato	Wend	If GetOemLED (825) = True Then 'Verificare se la sonda ha toccato piastra	Contact = 1 'Impostare il flag contatto	End If	ProbePos = GetVar (2002) 'Sonda punto esatto toccato	Code "G0 Z" & ProbePos 'Ascensori sonda di esigere posizione di tocco	While IsMoving () 'Attendere che compito e stato completato	Wend	Call SetDRO (2,PlateThickness) 'Set Z-Axis DRO to Touch Spessore lamiera	Code "G0 Z #2" 'Ritrarre off Toccare piastra all'altezza set	While IsMoving () 'Attendere che compito e stato completato	Wend	Code "(ASSE - Z - azzerato.)" 'Messaggio per la barra di stato	Speak ("ASSE ZETA AZZERATO") 'Avviso Vocale		Code "F" & CurrentFeed 'Ripristinare avanzamento impostazione originale	If Contact = 0 Then 'Sonda raggiunto viaggio max senza toccare	Code "(ERRORE LA SONDA NON HA TOCCATO)" 'Message for status bar	Speak ("ERRORE LA SONDA NON HA TOCCATO") 'Avviso Vocale	Response = MsgBox ("ERRORE LA SONDA NON HA TOCCATO")	End If	Else	Code "(ERRORE PIASTRA A TERRA)" 'Messaggio per la barra di stato	Speak ("ERRORE PIASTRA A TERRA") 'Avviso Vocale	Response = MsgBox ("ERRORE - Toccare piastra e messo a terra -. Controllare il collegamento")	End If	Call SetOemDRO (61,Zs) 'Ripristinare Z-Scale DRO all'impostazione originale	If CurrentAbsInc = 0 Then 'Se G91 era in vigore prima di allora tornare ad essa	Code "G91"	End If	If CurrentGMode = 0 Then 'Se G0 era in vigore prima di allora tornare ad essa	Code "G0"		End If 	Exit Sub   End If    'ZERO UTENSILE DOPPIA MISURA     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  If Selected = 2 ThenSpeak ("confermare ZERO UTENSILE DOPPIA MISURA") 'Avviso Vocal  Tasto = MsgBox("ZERO UTENSILE D0PPIA MISURA" ,1+64, "CONFERMARE")If Tasto = 1 ThenElse  Exit SubEnd If'----- USER VARIABLES FOR DISTANCES, FEED RATES, TOUCH PLATES, OPTIONS ---------------------------------------		If GetParam("Units") = 0 Then			'* METRIC VALUES *			VarUnits = "  MM"			VarMaxDistance = -25.4      'MAX Z TRAVEL * ALWAYS MAKE NEGATIVE			VarFeedRate = 200      'MM/MIN DOWN FEEDRATE			VarStandOff = 3      'STANDOFF DISTANCE ABOVE PROBE CONTACT			VarTouchPlate = 13.600      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS			VarSecondPlate = 9.900      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG			VarThirdPlate = 1.000      'TERTIARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG		Else			'* SAE VALUES *			VarUnits = " INCH"			VarMaxDistance = -1.0      'MAX Z TRAVEL * ALWAYS MAKE NEGATIVE			VarFeedRate = 5      'INCH/MIN DOWN FEEDRATE			VarStandOff = 0.05      'STANDOFF DISTANCE ABOVE PROBE CONTACT			VarTouchPlate = 0.79      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS			VarSecondPlate = 0.0015   'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG 			VarThirdPlate = 0.0005      'TERTIARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG		End If		VarRunTheChoice = 1      'RUN PLATE CHOICE DIALOG?  0=NO  1=YES		VarDelayInSec = 0      'DEFAULT SECONDS TO DELAY MOTION		VarBeepOrSpeak = 2      'COUNTDOWN AUDIO: 0=NONE 1=BEEP 2=SPEAK		VarSecOfAudio = 5      'COUNTDOWN SECOND AT WHICH AUDIO BEGINS		VarCompleteAudio = 2      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE		VarWavAudioFile = "C:\MACH3\TADA.wav" 'WAV_AUDIO_FILE LOCATION		'*************************************************************************************************************		'----- GET INITIAL ENVIRONMENT SETTINGS FOR LATER REINSTATEMENT ----------------------------------------------		VarInitialLinearMode = GetOemDRO(819)        'LINEAR MODE  G00/G01		VarInitialDistMode = GetOemLED(48)           'DISTANCE MODE G90/G91   		VarInitialFeedRate = GetOemDRO(818)          'FEEDRATE		VarInitialInhibit = GetParam("ZInhibitOn")   'Z INHIBIT STATUS  OFF/ON		VarInitialZScale = GetParam("ZScale")        'Z SCALE VALUE		VarInitialFRO = GetOemDRO(821)           'FEEDRATE OVERRIDE PERCENTAGE		Message ""                      'CLEAR STATUS LINE TEXT		'----- CHECK DIGITIZE STATE; 0=CLEAR 1=ACTIVE ----------------------------------------------------------------		If GetOemLED (825) <> 0 Then			RET = MachMsg("Digitalizza stato non chiaro. Controllare sonda / connessioni e riprovare!","*** ERRORE ***",0)			End      'END SCRIPT		End If		'----- CHECK IF USER WANTS TO RUN PLATE CHOICE DIALOG --------------------------------------------------------		If VarRunTheChoice = 1 Then RunTheThing 'RUN SUBROUTINE 		'----- ACTIVATE TIME DELAY IF USED ---------------------------------------------------------------------------		If VarDelayInSec <> 0 Then			Do Until VarDelayInSec = 0      'LOOP UNTIL SECONDS = ZERO				Message VarDelayInSec         'DISPLAY SECONDS VALUE IN STATUS LINE				If VarDelayInSec < VarSecOfAudio + 1 Then					Select Case VarBeepOrSpeak   					Case 1 'OPTION BEEP						Beep					Case 2 'OPTION SPEAK						Speak(VarDelayInSec)   					End Select				End If   				Sleep 1000      'PAUSE 1 SEC.				VarDelayInSec = VarDelayInSec - 1   'REDUCE SECONDS BY 1 AFTER EACH LOOP			Loop		End If			'----- PREPARE FOR MOVE ----- MOVE PROBE DOWN TOWARD CONTACT -------------------------------------------------		SetParam("ZInhibitOn",0)   'TURN Z INHIBIT OFF		SetParam("ZScale",1.0)      'SET Z SCALE TO 1.0		DoOemButton(1014)      'CANCEL FEED OVERRIDE		SetOemDRO(802,0)        'ZERO Z AXIS DRO		Sleep 200         'DELAY TO ALLOW DRO TO CHANGE		Message "Auto Tool Zero in esecuzione..."		Code "G90 G31 Z" &VarMaxDistance &"F" &VarFeedRate   'MOVE DOWN @ FEEDRATE		While IsMoving()      'WAIT UNTIL MOVE IS COMPLETE BEFORE PROCEEDING		Wend		'----- GET Z CONTACT POSITION AND TEST FOR MAX TRAVEL ------ MOVE TO STANDOFF ------ UPDATE Z AXIS DRO -------		If GetVar(2002) <= VarMaxDistance + .001 Then   			RET = MachMsg("Corsa massima raggiunta. Riposizionare l'asse Z più vicino alla piastra di contatto e riprovare!",0)			Message ""			RETURNSTATE    'CALL REINSTATE SUBROUTINE			End      'END SCRIPT		Else			Beep			Code "G90 G0 Z" &GetVar(2002)   'MOVE TO CONTACT POINT DUE TO OVERRUN			While IsMoving()			Wend			SetOemDRO(802,0)      'ZERO Z AXIS DRO			Sleep 200			Code "G90 G0 Z" &VarStandOff   'MOVE TO STANDOFF DISTANCE			While IsMoving ()			Wend			SetOemDRO(802, VarStandOff + VarTouchPlate)     'SET Z DRO (STANDOFF + PLATE THICKNESS)			Sleep 200			Select Case VarCompleteAudio				Case 1 'OPTION BEEP					Beep				Case 2 'OPTION SPEAK					Speak("zero asse completo")				Case 3 'OPTION WAV_AUDIO_FILE					PlayWave(VarWavAudioFile)			End Select			Message "Zero automatico completo rimuovere piastra"		End If		RETURNSTATE     'CALL REINSTATE SUBROUTINE	End If  'CAMBIO UTENSILE AUTOMATICO     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  If Selected = 3 Then	Speak ("confermare cambio utensile automatico") 'Avviso Vocale Tasto = MsgBox("CAMBIO UTENSILE AUTOMATICO" ,1+64, "CONFERMARE")If Tasto = 1 ThenElse  Exit SubEnd If	If Not GetLed (7) Then			' è referenziato X	vxled = 1	End If		If Not GetLed (8) Then			' è referenziato Y	vyled = 1	End If	If Not GetLed (9) Then			' è referenziato Z	vzled = 1	End If	Tled = vxled + vyled + vzled	If Tled = 3 Then			' se non sono referenziati X, Y e Z esco	' parametri lavorazione	ToolPathOnOff = 132			' mi carico la definizione del tasto tool path	xzero = GetDRO (30)			' memorizzo la posizione iniziale ASSOLUTA di cambio utensile	yzero = GetDRO (31)	zzero = GetDRO (32)	xpos = GetDRO (0)			' memorizzo la posizione iniziale RELATIVA di cambio utensile	ypos = GetDRO (1)	zpos = GetDRO (2)	fpos = GetDRO (18)			' memorizzo il feedrate iniziale	' variabili del programma	fmax = 500				' imposto il feedrate massimo	fmin = 50				' imposto il feedrate per la palpata	zavv = -40				' distanza rapida di avvicinamento al palpatore	zmin = -150				' profondità oltre il palpatore	xcut = 0				' posizione X per cambio utensile	ycut = 0				' posizione Y per cambio utensile	xtool = GetUserDRO (1200)		' posizione X del palpatore (Settings -> Tool Change Location)	ytool = GetUserDRO (1201)		' posizione Y del palpatore	ztool = GetUserDRO (1202)		' posizione Z del palpatore	' inizio programma	Call DoOEMButton (ToolPathOnOff)	' disabilito il tool path	code "G0 F" & fmax			' porto il feedrate al valore massimo	Code "G1 G53 Z0"			' porto Z a ZERO macchina	While IsMoving()	Wend	Call SetDro (2,0)			' porto il contatore Z a zero	code "G1 G53 X" & xtool & "Y" & ytool 	' mi allineo sul palpatore	While IsMoving()	Wend	code "G1 Z" & zavv			' scendo in avvicinamento (fino a zavv)	While IsMoving()	Wend	code "G0 F" & fmin			' porto il feedrate al minimo	If IsSuchSignal (22) Then		' scendo sul palpatore per vedere la misura della punta attuale		code "G31 Z" & zmin		While IsMoving()		Wend	End If	zuno = GetVar (2002)			' memorizzo il valore di Z della punta attuale	zsu = zuno + 2	code "G0 Z" & zsu			' salgo per la seconda misura	While IsMoving()	Wend	If IsSuchSignal (22) Then		' scendo per la seconda volta per vedere la misura della punta attuale		code "G31 Z" & zmin		While IsMoving()		Wend	End If	zdue = GetVar (2002)			' memorizzo il valore di Z della punta attuale	zorig = (zuno + (zdue)) / 2	code "G0 F" & fmax			' riporto il feedrate al massimo	code "G1 G53 Z0"			' porto Z a ZERO macchina	While IsMoving()	Wend	code "G1 G53 X" & xcut & "Y" & ycut	' vado in una posizione comoda per il cambio utensile	While IsMoving()	WendSpeak ("ora si puo' cambiare la punta") 'Avviso VocaleMsgBox ("ORA SI PUO' SOSTITUIRE LA PUNTA")Speak ("attenzione      e' stata sostituita la punta") 'Avviso VocaleResponse = MsgBox ("E' STATA SOSTITUITA LA PUNTA?", 4 , "ATTENZIONE")	If (Response = 6) Then 	i = 99	Else	Speak ("ATTENZIONE , LA PUNTA NON E' STATA SOSTITUITA, RIPRENDO IL LAVORO CON LA PUNTA INIZIALE") 'Avviso Vocale	MsgBox ("LA PUNTA NON E' STATA SOSTITUITA RIPRENDO IL LAVORO CON LA PUNTA INIZIALE")End IfIf i <> 99 Then					' non faccio nulla	code "G1 G53 X" & xzero & "Y" & yzero	' torno alla posizione X Y zero pezzo	While IsMoving()	Wend	code "G1 X" & xpos & "Y" & ypos		' torno alla posizione X Y da dove ero partito	While IsMoving()	Wend	code "G1 G53 Z" & zzero			' riporto Z al valore zero pezzo	While IsMoving()	Wend	Call SetDro (2,0)			' porto il contatore Z a zero	code "G1 Z" & zpos			' riporto Z al valore di partenza	While IsMoving()	Wend	code "G0 F" & fpos			' riporto il feedrate al valore di partenza	Speak ("ATTENZIONE , CAMBIO UTENSILE NON EFFETTUATO , SI PUO' RIPRENDERE LA LAVORAZIONE") 'Avviso Vocale	MsgBox ("LA PUNTA NON E' STATA SOSTITUITA")	'DoSpinCW()				' riaccendo il motore M3 e riprendo il lavoro da dove l'avevo lasciatoElse	code "G1 G53 X" & xtool & "Y" & ytool 	' mi allineo sul palpatore	While IsMoving()	Wend	code "G1 Z" & zavv			' scendo in avvicinamento	While IsMoving()	Wend	code "G0 F" & fmin			' porto il feedrate al minimo	If IsSuchSignal (22) Then		' scendo sul palpatore		code "G31 Z" & zmin		While IsMoving()		Wend	End If	zuno = GetVar (2002)			' memorizzo il valore di Z della nuova punta	zsu = zuno +4	code "G0 Z" & zsu			' salgo per la seconda misura	While IsMoving()	Wend	If IsSuchSignal (22) Then		' scendo per la seconda volta per vedere la misura della nuova punta		code "G31 Z" & zmin		While IsMoving()		Wend	End If	zdue = GetVar (2002)			' memorizzo il valore di Z della nuova punta	znew = (zuno + (zdue)) / 2			code "G0 F" & fmax		' riporto il feedrate al massimo		code "G1 G53 Z0"		' ritorno Z ZERO macchina		While IsMoving()		Wend	code "G0 G53 X " & xzero & "Y" & yzero	' torno alla posizione X Y zero pezzo	While IsMoving()	Wend	code "G0 X " & xpos & "Y" & ypos		' torno alla posizione X Y da dove ero partito	While IsMoving()	Wend	zdif = zorig - (znew)			' controllo se l'utensile è più corto o piu lungo	code "G1 G53 Z" & zzero-(zdif)		' riporto Z al valore zero pezzo con la differenza utensile	While IsMoving()	Wend	Call SetDro (2,0)			' porto contatore Z a zero	code "G1 Z" & zpos			' riporto Z al valore di partenza (inizio programma)	While IsMoving()	Wend	code "G0 F" & fpos			' riporto il feedrate al valore di partenza			Speak ("CAMBIO UTENSILE EFFETTUATO ,   SI PUO' RIPRENDERE LA LAVORAZIONE ,      RIMUOVERE PIASTRA") 'Avviso Vocale		MsgBox ("RIMUOVERE PIASTRA E PREMERE IL TASTO LAVORAZIONE")	Message "************ CAMBIO UTENSILE EFFETTUATO ************"End IfElse	speak ("Per poter cambiare l'utensile bisognava prima aver referenziato la macchina" )	MsgBox ("PER CAMBIARE LA PUNTA BISOGNAVA REFERENZIARE LA MACCHINA")End IfCall DoOEMButton (ToolPathOnOff)	' abilito il tool path	End If	Exit Sub End Sub                    '******************************************* SUBROUTINES BELOW ***********************************************'----- SUBROUTINE TO RETURN INITIAL SETTINGS -----------------------------------------------------------------Sub RETURNSTATE 'REINSTATE INITIAL FEEDRATE Code "F" &VarInitialFeedRate  'REINSTATE DISTANCE MODE  0=G91  -1=G90 If VarInitialDistMode = 0 Then Code "G91" Else Code "G90" 'REINSTATE LINEAR MODE  0=G00  1=G01 If VarInitialLinearMode = 0 Then Code "G00" Else Code "G01" 'REINSTATE Z INHIBIT STATUS 0=OFF 1=ON If VarInitialInhibit = 1 Then SetParam("ZInhibitOn",1)  'SET Z SCALE TO INITIAL VALUE If VarInitialZScale <> 1.0 Then SetParam("ZScale",VarInitialZScale) 'SET FEEDRATE OVERRIDE TO INITIAL VALUE If VarInitialFRO <> 100 Then SetOemDRO(821,VarInitialFRO)End Sub'----- DIALOG SUBROUTINE FOR TOUCH PLATE CHOICE AND TIME DELAY -----------------------------------------------Sub RunTheThing     	Dim PlateList$ (2)   'DECLARE 3 ITEM ARRAY FOR PLATE SIZE LIST	If GetParam("Units") = 0 Then		'MM FORMATTING FOR LISTBOX		PlateList (0) = Format(VarTouchPlate,"00.000")     'FILL ARRAY 1		PlateList (1) = Format(VarSecondPlate,"00.000")   'FILL ARRAY 2		PlateList (2) = Format(VarThirdPlate,"00.000")     'FILL ARRAY 3	Else		'INCH FORMATTING FOR LISTBOX		PlateList (0) = Format(VarTouchPlate,"0.0000")     'FILL ARRAY 1		PlateList (1) = Format(VarSecondPlate,"0.0000")     'FILL ARRAY 2		PlateList (2) = Format(VarThirdPlate,"0.0000")     'FILL ARRAY 3	End If	Dim UnitList$ (0)   'DECLARE 1 ITEM ARRAY FOR UNIT LISTBOX	UnitList (0) = VarUnits     'FILL ARRAY 1	'SETUP DIALOG CONTROLS   	Begin Dialog PlateChoice 110,68,"Touch Plate"		ListBox 15,20,35,30, PlateList$(),.Lstbox2		ListBox 64,20,25,10, UnitList$(),.Listbox1		GroupBox 8,8,95,45,"Choose Plate Thickness",.GroupBox1		OKButton 57,34,37,12		Text 13,55,100,15, "Delay"		TextBox 37,55,30,10, .SecText        Text 70,55,30,15, "Seconds"         	End Dialog	Dim Dlg1 As PlateChoice	Dlg1.SecText = VarDelayInSec   'FILL SECONDS TEXTBOX WITH DEFAULT VALUE	Button = Dialog (Dlg1)   'SHOW DIALOG AND WAIT FOR BUTTON REPLY	If Button = 0 Then   'IF CLOSE BUTTON		Message "ZERO ASSE Z CANCELLATO"		End      'END SCRIPT	End If   	'CHECK THAT SECONDS WAS ENTERED NUMERIC	If IsNumeric(Dlg1.SecText) = True Then        VarDelayInSec = Int(Dlg1.SecText)	Else		RET = MachMsg("*****  I SECONDI IN FORMATO NUMERICO! *****", _		"  Substance Abuse Is Not Recommended  ",0)		RunTheThing   'RESTART SUB	End If	'SET PLATE VARIABLE BASED ON PLATE CHOICE	PlateNum = Dlg1.Lstbox2	Select Case PlateNum      Case 0 'PRIMARY PLATE        'WILL USE PRIMARY/DEFAULT THICKNESS      Case 1 'SECONDARY PLATE         VarTouchPlate = VarSecondPlate      Case 2 'TERTIARY PLATE        VarTouchPlate = VarThirdPlate	End SelectEnd Sub                              