Ho finito di testare questa macro per il cambio utensile e dovrebbe andare bene.
Funziona con l'opzione "Wait for Cycle Start" per il cambio utensile manuale che utilizza i file M6Start.m1s e M6End.m1s
Anche se non ho il cambio utensile automatico e non ho idea di come funziona, ho inserito oltre a una posizione di cambio, un'altezza di innesto che tengo a 0 e una velocità di innesto per renderla più facilmente modificabile in caso di cambio automatico.
Perchè funzioni correttamente bisogna sempre azzerare lo z-offset al di sopra del pezzo, in modo che il pezzo sia sotto il margine di sicurezza, avere gli spostamenti negativi verso il basso e attivare il margine di sicurezza rispetto al work offset.
Poi altri requisiti scritti all'inizio della macro: G-43 attivo, interruttori di limite, ecc..
La Macro Start misura l'utensile appena utilizzato e dice di quanto la lunghezza si è scostata dal valore in tabella utensile, senza correggere la compensazione Z-Wear.
Ovviamente la prima punta viene calibrata prima di iniziare il lavoro, le altre invece durante il cambio.
Poi si dirige al ToolChange e aspetta lo start.
La Macro End cambia l'utensile in base al parametro T dell'M6 effettua la calibrazione e scrive la compensazione in tabella dicendo di quanto è la correzione sulla compensazione.
Poi si dirige alla posizione iniziale che rispetto agli Offset è la stessa, ma in coordinate assolute la Z sarà pari alla posizione iniziale più la differenza tra le due punte.
Per i movimenti tra posizione iniziale, posizione cambio utensile e posizione calibrazione tengo conto della maggiore fra le altezze coinvolte, che sono in tutto 4 considerando anche il margine di sicurezza del pezzo.
Qualsiasi cosa succeda, la velocità di avanzamento viene ripristinata a quella iniziale.
Funziona anche con le coordinate macchina in mm e coordinate lavoro in pollici e viceversa, o entrambe in mm o in pollici.
Per versioni di Mach3 da 3.041 in giù, non funzionano le coordinate macchina in pollici perchè non viene letto il comando GetSetupUnits()
Per versioni sopra 3.043.037 non ho testato perchè non viene più gestito il DRO z-wear che preferisco avere sott'occhio, mentre rimane il Z-wear in tabella.
Siccome non ho inserito questo parametro tramite DRO, ma con comandi specifici, dovrebbe andare comunque.
Per la calibrazione c'è un'altezza di sicurezza che io tengo a 20-30 mm (l'utensile più lungo che ho) e una velocità di avvicinamento che tengo a 300 mm/min in cui l'utensile scende col comando G31.
In caso l'utensile fosse più lungo dell'intervallo di misurazione che tengo a 0,25mm con una velocità di 4mm/min, si ferma e mi dice di quanto eccede.
Altrimenti procede con la misurazione e in caso fosse più corto dell'intervallo di misurazione, il mandrino andrebbe oltre e quindi si ferma.
Durante la misurazione dell'utensile usato, in caso si verificasse una delle due ipotesi non valide mi chiede se voglio continuare la calibrazioine del secondo utensile.
Durante la misurazione dell'utensile da utilizzare si ferma la lavorazione.
Ci sono un po' di DRO da utilizzare, ma possono essere sostituiti con dei valori sulle macro.
Ho fatto anche le altre procedure per completare la questione calibrazione Z:
- calibrazione mandrino, l'ho fatta solo per rendermi conto che non serve ed è soggetta ad errori sistematici.
In base a questo valore determino la lunghezza dell'utensile durante la calibrazione utensile, non ha importanza che la lunghezza assoluta sia precisa, basta non spostare il piatto di misura durante la lavorazione.
- calibrazione utensile con verifica e margine di errore più ampio, da fare ogni volta che si inserisce un utensile nel tool-table e sul primo utensile a inizio lavoro.
- zero sul posto, da fare dopo aver calibrato l'utensile iniziale che non modifica l'offset dell'utensile ma lo zero pezzo. Essendo richiesto il segnale della sonda, è necessario che il pezzo da lavorare sia di metallo e serve un isolamento elettrico tra l'utensile e il piano di lavoro.
Sinceramente non so come si azzera l'offset in Z automaticamente, voi come fate?
Io non ho molte basi di meccanica per cui spero che possiate aiutarmi, controllando che le procedure e i termini siano corretti.
Per me è molto importante imparare ad usare i termini giusti.
' ---------------------- ZERO CAMBIO UTENSILE M6 START ----------------------
If IsEStop Then End
If GetOEMLED(34) = -1 Then
Message "Interruttori di limite attivati !"
End
End If
If GetOEMLED(23) = 0 Then
DoOEMButton (119)
If GetOEMLED(23) = 0 Then
Message "Machine out of limits for SoftLimit Activation."
sleep(5000)
DoOEMButton(1003)
End If
End If
If IsSuchSignal(22) = 0 Then
Message "Segnale della sonda non configurato!"
sleep(5000)
DoOEMButton(1003)
End If
If IsActive(22) Then
Message "Contatto della sonda attivato!"
sleep(5000)
DoOEMButton(1003)
End If
If IsSafeZ() <>1 Then
Message "Attivare L'altezza di sicurezza e configurarla in coordinate relative!"
End
End If
ToolZ = GetOEMDRO(32)
If ToolZ = 0 Then
Message "Inserire la lunghezza dell'utensile e abilitare Z offset!"
sleep(5000)
DoOEMButton(1003)
End If
UM = 1
If GetSetupUnits() = 0 Then
Unit = " mm"
If GetParam("Units") = 1 Then
Unit = " pollici"
UM = 1/25.4
End If
Else
Unit = " pollici"
If GetParam("Units") = 0 Then
Unit = " mm"
UM = 25.4
End If
End If
PrbX = UM*GetOEMDRO(1990) 'posizione misura utensile
PrbY = UM*GetOEMDRO(1991)
PrbZ = UM*GetOEMDRO(1992)
PrbSZ = UM*GetOEMDRO(1993) 'altezza di sicurezza della posizione di misura utensile
PrbSZFeed = UM*GetOEMDRO(1994) 'velocità di avvicinamento dall'altezza di sicurezza
Dist = UM*GetOEMDRO(1995) 'Intervallo della misurazione
DistFeed = UM*GetOEMDRO(1996) 'velocità della misurazione
CurrentFeed = GetOEMDRO(818)
Offset = GetOEMDRO(18) + GetOEMDRO(49) 'zero offset + g92
SafeZ = GetSafeZ()
Message "Utensile in deposito... " & GetToolDesc(GetCurrentTool())
'DoSpinStop()
Code "G90"
' Vai alla posizione di taratura - avvicinamento dall'altezza di sicurezza con G31
A = PrbZ + PrbSZ + ToolZ
B = Offset + SafeZ + ToolZ
C = GetABSPosition(2)
If A >= B And A >= C Then
Code "G53 G0 Z" & A
Else
If B >= A And B >= C Then
Code "G53 G0 Z" & B
End If
End If
Code "G53 G0 X" & PrbX & "Y" & PrbY
Code "G53 G0 Z" & A
Code "F" & PrbSZFeed & " G31 Z" & PrbZ - Offset + Dist
While IsMoving()
Wend
' Protezione
If GetOEMLED(825) = -1 Then
ZProbe = GetVar(2002)
Code "F" & CurrentFeed
Code "G53 G0 Z" & GetABSPosition (2) + Dist*8
If MsgBox ("L'utensile eccede di: " & Format (ZProbe + Offset - ToolZ - PrbZ, "0.0#######") & Unit & Chr(10) & Chr(10) & "Continuare?",52,"") = 7 Then
DoOEMButton(1003)
End
End If
Else
' Lettura vecchio utensile
Code "F" & DistFeed & "G31 Z" & PrbZ - Offset - Dist
While IsMoving()
Wend
ZProbe = GetVar(2002)
If ZProbe < PrbZ - Offset + ToolZ - Dist + UM*0.00001 Then
Code "F" & CurrentFeed
Code "G53 G0 Z" & GetABSPosition (2) + Dist*8
If MsgBox ("Nessun contatto rilevato!" & Chr(10) & Chr(10) & "Continuare?",52,"") = 7 Then
DoOEMButton(1003)
End
End If
Else
Comp = ZProbe + Offset - ToolZ - PrbZ
If Abs(Comp) < UM*0.001 Then Comp = 0
msg = "Aggiunti "
If Comp <= 0 Then msg = "Persi "
Message msg & Format(Abs(Comp), "0.0#######") & Unit & " durante la lavorazione..."
End If
End If
' Vai a ToolChange
TcX = UM*GetOEMDRO(1200) 'posizione cambio utensile
TcY = UM*GetOEMDRO(1201)
TcZ = UM*GetOEMDRO(1202)
TcSZ = UM*GetOEMDRO(1203) 'altezza di innesto x la posizione cambio utensile
TcSZFeed = UM*GetOEMDRO(1204) 'velocità di avvicinamento dall'altezza di innesto
A = ZProbe + Offset + Dist*8
C = TcZ + TcSZ
If A >= B And A >= C Then
Code "G53 G0 Z" & A
Else
If B >= A And B >= C Then
Code "G53 G0 Z" & B
Else
Code "G53 G0 Z" & C
End If
End If
Code "G53 G0 X" & TcX & "Y" & TcY
Code "G53 G0 Z" & C
Code "F" & TcSZFeed & " G53 G1 Z" & TcZ
While IsMoving()
Wend
Code "F" & CurrentFeed
' ---------------------- ZERO CAMBIO UTENSILE M6 END ----------------------
UM = 1
If GetSetupUnits() = 0 Then
Unit = " mm"
If GetParam("Units") = 1 Then
Unit = " pollici"
UM = 1/25.4
End If
Else
Unit = " pollici"
If GetParam("Units") = 0 Then
Unit = " mm"
UM = 25.4
End If
End If
TcZ = UM*GetOEMDRO(1202)
TcSZ = UM*GetOEMDRO(1203)
TcSZFeed = UM*GetOEMDRO(1204)
PrbX = UM*GetOEMDRO(1990)
PrbY = UM*GetOEMDRO(1991)
PrbZ = UM*GetOEMDRO(1992)
PrbSZ = UM*GetOEMDRO(1993)
PrbSZFeed = UM*GetOEMDRO(1994)
Dist = UM*GetOEMDRO(1995)
DistFeed = UM*GetOEMDRO(1996)
CurrentFeed = GetOEMDRO(818)
Offset = GetOEMDRO(18) + GetOEMDRO(49)
SafeZ = GetSafeZ()
ToolOldZ = GetOEMDRO(32)
' Cambio utensile
Message "Nuovo utensile... " & GetToolDesc(GetSelectedTool)
SetDRO(24, GetSelectedTool())
Code "F" & TcSZFeed
Sleep(400)
ToolZ = GetOEMDRO(32)
' Torna alla posizione di taratura
A = PrbZ + PrbSZ + ToolZ
B = Offset + SafeZ + ToolZ
C = TcZ + TcSZ
If A >= B And A >= C Then
Code "G53 G1 Z" & C
Code "G53 G0 Z" & A
Else
If B >= A And B >= C Then
Code "G53 G1 Z" & C
Code "G53 G0 Z" & B
Else
Code "G53 G1 Z" & C
End If
End If
Code "G53 G0 X" & PrbX & "Y" & PrbY
Code "G53 G0 Z" & A
Code "F" & PrbSZFeed & " G31 Z" & PrbZ - Offset + Dist
While IsMoving()
Wend
' Protezione
If GetOEMLED(825) = -1 Then
Code "F" & CurrentFeed
ZProbe = GetVar(2002)
Message "L'utensile eccede di: " & Format (ZProbe + Offset - ToolZ - PrbZ, "0.0#######") & Unit
Code "G53 G0 Z" & GetABSPosition (2) + Dist*8
While IsMoving()
Wend
DoOEMButton(1003)
End
End If
' Lettura nuovo utensile
Code "F" & DistFeed & "G31 Z" & PrbZ - Offset - Dist
While IsMoving()
Wend
Code "F" & CurrentFeed
ZProbe = GetVar(2002)
If ZProbe < PrbZ - Offset + ToolZ - Dist + UM*0.00001 Then
Message "Nessun contatto rilevato!"
Code "G53 G0 Z" & GetABSPosition (2) + Dist*8
While IsMoving()
Wend
DoOEMButton(1003)
End
End If
Comp = ZProbe + Offset - ToolZ - PrbZ
If Abs(Comp) < UM*0.001 Then Comp = 0
Message "Correzione Z-Wear: " & Format (Comp, "0.0#######") & Unit
' Inserisce la differenza per la lunghezza esatta della fresa nel parametro Z-Wear
SetToolParam(GetCurrentTool(), 4, (ZProbe + Offset - UM*GetToolParam(GetCurrentTool(),2) - PrbZ)/UM)
Code "G43"
Sleep(400)
ToolNewZ = GetOEMDRO(32)
'Torna alla posizione di partenza
x = GetToolChangeStart(0)
y = GetToolChangeStart(1)
A = ZProbe + Offset + Dist*8
B = Offset + SafeZ + ToolNewZ
C = GetToolChangeStart(2) + Offset + ToolNewZ - ToolOldZ
If (A >= B And A >= C) Then
Code "G53 G0 Z" & A
Else
If (B >= A And B >=C) Then
Code "G53 G0 Z" & B
Else
Code "G53 G0 Z" & C
End If
End If
Code "G0 X" & x & "Y" & y
Code "G53 G0 Z" & C
While IsMoving()
Wend