Machsupport Forum
		Mach Discussion => VB and the development of wizards => Topic started by: birillo1959 on March 23, 2021, 04:06:00 PM
		
			
			- 
				good evening
I have this macro for zero tool / tool change positioned in a button, gives me an error, is there anyone who could correct it for me?
since it is not in my capacity, I thank anyone who could help me 
Sub Main
   Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale
 Begin Dialog SelectCentering 420,120,160,96,"MACRO UTENSILE"
   OKButton 30,68,40,14
   CancelButton 90,68,40,14
   GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
   OptionGroup .OptionGroup1
   OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
   OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
  End Dialog
  Dim Dlg1 As SelectCentering
  Button = Dialog (Dlg1)
  If Button = 0 Then Exit Sub
  Selected  = Dlg1.OptionGroup1
  'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  If Selected = 0 Then
     'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
   'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
   Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
   OKButton 12,20,40,14
   CancelButton 68,20,40,14
End Dialog
   Dim Dlg2 As ButtonSample
   Button = Dialog (Dlg2)
   If Button = 0 Then
   MsgBox "ZERO UTENSILE CANCELLATO"
    Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
   Exit Sub
End If
   Message "************  INIZIO ZERO UTENSILE ************"
'----- 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 = 127      'MM/MIN DOWN FEEDRATE
 VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
 VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
 VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
 VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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 Running..."
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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
    Case 3 'OPTION WAV_AUDIO_FILE
      PlayWave(VarWavAudioFile)
  End Select
 Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
End If
RETURNSTATE     'CALL REINSTATE SUBROUTINE
End      'END SCRIPT
'******************************************* 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 "Auto Tool Zero CANCELED"
   End      'END SCRIPT
  End If   
  'CHECK THAT SECONDS WAS ENTERED NUMERIC
  If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
  Else
   RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
   "  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
  End If
  
  'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
   Speak ("confermare cambio utensile automatico") 'Avviso Vocale
   Sleep (1000) ' pausa di 1 secondi
   Dim Dlg3 As ButtonSample
   Button = Dialog (Dlg3)
   If Button = 0 Then
   MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
    Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
   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                    
			 
			
			- 
				
Sub Main()
	Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale
	Begin Dialog SelectCentering 420,120,160,96,"MACRO UTENSILE"
		OKButton 30,68,40,14
		CancelButton 90,68,40,14
		GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
		OptionGroup .OptionGroup1
		OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
		OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
	End Dialog
	Dim Dlg1 As SelectCentering
	Button = Dialog (Dlg1)
	If Button = 0 Then Exit Sub
	Selected  = Dlg1.OptionGroup1
	'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 0 Then
		'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
		'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
		Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
			OKButton 12,20,40,14
			CancelButton 68,20,40,14
		End Dialog
		Dim Dlg2 As ButtonSample
		Button = Dialog (Dlg2)
		If Button = 0 Then
			MsgBox "ZERO UTENSILE CANCELLATO"
			Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
			Exit Sub
		End If
		Message "************  INIZIO ZERO UTENSILE ************"
		'----- 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 = 127      'MM/MIN DOWN FEEDRATE
			VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
			VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
			VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
			VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
		VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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	
	End If
	'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
		Speak ("confermare cambio utensile automatico") 'Avviso Vocale
		Sleep (1000) ' pausa di 1 secondi
		Dim Dlg3 As ButtonSample
		Button = Dialog (Dlg3)
		If Button = 0 Then
			MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
			Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
			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 
                   
	'----- 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 Running..."
	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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
			Case 3 'OPTION WAV_AUDIO_FILE
				PlayWave(VarWavAudioFile)
		End Select
		Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
	End If
	RETURNSTATE     'CALL REINSTATE SUBROUTINE
'End      'END SCRIPT
'******************************************* SUBROUTINES BELOW ***********************************************
End Sub
'----- 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 "Auto Tool Zero CANCELED"
		End      'END SCRIPT
	End If   
	'CHECK THAT SECONDS WAS ENTERED NUMERIC
	If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
	Else
		RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
		"  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
  
			 
			
			- 
				thanks TPS for the answer, now it works but in the window it doesn't give the data anymore(http://)
			
 
			
			- 
				this macro is a copy and paste nightmare for each programmer
