Macro tastatore: offset X Y e centro cerchio con 3 punti

Sezione dedicata a Mach3
Rispondi
Malmesso
Junior
Junior
Messaggi: 75
Iscritto il: sabato 7 maggio 2016, 11:55
Località: Tolmezzzo (UD)

Macro tastatore: offset X Y e centro cerchio con 3 punti

Messaggio da Malmesso » lunedì 4 giugno 2018, 14:23

Avete presente la procedura edge finder ?
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

Rispondi

Torna a “Mach3”