Quella figura con i 4 tastatori sul piano e il cerchio in mezzo, quando si clicca su un tasto "select" azzera l'offset tenendo conto del raggio del tastatore e della direzione selezionata.
Se si clicca nel centro cerchio azzera l'offset in X e Y.
Io non ho ancora capito la sua utilità visto che l'offset posso azzerarlo in mille altri modi.
Quindi l'ho rifatta un po' più completa.
Le differenze sono:
- Diametro e lunghezza del tastatore vengono letti dalla tabella utensile anzichè dal DRO "Edge finder Diameter"
- La misurazione è automatica, ovviamente, ho utilizzato più o meno gli stessi metodi della macro M6 che ho postato 2 settimane fa.
Quindi faccio una prima misurazione e poi una verifica a velocità e intervallo ridotti, tenendo conto delle condizioni iniziali e conversione pollici/millimetri che questa volta ho inserito in un file a parte.
Visto che la procedura per le condizioni iniziali è simile per quasi tutti gli script, posso utilizzarla in maniera simile ad una funzione da richiamare con il comando RunScript e a cui posso assegnare le variabili g-code di Mach3 in ingresso e uscita tramite getVar e setVar
La stessa cosa faccio per non ripetere la procedura delll'edge-finder 4 volte:
Nei tasti "select" (programmati sullo screenset) assegnerò solo un numero ad una variabile g-code che corrisponderà ad una direzione, poi richiamo la macro in un file .m1s che va inserito nella cartella delle macro.
- Inoltre dopo aver effettuato la misura ed essere tornato al punto di partenza possio decidere se azzerare l'offset o calcolare la lunghezza da quel punto all'offset dell'asse selezionato.
- Quando clicco sul centro del cerchio invece parte una macro che fa il centro cerchio con 3 punti.
Questa procedura esiste anche nei wizard, ma è troppo semplice e con poche funzionalità.
Qui inanzitutto compare un Dialog in cui possiamo scegliere 3 su 8 direzioni possibili, anche quelle a 45°, oppure una funzione Auto che fa la media di gruppi di 3 direzioni programmabili facilmenta nella macro.
Io ne ho messi 8 per un totale di 24 misurazioni (+ verifica).
Questa funzione auto serve per avere una misura più precisa in caso di cerchi non precisi.
In più si può scegliere se il cerchio è esterno o interno.
Se è interno, effettua una misura, poi torna al punto di partenza e si ferma in attesa che spostiamo manualmente il tastatore e clicchiamo su cycle start e qundo va al centro si alza dell'altezza di sicurezza rispetto allo zero pezzo.
Se è esterno effettua una misura, torna al punto di partenza e esegue subito le altre, non si alza in z per andare al centro e i movimenti sono invertiti così come la compensazione del raggio utensile.
Nel dialog si può spuntare in caso si vuole anche azzerare l'offset sul centro cerchio.
A fine procedura vengono scritte le coordinate del centro e il diametro del cerchio e viene chiesto se andare al centro.
In funzione Auto la procedura si ripete 8 volte per cui scriverà i parametri 8 volte più la media finale.
Ogni volta che viene effettuata una misurazione e la verifica, compare un messaggio con lo scostamento rispetto alla prima misura.
Vista la quantità di messaggi e la velocità con cui si ripetono utilizzo entrambi i metodi di "messaggistica"
I messaggi che compaiono nella barra di mach3 forniscono i risultati dei calcoli fatti.
I messaggi sui Ticker (scorrevoli) danno indicazioni sulla misura che si sta facendo.
Ricordo che bisogna sostituire il Ticker1 col Ticker0 che è quello standard, io l'ho cambiato nel mio screenset perchè non volevo vedere il messaggio di Reset.
E i DRO che ho aggiunto nel mio screenset (dal 1000 in poi) o vanno inseriti nello screenset o sostituiti con dei valori sulla macro.
A differenza delle altre procedure che ho fatto per il calcolo dell'offset tramite il comando G31 qui per la prima misurazione non posso scegliere un intervallo di misurazione abbastanza piccolo in modo da rendere valida la procedura di verifica di contatto avvenuto tramite calcolo.
Per cui utilizzo l'accensine del Led Probe per sapere se è avvenuto il contatto.
Di solito non lo faccio perchè troppo spesso, almeno col mio sistema e la mia sonda, a velocità molto ridotte il contatto avviene "in parte", tanto da attivare il controllo sul G31 che ferma il motore, ma il led reta spento.
Ad ogni modo trovo che la procedura sia più affidabile tramite calcolo che verifica del led.
Per gestire indipendentemente assi X e Y nei comandi G-code ho trovato un metodo tramite i commenti tra parentesi () per fare sparire blocchi di variabili e operatori matematici che vengono poi visualizzati come messaggi sulla barra di mach3 e che faccio sparire di nuovo con un comando "Message" subito dopo.
Quindi basta inserire le parentesi come variabili all'interno delle istruzioni g-code nei punti che voglio tagliare.
Ho risparmiato un po' di righe di programmazione tramite questo trucco, le funzioni e gli array, anche se un po' limitati, che erano le cose che mi interessava capire riguardo il VB per Mach3.
L'algoritmo per calcolare il centro e il diametro invece l'ho copiato tale e quale dal primo sito che viene fuori digitando "vb centro cerchio 3 punti".
L'ho solo inserito in una subrutine che mi restituisce i tre valori tramite la dichiarazione byRef.
C'è anche una breve gestione degli errori che serve solo per non generare il messaggio di errore se si esce durante l'esecuzione del programma.
Potrebbe succedere in base alla versione di Mach3 che cancelli tutti i messaggi, in tal caso tale gestione va eliminata.
Spero che qualcuno provi questa macro, visto che un filino del tempo che ho impiegato a farla l'ho speso per renderla comprensibile, modificabile e utilizzabile da tutti.
Non vorrei che facesse la fine dell'altra macro che ho postato per l'M6
il codice da inserire nei pulsanti select partendo da sinistra in basso e procedendo in senso antiorario:
Codice: Seleziona tutto
SetVar(5, 1)
RunScript("macros/Mach3Mill/Touch")
Codice: Seleziona tutto
SetVar(5, 2)
RunScript("macros/Mach3Mill/Touch")
Codice: Seleziona tutto
SetVar(5, 3)
RunScript("macros/Mach3Mill/Touch")
Codice: Seleziona tutto
SetVar(5, 4)
RunScript("macros/Mach3Mill/Touch")
Macro Check.m1s
Codice: Seleziona tutto
' ---------------------- CHECK ----------------------
Sub Chek()
Message ""
SetTicker(1,"")
If IsEStop Then GoTo Er
If GetOEMLED(34) = -1 Then
Message "Interruttori di limite attivati !"
GoTo Er
End If
If GetOEMLED(23) = 0 Then
DoOEMButton (119)
If GetOEMLED(23) = 0 Then
Message "Machine out of limits for SoftLimit Activation."
GoTo Er
End If
End If
If IsSafeZ() <>1 Then
Message "Attivare L'altezza di sicurezza e configurarla in coordinate relative!"
GoTo Er
End If
If GetVar(0) = 1 Then
If IsSuchSignal(22) = 0 Then
Message "Segnale della sonda non configurato!"
GoTo Er
End If
If IsActive(22) Then
Message "Contatto della sonda attivato!"
GoTo Er
End If
If GetOEMDRO(32) = 0 Then
Message "Inserire la lunghezza dell'utensile e abilitare Z offset!"
GoTo Er
End If
End If
UM = 1
If GetSetupUnits() = 0 Then
Dec = 4
If GetParam("Units") = 1 Then
Dec = 6
UM = 1/25.4
End If
Else
Dec = 6
If GetParam("Units") = 0 Then
Dec = 4
UM = 25.4
End If
End If
SetVar(1, UM)
SetVar(2, Dec)
DoSpinStop()
Code "G90"
Exit Sub
Er:
SetVar(1, 0)
DoOEMButton(1003)
End Sub
Macro Touch.m1s
Codice: Seleziona tutto
'------------------ TASTATORE ----------------------
Sub TOUCH
Dim Dec, Direction, Fact, AxisN, DroN As Integer
Dim Unit, Axis, TckMsg As String
Dim UM, Offset, Dist, DistFeed, CurrentFeed, ToolD, Comp, Pos, StartPos, PosNew As Double
' Condizioni iniziali
SetVar(0,1)
RunScript("macros/Mach3Mill/Check")
UM = GetVar(1)
Dec = GetVar(2)
If UM = 0 Then End
Unit = " mm"
If Dec = 6 Then Unit = " pollici"
On Error GoTo Er
' Parametri
Dist = UM*GetOEMDRO(1995) 'intervallo della misurazione
DistFeed = UM*GetOEMDRO(1996) 'velocità della misurazione
CurrentFeed = GetOEMDRO(818)
ToolD = GetDRO(22)
' Modifica variabili in base alla direzione
Direction = GetVar(5)
If (Direction = 1) Or (Direction = 2) Then
Fact = -1
TckMsg = " -"
Else
Fact = 1
TckMsg = " +"
End If
If (Direction = 1) Or (Direction = 3) Then
Axis = "X"
AxisN = 0
Offset = GetOEMDRO(16) + GetOEMDRO(47)
DroN = 47
Else
If (Direction = 2) Or (Direction = 4) Then
Axis = "Y"
AxisN = 1
Offset = GetOEMDRO(17) + GetOEMDRO(48)
DroN = 48
Else
Message "Var Missing!"
End
End If
End If
SetTicker(1, Space(65) & "Tastatore: " & Axis & TckMsg)
' Lettura coordinate X o Y - Velocità 8X Intervallo 16X
StartPos = GetABSPosition(AxisN)
Pos = PROBE(UM, Direction, 16*Dist, Fact, Axis, AxisN, StartPos, Offset, 8*DistFeed, CurrentFeed)
' Vai a nuove coordinate della posizione di misura verifica e ritorna in pos.iniziale
Code "G53 G0 " & Axis & Pos + Dist*Fact
PosNew = PROBE(UM, Direction, Dist, Fact, Axis, AxisN, Pos, Offset, DistFeed, CurrentFeed)
Code "F" & CurrentFeed
Code "G53 G0 " & Axis & StartPos
' Calcola scostamento rispetto alla prima misura
Comp = PosNew - Pos
If Abs(Comp) < UM*0.001 Then Comp = 0
Message "Verifica... Scostamento: " & nFmt(Comp, Dec) & Unit
' Azzera l'offset o mostra la lunghezza rispetto all'offset dell'asse selezionato
If MachMsg("No: Calcola lunghezza rispetto all'offset " & Axis, "Azzerare Offset " & Axis,4) = 6 Then
SetOEMDRO (DroN, PosNew - ToolD/2*Fact)
sleep(400)
Else
Message "Lunghezza " & Axis & ": " & nFmt(PosNew - ToolD/2*Fact - Offset, Dec) & Unit
End If
SetTicker(1,"")
Exit Sub
'Elimina messaggio errore se si forza l'uscita
Er:
If Err.Number = 51 Then Message""
End Sub
' Funzione Tastatore
Function PROBE (UM, Direction, Dist, Fact, Axis, AxisN, Pos, Offset, DistFeed, CurrentFeed)
Code "F" & DistFeed & "G31 " & Axis & Pos - Offset - Dist*Fact
While IsMoving()
Wend
PROBE = GetABSPosition(AxisN)
If PROBE*Fact < (Pos - Dist*Fact + UM*Fact*0.00001)*Fact Then
Code "F" & CurrentFeed
Code "G53 G0 " & Axis & Pos
SetTicker(1,"")
Message "Nessun contatto rilevato!"
End
End If
End Function
Il codice da inserire nel pulsante nel centro del cerchio.
Codice: Seleziona tutto
'------------------ TROVA CENTRO ----------------------
Sub CIRCLE
Dim Dec, Index, FactX, FactY As Integer
Dim Unit, Msg, AxisX, AxisY, CutX, CutY, TckMsg1, TckMsg2, TckMsg3, TckMsg4 As String
Dim UM, OffsetX, OffsetY, OffsetZ, ToolD, ToolZ, CurrentFeed, DistFeed, DistX, DistY, DistXY, PosX, PosY, StartPosX, StartPosY, PosNewX, PosNewY, CompX, CompY, Xc, Yc, r, XcSum, YcSum, rSum, A As Double
Dim XYProbe(1 To 3, 0 To 1) As Double
' Condizioni iniziali
SetVar(0,1)
RunScript("macros/Mach3Mill/Check")
UM = GetVar(1)
Dec = GetVar(2)
If UM = 0 Then End
Unit = " mm"
If Dec = 6 Then Unit = " pollici"
On Error GoTo Er
' Parametri
OffsetX = GetOEMDRO(16) + GetOEMDRO(47) 'work offset + G92
OffsetY = GetOEMDRO(17) + GetOEMDRO(48)
OffsetZ = GetOEMDRO(18) + GetOEMDRO(49)
ToolD = GetDRO(22) 'Diametro utensile
ToolZ = GetOEMDRO(32) 'Z Offset utensile
DistX = UM*GetOEMDRO(150) ' Limiti Macchina
DistY = UM*GetOEMDRO(151)
DistFeed = UM*GetOEMDRO(1997) ' Velocità avvicinamento X-Y
DistXY = UM*GetOEMDRO(1995) ' Intervallo della misurazione
DistXYFeed = UM*GetOEMDRO(1996) ' Velocità della misurazione
CurrentFeed = GetOEMDRO(818)
'Dialog (selezionare 3 direzioni nei checkbox o l'opzione Auto e indicare se il cerchio è interno o esterno)
Begin Dialog SelDirection 300,200,112,102,"Centro cerchio con 3 punti"
OKButton 60,20,40,14
CancelButton 60,40,40,14,.Canc
Text 12,6,120,12,"Seleziona 3 direzioni"
CheckBox 12,18,12,12,"",.XNYP
CheckBox 24,18,12,12,"",.YP
CheckBox 36,18,12,12,"",.XPYP
CheckBox 12,30,12,12,"",.XN
CheckBox 36,30,12,12,"",.XP
CheckBox 12,42,12,12,"",.XNYN
CheckBox 24,42,12,12,"",.YN
CheckBox 36,42,12,12,"",.XPYN
CheckBox 12,60,60,12,"Cerchio interno",.CircInt
CheckBox 12,72,82,12,"Auto: 3 X 8 Con media",.FullDir
CheckBox 12,88,82,12,"Azzera Offset",.Zero
End Dialog
Dialog SelDirection
Dim SelDir As SelDirection
If SelDir.Canc = 0 Then End
' inserisce i valori di tutti i Checkbox nell'array "SelD"
Dim SelD(1 To 8) As Integer
SelD(1) = SelDir.XNYP
SelD(2) = SelDir.YP
SelD(3) = SelDir.XPYP
SelD(4) = SelDir.XN
SelD(5) = SelDir.XP
SelD(6) = SelDir.XNYN
SelD(7) = SelDir.YN
SelD(8) = SelDir.XPYN
' inserisce le 3 direzioni selezionate o la sequenza automatica nell'array "Sel"
Dim Sel (1 To 24) As Integer
If SelDir.FullDir = 1 Then
TakeTot = 8 'Numero gruppi sequenza modificabili
Dim FullDir (1 To 8, 0 To 2) As Double 'Numero gruppi sequenza modificabili
Take = 1
Sel(1) = 1 'sequenza automatica modificabile (8 gruppi di 3 direzioni)
Sel(2) = 3
Sel(3) = 5
Sel(4) = 2
Sel(5) = 4
Sel(6) = 6
Sel(7) = 3
Sel(8) = 5
Sel(9) = 7
Sel(10) = 4
Sel(11) = 6
Sel(12) = 8
Sel(13) = 5
Sel(14) = 7
Sel(15) = 1
Sel(16) = 6
Sel(17) = 8
Sel(18) = 2
Sel(19) = 7
Sel(20) = 1
Sel(21) = 3
Sel(22) = 8
Sel(23) = 2
Sel(24) = 4
Else
Take = ""
Index = 1
Msg = "Seleziona 3 Direzioni!"
For N = 1 To 8
If SelD(N)= 1 Then
If Index > 3 Then
Message Msg
End
End If
Sel(Index) = N
Index = Index + 1
End If
Next N
If Index < 4 Then
Message Msg
End
End If
End If
Index = 1
Msg = ""
' ------ INIZIO CICLO ------
' Modifica variabili in base alla direzione
For Each Direction In Sel
FactX = 1
FactY = 1
TckMsg2 = "+"
TckMsg4 = "+"
If (Direction = 4) Or (Direction = 6) Or (Direction = 7) Then
FactX = -1
FactY = -1
TckMsg2 = "-"
TckMsg4 = "-"
Else
If (Direction = 1) Then
FactX = -1
TckMsg2 = "-"
Else
If (Direction = 8) Then
FactY = -1
TckMsg4 = "+"
End If
End If
End If
AxisX = " X"
AxisY = " Y"
CutX = ""
CutY = ""
TckMsg1 = " X"
TckMsg3 = " Y"
If (Direction = 4) Or (Direction = 5) Then
AxisY = " ("
CutY = ") "
FactY = 0
TckMsg3 = ""
TckMsg4 = ""
Else
If (Direction = 2) Or (Direction = 7) Then
AxisX = " ("
CutX = ") "
FactX = 0
TckMsg1 = ""
TckMsg2 = ""
End If
End If
' Gestione cerchio interno
If SelDir.CircInt = 1 Then
FactX = -FactX
FactY = -FactY
ToolD = -ToolD
SetTicker(1, Space(65) & "Sposta il tastatore in" & TckMsg1 & TckMsg2 & TckMsg3 & TckMsg4 & " e Premi Esegui")
While GetOEMLED(804) = 0
Sleep(100)
Wend
End If
' Lettura coordinate X Y - Controllo contatto in base al Led Probe
SetTicker(1, Space(65) & "Misurazione " & Take & ": " & TckMsg1 & TckMsg2 & TckMsg3 & TckMsg4)
StartPosX = GetABSPosition(0)
StartPosY = GetABSPosition(1)
Code "F" & DistFeed & " G31" & AxisX & StartPosX-OffsetX+DistX*FactX & CutX & AxisY & StartPosY-OffsetY+DistY*FactY & CutY
Message Msg
While IsMoving()
Wend
Code "F" & CurrentFeed
If GetOEMLED(825) = 0 Then
Code "G53 G0" & AxisX & StartPosX & CutX & AxisY & StartPosY & CutY
Message "Nessun contatto rilevato!"
SetTicker(1,"")
End
End If
' Vai a nuove coordinate della posizione di misura
PosX = GetABSPosition(0)
PosY = GetABSPosition(1)
Code "G53 G0" & AxisX & PosX - DistXY*FactX & CutX & AxisY & PosY - DistXY*FactY & CutY
Message ""
While IsMoving()
Wend
' Verifica e inserimento delle coordinate nell'array "XYProbe" - Controllo contatto con calcolo del superamento della posizione di misura + intervallo di misura
Code "F" & DistXYFeed & " G31" & AxisX & PosX - OffsetX + DistXY*FactX & CutX & AxisY & PosY - OffsetY + DistXY*FactY & CutY
Message ""
While IsMoving()
Wend
Code "F" & CurrentFeed
PosNewX = GetABSPosition(0)
PosNewY = GetABSPosition(1)
If PosNewX*FactX > (PosX + DistXY*FactX - UM*0.00001*FactX)*FactX Or PosNewY*FactY > (PosY + DistXY*FactY - UM*0.00001*FactY)*FactY Then
Code "G53 G0" & AxisX & StartPosX & CutX & AxisY & StartPosY & CutY
Message "Nessun contatto rilevato!"
SetTicker(1,"")
End
End If
XYProbe(Index,0) = PosNewX
XYProbe(Index,1) = PosNewY
' Calcola scostamento rispetto alla prima misura e ritorna in posizione iniziale
CompX = PosNewX - PosX
CompY = PosNewY - PosY
If Abs(CompX) < UM*0.001 Then CompX = 0
If Abs(CompY) < UM*0.001 Then CompY = 0
Msg = "Verifica... Scostamento X: " & nFmt(CompX, Dec) & Unit & " Y: " & nFmt(CompY, Dec) & Unit
Code "G53 G0" & AxisX & StartPosX & CutX & AxisY & StartPosY & CutY
Message Msg
While IsMoving()
Wend
' Calcola e visualizza parametri del cerchio. Esce dal ciclo per la sequenza manuale o continua e aggiunge i parametri nell'array "FullDir" per la sequenza auto fino al numero totale di gruppi, poi calcola la media
If Index = 3 Then
SetTicker(1,"")
Sleep(2000)
CENTER r, Xc, Yc, XYProbe(1,0), XYProbe(1,1), XYProbe(2,0), XYProbe(2,1), XYProbe(3,0), XYProbe(3,1)
Msg = Take & " Diametro: " & nFmt(2*r+ToolD, Dec) & " X: " & nFmt(Xc-OffsetX, Dec) & " Y: " & nFmt(Yc-OffsetY, Dec)
If SelDir.FullDir = 1 Then
FullDir(Take,0) = Xc
FullDir(Take,1) = Yc
FullDir(Take,2) = r
If Take < TakeTot Then
Index = 0
Take = Take + 1
Else
Message Msg
Sleep(3000)
For Take = 1 To TakeTot
XcSum = XcSum + FullDir(Take,0)
YcSum = YcSum + FullDir(Take,1)
rSum = rSum + FullDir(Take,2)
Next Take
Xc = XcSum/TakeTot
Yc = YcSum/TakeTot
r = rSum/TakeTot
Message "Media di " & TakeTot & " - Diametro: " & nFmt(2*r+ToolD, Dec) & " X: " & nFmt(Xc-OffsetX, Dec) & " Y: " & nFmt(Yc-OffsetY, Dec)
Exit For
End If
Else
Message Msg
Exit For
End If
End If
Index = Index + 1
Next Direction
' ----- FINE CICLO -----
' Azzera l'offset se selezionato nel dialog
If SelDir.Zero = 1 Then
SetOEMDRO (47, Xc)
SetOEMDRO (48, Yc)
End If
' Vai al centro
If MsgBox ("", 4, "Vai al centro") = 6 Then
A = OffsetZ + GetSafeZ() + ToolZ
If SelDir.CircInt = 1 And A >= GetABSPosition(2) Then
Code "G53 G0 Z" & A
End If
Code "G53 G0 X" & Xc & "Y" & Yc
While IsMoving()
Wend
End If
Exit Sub
'Elimina messaggio di errore se si forza l'uscita
Er:
Message""
End Sub
' Sub TrovaCentro
Sub CENTER (ByRef r, ByRef Xc, ByRef Yc, X1, Y1, X2, Y2, X3, Y3)
k1 = -(X1^2 + Y1^2)
k2 = -(X2^2 + Y2^2)
k3 = -(X3^2 + Y3^2)
d1 = X1*Y2 + Y1*X3 + X2*Y3
d2 = Y2*X3 + X1*Y3 + Y1*X2
D = d1 - d2
da1 = k1*Y2 + k3*Y1 + k2*Y3
da2 = k3*Y2 + k1*Y3 + k2*Y1
Da = da1 - da2
db1 = X1*k2 + k1*X3 + k3*X2
db2 = k2*X3 + k3*X1 + k1*X2
Db = db1 - db2
dc1 = X1*Y2*k3 + Y1*k2*X3 + k1*X2*Y3
dc2 = k1*Y2*X3 + X1*k2*Y3 + Y1*X2*k3
Dc = dc1 - dc2
a = Da/D
b = Db/D
c = Dc/D
r = Sqr((a/2)^2 + (b/2)^2 - c)
Xc = - a/2
Yc = - b/2
End Sub