Global	VarUnits 
Global	VarMaxDistance 
Global	VarFeedRate 
Global	VarStandOff
Global	VarTouchPlate 
Global	VarSecondPlate 
Global	VarThirdPlate 
Sub Main()
	Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale
	Begin Dialog SelectCentering 420,120,160,96,"MACRO UTENSILE"
		OKButton 30,68,40,14
		CancelButton 90,68,40,14
		GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
		OptionGroup .OptionGroup1
		OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
		OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
	End Dialog
	Dim Dlg1 As SelectCentering
	Button = Dialog (Dlg1)
	If Button = 0 Then Exit Sub
	Selected  = Dlg1.OptionGroup1
	'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 0 Then
		'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
		'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
		Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
			OKButton 12,20,40,14
			CancelButton 68,20,40,14
		End Dialog
		Dim Dlg2 As ButtonSample
		Button = Dialog (Dlg2)
		If Button = 0 Then
			MsgBox "ZERO UTENSILE CANCELLATO"
			Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
			Exit Sub
		End If
		Message "************  INIZIO ZERO UTENSILE ************"
		'----- 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 = 127      'MM/MIN DOWN FEEDRATE
			VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
			VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
			VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
			VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
		VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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	
	End If
	'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
		Speak ("confermare cambio utensile automatico") 'Avviso Vocale
		Sleep (1000) ' pausa di 1 secondi
		Dim Dlg3 As ButtonSample
		Button = Dialog (Dlg3)
		If Button = 0 Then
			MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
			Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
			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 
                   
	'----- 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 Running..."
	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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
			Case 3 'OPTION WAV_AUDIO_FILE
				PlayWave(VarWavAudioFile)
		End Select
		Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
	End If
	RETURNSTATE     'CALL REINSTATE SUBROUTINE
'End      'END SCRIPT
'******************************************* SUBROUTINES BELOW ***********************************************
End Sub
'----- 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 "Auto Tool Zero CANCELED"
		End      'END SCRIPT
	End If   
	'CHECK THAT SECONDS WAS ENTERED NUMERIC
	If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
	Else
		RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
		"  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
  
			 
			
			- 
				thank you for your patience, now another problem(http://)
			
 
			
			- 
				maybe
Global	VarUnits 
Global	VarMaxDistance 
Global	VarFeedRate 
Global	VarStandOff
Global	VarTouchPlate 
Global	VarSecondPlate 
Global	VarThirdPlate 
Sub Main()
	Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale
	Begin Dialog SelectCentering 420,120,160,96,"MACRO UTENSILE"
		OKButton 30,68,40,14
		CancelButton 90,68,40,14
		GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
		OptionGroup .OptionGroup1
		OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
		OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
	End Dialog
	Dim Dlg1 As SelectCentering
	Button = Dialog (Dlg1)
	If Button = 0 Then Exit Sub
	Selected  = Dlg1.OptionGroup1
	'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 0 Then
		'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
		'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
		Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
			OKButton 12,20,40,14
			CancelButton 68,20,40,14
		End Dialog
		Dim Dlg2 As ButtonSample
		Button = Dialog (Dlg2)
		If Button = 0 Then
			MsgBox "ZERO UTENSILE CANCELLATO"
			Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
			Exit Sub
		End If
		Message "************  INIZIO ZERO UTENSILE ************"
		'----- 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 = 127      'MM/MIN DOWN FEEDRATE
			VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
			VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
			VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
			VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
		VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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 Running..."
		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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
				Case 3 'OPTION WAV_AUDIO_FILE
					PlayWave(VarWavAudioFile)
			End Select
			Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
		End If
		RETURNSTATE     'CALL REINSTATE SUBROUTINE
				
	End If
	'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
		Speak ("confermare cambio utensile automatico") 'Avviso Vocale
		Sleep (1000) ' pausa di 1 secondi
		Dim Dlg3 As ButtonSample
		Button = Dialog (Dlg3)
		If Button = 0 Then
			MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
			Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
			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
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 "Auto Tool Zero CANCELED"
		End      'END SCRIPT
	End If   
	'CHECK THAT SECONDS WAS ENTERED NUMERIC
	If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
	Else
		RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
		"  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
			 
			
			- 
				keeps giving me the error "block = F, otherwise it works
			
 
			
			- 
				if it is easier to modify the "INCH" part I don't care it could be deleted
			
 
			
			- 
				you have to run the macro in vb scripter window by using the >|| button (single step) to see where the error occurs.
without having your Hardware here it is hard to test the macro for functionality.
			 
			
			- 
				I ran the macro in the window> || it passes all the lines and always returns to the beginning, if I execute it from the button it works fine but at the end "block = F" comes out. I noticed that in the initial window the entry "delay" is empty (in the original macro there is "0"). could this be the problem?>(http://)
			
 
			
			- 
				delay fixed, but think it will not help.
can you post c:\mach3\lasterror.txt?
Global	VarUnits 
Global	VarMaxDistance 
Global	VarFeedRate 
Global	VarStandOff
Global	VarTouchPlate 
Global	VarSecondPlate 
Global	VarThirdPlate
Global	VarDelayInSec 
Sub Main()
	Speak ("selezionare zero     o     cambio UTENSILE") 'Avviso Vocale
	Begin Dialog SelectCentering 420,120,160,96,"MACRO UTENSILE"
		OKButton 30,68,40,14
		CancelButton 90,68,40,14
		GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
		OptionGroup .OptionGroup1
		OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
		OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
	End Dialog
	Dim Dlg1 As SelectCentering
	Button = Dialog (Dlg1)
	If Button = 0 Then Exit Sub
	Selected  = Dlg1.OptionGroup1
	'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 0 Then
		'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
		'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
		Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
			OKButton 12,20,40,14
			CancelButton 68,20,40,14
		End Dialog
		Dim Dlg2 As ButtonSample
		Button = Dialog (Dlg2)
		If Button = 0 Then
			MsgBox "ZERO UTENSILE CANCELLATO"
			Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
			Exit Sub
		End If
		Message "************  INIZIO ZERO UTENSILE ************"
		'----- 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 = 127      'MM/MIN DOWN FEEDRATE
			VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
			VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
			VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
			VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
		VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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 Running..."
		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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
				Case 3 'OPTION WAV_AUDIO_FILE
					PlayWave(VarWavAudioFile)
			End Select
			Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
		End If
		RETURNSTATE     'CALL REINSTATE SUBROUTINE
				
	End If
	'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
		Speak ("confermare cambio utensile automatico") 'Avviso Vocale
		Sleep (1000) ' pausa di 1 secondi
		Dim Dlg3 As ButtonSample
		Button = Dialog (Dlg3)
		If Button = 0 Then
			MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
			Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
			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
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 "Auto Tool Zero CANCELED"
		End      'END SCRIPT
	End If   
	'CHECK THAT SECONDS WAS ENTERED NUMERIC
	If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
	Else
		RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
		"  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
  
			 
			
			- 
				continue the error could it be that the macro is not compatible with the software? use UC400ETH
			
 
			
			- 
				No characters found in reading real value , Block = F
means that a g-code command is excecuted where a F but no value is used.
only way to find is using the VB Scripter window and >||
it is running through here.
			 
			
			- 
				run from the window the error is after this line
" Code "F" &VarInitialFeedRate "
			 
			
			- 
				(http://)
			
 
			
			- 
				next try
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,96,"MACRO UTENSILE"
		OKButton 30,68,40,14
		CancelButton 90,68,40,14
		GroupBox 30,5,100,52,"ZERO / CAMBIO UTENSILE",.GroupBox1
		OptionGroup .OptionGroup1
		OptionButton 46,24,80,8," ZERO UTENSILE",.OptionButton1
		OptionButton 46,40,80,8," CAMBIO UTENSILE"  ,.OptionButton2
	End Dialog
	Dim Dlg1 As SelectCentering
	Button = Dialog (Dlg1)
	If Button = 0 Then Exit Sub
	Selected  = Dlg1.OptionGroup1
	'laser is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 0 Then
		'Tool Height Setting Macro - JLH v1.1 - 4 March 2013
		'Questa versione ha un approccio a 2 fasi, veloce per la velocita e lenta per la precisione.
   
		Speak ("confermare ZERO UTENSILE") 'Avviso Vocal
        Sleep (1000)
        Begin Dialog ButtonSample 250,200,120,60," "
			OKButton 12,20,40,14
			CancelButton 68,20,40,14
		End Dialog
		Dim Dlg2 As ButtonSample
		Button = Dialog (Dlg2)
		If Button = 0 Then
			MsgBox "ZERO UTENSILE CANCELLATO"
			Speak (" ZERO   UTENSILE     CANCELLATO") 'Avviso Vocale
			Exit Sub
		End If
		Message "************  INIZIO ZERO UTENSILE ************"
		'----- 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 = 127      'MM/MIN DOWN FEEDRATE
			VarStandOff = 1.27      'STANDOFF DISTANCE ABOVE PROBE CONTACT
			VarTouchPlate = 20.066      'PRIMARY/DEFAULT TOUCH PLATE THICKNESS
			VarSecondPlate = 0.038      'SECONDARY TOUCH PLATE THICKNESS * OPTION FOR CHOICE DIALOG
			VarThirdPlate = 0.012      '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 = 3      'END SIGNAL: 0=NONE 1=BEEP 2=SPEAK 3=WAV_AUDIO_FILE
		VarWavAudioFile = "C:\MACH3\ToolCompleteSND1.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("Digitize Status Not Clear. Check Probe/Connections And Try Again!","*** ERROR! ***",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 Running..."
		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("Maximum Travel Reached. Reposition Z Axis Closer To Touch Plate And Try Again!","*** OOPS! ***",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("Tool Zero Complete.")
				Case 3 'OPTION WAV_AUDIO_FILE
					PlayWave(VarWavAudioFile)
			End Select
			Message "Auto Tool Zero Complete! ***Remove Touch Plate***"
		End If
		RETURNSTATE     'CALL REINSTATE SUBROUTINE
				
	End If
	'web is selected@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
	If Selected = 1 Then
       Rem CAMBIO UTENSILE AUTOMATICO 
		Speak ("confermare cambio utensile automatico") 'Avviso Vocale
		Sleep (1000) ' pausa di 1 secondi
		Dim Dlg3 As ButtonSample
		Button = Dialog (Dlg3)
		If Button = 0 Then
			MsgBox "CAMBIO UTENSILE AUTOMATICO  CANCELLATO"
			Speak (" CAMBIO UTENSILE   AUTOMATICO      CANCELLATO") 'Avviso Vocale
			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
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 "Auto Tool Zero CANCELED"
		End      'END SCRIPT
	End If   
	'CHECK THAT SECONDS WAS ENTERED NUMERIC
	If IsNumeric(Dlg1.SecText) = True Then
        VarDelayInSec = Int(Dlg1.SecText)
	Else
		RET = MachMsg("*****  SECONDS MUST BE ENTERED IN NUMERIC FORMAT! *****", _
		"  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
			 
			
			- 
				it works perfectly!!!! thanks for your help and your patience !!! 
			
 
			
			- 
				good morning
I turn to TPS I fixed the "zero / tool change" macro in the attached mode then I added a confirmation to continue or cancel, to work it works but I don't know if it's okay, or if there is another safer way I kindly ask you to check and I apologize if I take advantage of your patience !! (http://)
Tasto = MsgBox("ZERO UTENSILE ALTO/BASSO" ,1+64, "CONFERMARE")
If Tasto = 1 Then
Else  
Exit Sub
End If
			 
			
			- 
				that would be the same just ab shorter
Tasto = MsgBox("ZERO UTENSILE ALTO/BASSO" ,1+64, "CONFERMARE")
If Tasto <> 1 Then
    Exit Sub
End If
try to use tab's to structure your code, it easieer to read. ;)
			 
			
			- 
				I don't know how to use the "tabs" !!
once again many thanks for the help !!