Machsupport Forum
		Mach Discussion => Non English Forums => German => Topic started by: ocram12 on December 27, 2017, 12:33:56 PM
		
			
			- 
				Hallo Zusammen, 
 
 ich habe mir eine Käsefräse gebaut. Diese läuft auch (für meine Zwecke) recht ordentlich. Bis jetzt habe ich immer nur Teile aus Holz gefräst. Also z.B. 4mm Sperholz für Weihnachten.
 Nun möchte ich mich aber an Alu heran wagen. Das geht mit ein paar Probestücken auch gut.
 Meine Fage:
 Wie richte ich das Werkstück richtig aus. Der Alu Klotz hat die genauen Abmaße. Ich könnte den Rohling nun exakt ausrichten. Das dauert aber sehr lange und ist ziemlich Zeitaufwendig. Auf Youtu.. habe ich gesehen, das Estlcam auch mit "verschobenen  Achsen" um kann.
 Das würde das Ausrichten sehr vereinfachen.
 Ist das mit meiner Mach3 Version auch möglich? Ich möchte mir nicht noch ein Programm kaufen müssen.
 
 Danke für eure Antworten.
 Gruß
 Ocram12
- 
				Servus ocram12,
 
 das ist mit Mach3 auch möglich.
 G68/G69 ist hier die gewünschte Funktion.
 
 Zuerst mal mußt Du Dir aber einen Kantentaster bauen/kaufen,
 und in Betrieb nehmen.
 
 Dazu gibt es hier hier im Forum einige Info's.
 
 Der Rest ist dann "nur" noch ein kleines macro, das 2 Punkte misst,
 und dann den Winkel ausrechnet.
 
 Gruß Tom
 
- 
				Moin Tom.
 Das hört sich ja nicht so schlimm an.
 Das wird dann wohl das nächste Projekt.
 Vielen Dank für den Stups in die richtige Richtung.
 Gruß Marco
- 
				Hallo Tom, 
 ich bin schon etwas weiter gekommen.
 Jetzt kann ich automatisch die Z,X und Y Achse vermessen, also den Nullpunkt finden. (Aber immer noch ohne Winkelversatz des Rohlings)
 Mit dem Befelh G68 wird ja der winkel übergeben. Um diesen zu bekommen kann ich zwei Punkte z.b. auf der X -Achse bestimmen. Über diese Punkte kann ich über die Formel "arcTan (m) = Winkel" den Winkel berechnen.
 Gibt es für die Winkelfunktionen einen Befehl? Ich habe da nichts gefunden. Währe nett, wenn Du mir da noch mal ein bisschen helfen könntest.
 
 Gruß
 Marco
- 
				Servus Marco,
 
 ok, jetzt geht es Richtung VB Scripting.
 Wie weit hast Du Dich damit schon beschäftigt?
 
 Gruß Tom
 
- 
				Also VB noch wirklich nicht viel. 
 Auf der Arbeit ist C und C++ angesagt. (Aber ich bin HW Entwickler somit reichen meine Programmierkenntisse nur für die Inbetriebnahme meiner Platinen.)
 Gruß
 Marco
- 
				OK,
 
 VB ist C++nur viel einfacher (zumindest manchmal).
 
 So um jetzt weiterzukommen brauche ich ein paar Info's
 
 Du hast geschrieben, das Du die X,Y,Z Achse schon automatisch vermessen kannst.
 
 Wie machst Du das genau ?
 
 Für G68 (oder genau gesagt, das was Du damit machen willst) brauchen wir ja nicht nur den
 Winkel, sondern auch die linke unter Ecke (X0,Y0), um die wir dann das Werkstück drehen.
 
 Ich stelle mir jetzt Deine Anforderung ungefähr so vor:
 
 1. Werkstück auflegen
 2. Werkstück vermessen, vollautomatisch auf Knopfdruck, hier wird X0 Y0 und der Winkel bestimmt
 3. Fräsen
 
 mal ganz grob heruntergebrochen.
 
 Gruß Tom
 
- 
				Also...
 Genauso habe ich mir das vorgestellt.
 Zur Zeit läuft es bei mir so ab:
 
 - ich bestimme zuerst die Z-Achse. (Für mein Problem ja nicht relevant.)
 - dann fahre ich ein Stück in X Richtung, senke 10mm und fahre dann langsam ans Werkstück. Wenn Berührung erkannt, wird x wieder 5mm zurück gefahren
 - Dann 20mm in Y Richtung und 10mm in X Richtung. Dann wieder langsam in Y Richtung bis Berührung erkannt.
 Natürlich mit Abzug des Radiusses des Fräsers.
 
 Das Script um einen weiteren Punkt zu erweiter ist kein Problem. Somit bekomme ich die Steigung m heraus.
 Ich habe auch schon nachgelesen. Es scheint ja eine arcTAN Funktion zu geben. Atn(x). Kann ich die benutzten? Wenn ja, ist das Problem glaube ich gelößt. Zumindest im Theoretischen :-)
- 
				Ich glaube ich verstehe jetzt, wo der Knackpunkt liegt. Der Nullpunkt liegt ja bei einem verschobenen Prüfling nicht da, wo ich ihn erwarten würde. Da muss ich noch mal drüber nachdenken. 
 
 
- 
				sicher gibt es ein ATN(x) Funktion
 
 siehe Attachments.
 
 zur Sicherheit hab ich mal VBScript Comandos auch mit drangehängt.
 
 Gruß Tom
 
- 
				
 [/quote]Ich glaube ich verstehe jetzt, wo der Knackpunkt liegt. Der Nullpunkt liegt ja bei einem verschobenen Prüfling nicht da, wo ich ihn erwarten würde. Da muss ich noch mal drüber nachdenken. 
 
 
 
 
 das meinte ich, warum der Winkel alleine nicht reicht.
 
 Gruß Tom
- 
				Danke. Ich werde jetzt erst Mal selber versuchen weiter zu kommen. Wenn ich noch  Probleme bekomme, würde ich noch Mal melden.
 Schon Mal danke im voraus.
 Gruß Marco
- 
				ich denke mal, man braucht mindesten 3 Punkte (Geometrie ist nicht meins),
 einen an der Y Richtung, zwei in X Richtung,
 um X0,Y0 auch zu bestimmen.
 
 Gruß Tom
- 
				wäre schön, wenn Du die Lösung hast, diese hier zu posten.
 Dann könnte ich das bei meiner Fräse auch implementieren.
 
 Gruß Tom
- 
				Servus Marco,
 
 diesen Code:
 
 
 Angle = GetOemDro(118)
 
 pi=4*Atn(1)
 
 CurrentToolDiameter = GetOemDRO(43)
 X = GetUserDro (1053)
 Y = GetUserDro (1054)
 Z = GetUserDro (1055)
 
 CurrentFeed = GetOemDRO(818) 'Get the current feedrate to return to later
 CurrentAbsInc = GetOemLED(48) 'Get the current G90/G91 state
 CurrentGmode = GetOemDRO(819) 'Get the current G0/G1 state
 CurrentToolDiameter = GetOemDRO(43) 'gets the current tool diameter
 PlateThickness = GetUserDRO(1051)
 ToolLength = GetOemDRO(42)
 
 MoveXDistance = ((X * 1.1) + CurrentToolDiameter)
 MoveYDistance = ((Y * 1.1) + CurrentToolDiameter)
 MoveDistance = .5 + CurrentToolDiameter
 MoveZDistance = .5
 
 If GetOemLed (825) <> 0 Then 'Check to see if the probe is already grounded or faulty
 Call ProbeGrounded()
 Exit Sub
 Else
 
 'Get top of part
 
 'DoOEMButton (1010) 'zero the Z axis so the probe move will start from here
 Code "G4 P4" ' this delay gives me time to get from computer to hold probe in place
 Code "G91 G31Z-2.0 F4" 'probing move, can set the feed rate here as well as how far to move
 While IsMoving() 'wait while it happens
 Wend
 'Call SetDro (2, PlateThickness)
 
 ZProbePos = GetVar(2002) 'get the axact point the probe was hit
 'Code "G0 Z" &PlateThickness
 'While IsMoving ()
 'Wend
 Code "G1 G91 F40 Z" &MoveZDistance 'put the Z retract height you want here
 While IsMoving ()
 Wend
 
 'Code "(Z axis is now zeroed)" 'puts this message in the status bar
 Code "F" &CurrentFeed 'Returns to prior feed rate
 
 
 'Call SetDro (2,GetDro(2)-Z)
 
 'Probe The X sides
 
 XCurrent = GetDro(0)
 YCurrent = GetDro(1)
 
 Code "G4 P1" 'Pause 1 second to give time to position probe plate
 While IsMoving ()
 Wend
 Call SetDro (0,0.000)
 While IsMoving ()
 Wend
 Call SetDro (1,0.000)
 Code "F4" 'slow feed rate to 4 ipm
 
 
 Rem Probe Y Face Side
 
 Code "G90 G0 X" &-MoveDistance
 Code "G4 P0.25"
 Code "G91 G0 Z" &-MoveZDistance-.2
 Code "G4 P0.25"
 XNew = Xcurrent + 3
 Code "G31 X" &XNew 'Probe X1,Y1 (P1) location
 While IsMoving() 'wait for the move to finish
 Wend
 X1 = GetVar(2000) 'get the probe touch location
 Y1=0 ' Should always be zero
 Y2 = Y-0.5 '1/2 inch back from end of block
 
 Code "G91 G0 X-.25"
 Code "G4 P0.25"
 Code "G91 G0 Y" &Y2
 Code "G4 P0.25"
 Code "G31 X" &XNew 'Probe X2,Y2 (P2) location
 While IsMoving() 'wait for the move to finish
 Wend
 X2 = GetVar(2000) 'get the probe touch location
 'Y2= Block length - 1/2 inch
 
 Code "G91 G0 Z" &MoveZDistance+.2
 Code "G4 P0.25"
 Code "G91 G0 Y" &-Y2 'Go back to the first spot
 Code "G4 P0.25"
 Code "G91 G0 X" &CurrentToolDiameter+.1 'rapid move back to start point
 Code "G4 P0.25"
 
 Rem Probe X Face Side
 
 Code "G90 G0 Y" &-MoveDistance
 Code "G4 P0.25"
 Code "G91 G0 Z" &-MoveZDistance-.2
 Code "G4 P0.25"
 YNew = YCurrent + 3
 Code "G31 Y" &YNew 'Probe X3,Y3 (P3) location
 While IsMoving()
 Wend
 Y3 = GetVar(2001)   'get the probe location
 'X3=0
 X4 = X-0.5 '1/2 inch back from end of block
 
 Code "G91 G0 Y-.25"
 Code "G4 P0.25"
 Code "G91 G0 X" &X4
 Code "G4 P0.25"
 Code "G31 Y" &YNew 'Probe X4,Y4 (P4) location
 While IsMoving() 'wait for the move to finish
 Wend
 Y4 = GetVar(2001) 'get the probe touch location
 'X4= Block Width - 1/2 inch
 
 Code "G90 G0 Z" &MoveZDistance+1    'Back up and clear
 Code "G4 P0.25"
 
 t1= (x4-x3)*(y1-y3)-(y4-y3)*(x1-x3)
 b1= (y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
 ua=t1/b1
 
 t2= (x2-x1)*(y1-y3)-(y2-y1)*(x1-x3)
 b2= (y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
 ub=t2/b2
 
 XH=x1+ua*(x2-x1) ' X Home  distance away
 YH=y1+ua*(y2-y1) ' Y Home  distance away
 
 
 If X>Y Then
 'LongestSide=X
 a=(Y4-Y3)
 b=(X4-X3)
 v=a/b
 NewAngle=Atn(v)*(180/pi)
 Else
 'LongestSide=Y
 a=(X2-X1)
 b=(Y2-Y1)
 v=b/a
 NewAngle=Atn(v)*(180/pi)
 If NewAngle > 0 Then
 NewAngle=NewAngle-90
 Else
 NewAngle=NewAngle+90
 End If
 End If
 
 Rem move To the Block Lower Corner
 
 Code "G90 G0 Y" &YH + CurrentToolDiameter/2
 Code "G90 G0 X" &XH + CurrentToolDiameter/2
 While IsMoving ()
 Wend
 Call SetDro (1,0.000)
 While IsMoving ()
 Wend
 Code "G4 P0.25"
 Call SetDro (0,0.000)
 Call SetDro (1,0.000)
 
 Call SetOemDro (118,NewAngle) ' now you can rotate the block
 
 
 'Call SetDro (2,Z + PlateThickness)
 
 Code "G4 P0.25"
 
 Code "F" &CurrentFeed 'restore starting feed rate
 Call ReturnG90G91State()
 Exit Sub
 End If
 
 Sub ProbeGrounded()
 Code "(Probe plate is grounded, check connection and try again)"
 Call ReturnG90G91State()
 End Sub
 
 Sub ReturnG90G91State()
 If CurrentAbsInc = 0 Then 'if G91 was in effect before then return to it
 Code "G91"
 Else
 Code "G90"
 End If
 If CurrentGMode = 0 Then 'if G0 was in effect before then return to it
 Code "G0"
 Else
 Code "G1"
 End If
 End Sub
 
 
 habe ich hier im Forum gefunden, vielleicht hilft er ja ein bisschen.
 
 Gruß Tom
 
- 
				Moin Tom,
 
 danke für das Beispiel.
 
 Ich hatte mich gestern noch mal hin gesetzt und die Mathematik dahinter durchdacht. Ist alles garnicht so schwer, wie es aussieht.
 Man(n) muss halt nur mal mit jemanden darüber reden.
 Ich habe dir die Berechnung mal aufgeschrieben und ein Beispiel dazu gepackt. Der Rest sollte nur noch Programmieren sein.
 Ich weiß nicht, wann ich da weiter machen kann. Ab Montag bin von der Arbeit aus in Brasilien tätig. Da weiß ich immer nicht, wann ich nach hause kommen.
 Wenn ich es am laufen habe, versuche ich mich zu melden.
 
 Gurß
 Marco
 
- 
				Hallo Marko,
 
 bei der Berechnung bin ich bei Dir.
 
 Wo ich jetzt noch drüber nachgedacht habe habe, ist das Antasten der 3 Punkte.
 Wenn die Koordinaten der 3 Punkte genau bestimmt sind, ist die Rechnung IMHO richtig.
 
 Da aber beim Antasten einer "verdrehten" Geraden der Tastkopf, welchen ja einen gewissen Durchmesser hat,
 das Bauteil nicht am Quadranten trifft, sondern tangential leicht daneben, kann man den Radius des Tastkopfes
 nicht einfach zur entsprechender (X/Y) Achse Sub- oder Addieren.
 
 Bei der Bestimmung des Winkels der Y-Geraden dürfte das egal sein, da ja 2x mit dem gleichen Fehler gearbeitet wird.
 Aber beim berechnen des Schnittpunktes der X und Y Geraden ist das glaube ich nicht egal.
 
 Werde die Aufgabe mal meinem Sohn stellen, dem sein Abi ist erst 4 Jahre her, nicht 40 wie meine mittlere Reife.
 Gruß Tom
 
 Wir können uns ja hier weiter Austauschen bis zur Realisierung.
- 
				Da hast du recht. Das ist mir nicht aufgefallen. Währe wohl erst beim Testen heraus gekommen. Soviel zur Theorie und der Praxis. 
 Das Problem könnte man aber umgehen, indem man auch für die Y Achse 2 Punke sich holt.
 Macht die Sache ein bisschen komplizierter, aber sollte gehen.
 
 Gruß
 Marco
 
- 
				Hallo,
 gibt es für die Variante mit 4 Punkten eine Lösung (Code)?
 
 Danke
- 
				das ist meine Lösung für 4 Punkte, aber sehr spezifisch, dennoch sollte das Grundprinzip klar werden.
 
 'Antasten Werkstück (gedreht)
 Public Function TouchG()
 Message "Antasten schraeges Bauteil"
 
 'Parameter holen
 X = GetUserDro (1055) 'delta der X-Punkte
 Y = GetUserDro (1056) 'delta der Y-Punkte
 CurrentToolDiameter = GetUserDro (1027)
 
 'Parameter prüfen
 If X = 0 Then
 MSGBox "Delta X zu klein!",vbOK + vbCritical ,"Fehler !"
 Exit function
 End If
 If Y = 0 Then
 MSGBox "Delta Y zu klein!",vbOK + vbCritical ,"Fehler !"
 Exit function
 End If
 
 'PI vorbesetzen -----------------------------------------------
 pi=4*Atn(1)
 
 'Koordinatendrehung ausschalten
 Code "G69"
 Sleep(200)
 
 'X / Y auf null setzen
 Call SetDro (0,0)
 Call SetDro (1,0)
 Sleep(200)
 
 'die Y Seite vermessen
 
 'P1 antasten
 Probe 100,0,0
 'Koordinaten P2
 X1 = GetVar(2000)
 Y1=0
 
 'Vorposition P2 anfahren
 Message("Vorposition P2 anfahren")
 Y2 = Y
 Code "G91 G1 X-" &X & "F1800"
 WaitForMove(True)
 Code "G91 G1 Y" &Y2
 WaitForMove(True)
 
 'P2 antasten
 Probe 100,0,0
 'Koordinaten P2
 X2 = GetVar(2000)
 
 'die X Seite vermessen -----------------------------------------------
 
 'Vorposition P3 anfahren
 Message("Vorposition P3 anfahren")
 X3 = X1 + (CurrentToolDiameter/2) + 10
 Code "G91 G1 X-" &X & "F1800"
 WaitForMove(True)
 Code "G90 G1 Y-30"
 WaitForMove(True)
 Code "G90 G1 X" &X3
 WaitForMove(True)
 
 'P3 antasten
 Probe 0,100,0
 'Koordinaten P3
 Y3 = GetVar(2001)
 
 'Vorposition P4 anfahren
 Message("Vorposition P4 anfahren")
 X4 = X3 + X
 Code "G91 G1 Y-20 F1800"
 WaitForMove(True)
 Code "G90 G1 X" &X4
 WaitForMove(True)
 
 'P4 antasten
 Probe 0,100,0
 'Koordinaten P4
 Y4 = GetVar(2001) 'get the probe touch location
 
 'Z auffahren
 Code "G91 G01 Y-0.2 F1800"
 WaitForMove(True)
 Code "G91 G1 Z20"
 WaitForMove(True)
 
 'Brechnung
 t1= (X4-X3)*(Y1-Y3)-(Y4-Y3)*(X1-X3)
 b1= (Y4-Y3)*(X2-X1)-(X4-X3)*(Y2-Y1)
 ua=t1/b1
 
 'Nullpunkt berechnen
 XH=X1+ua*(X2-X1) ' X Home  distance away
 YH=Y1+ua*(Y2-Y1) ' Y Home  distance away
 
 '	Message("Koordinaten Nullpunkt : X " &XH &" Y " &YH)
 '	Sleep(200)
 
 
 'Winkel aus der längeren Seite berechnen
 If X>Y Then
 'längere Seite=X
 a=(Y4-Y3)
 b=(X4-X3)
 v=a/b
 NewAngle=Atn(v)*(180/pi)
 Else
 'längere Seite=Y
 a=(X2-X1)
 b=(Y2-Y1)
 v=b/a
 NewAngle=Atn(v)*(180/pi)
 
 If NewAngle > 0 Then
 NewAngle=NewAngle-90
 Else
 NewAngle=NewAngle+90
 End If
 End If
 '	Message("Neuer Winkel : " &NewAngle )
 '	Sleep(200)
 
 'zum neuen Nullpunkt fahren
 'Winkel = errechneter Winkel + 45°
 siWi = 2*Pi/360*(NewAngle+45)
 hyWi = SQR((CurrentToolDiameter/2)*(CurrentToolDiameter/2)*2)
 
 Dx = hyWi * Cos(siWi)
 Dy = hyWi * Sin(siWi)
 '	Message("Koordinaten Berechnung : X " &Dx &" Y " &Dy)
 '	Sleep(200)
 
 'Zu neuen Nullpunkt fahren
 Code "G90 G1 X" &XH+Dx & " Y" &YH+Dy
 WaitForMove(True)
 
 'neuen Nullpunkt setzen
 Call SetDro (0,0)
 Call SetDro (1,0)
 
 'Koordinatendrehung setzen
 Call SetOemDro (118,NewAngle)
 
 'Koordinaten ausgeben
 '	Message "X1 " &X1 &" Y1 " &Y1 & "   X2 " &X2 &" Y2 " &Y2 & "   X3 " &X3 &" Y3 " &Y3 & "   X4 " &X4 &" Y4 " &Y4
 
 'wieder auf absolut stellen
 Code "G90"
 Message ""
 
 End Function
 
- 
				Danke,
 da ich von der Programmierung keine Ahnung habe wird es wohl schwierig sein den Code zu verstehen.
 Ist der Code so lauffähig, wenn ich ihn in Mach3 z.b zum Testen auf einen vorh. Button lege und aufrufe oder muss noch zusätzlich etwas installiert werden.
 Es kommt öfters bei mir vor, dass ich ein vorhandenes Brett auflege von dem ich nicht weiß ob es rechtwinklig ist.
 Funktioniert der Code auch wenn das Werkstück nicht rechtwinklig ist?
- 
				Hallo,
 wo bekomme ich die UserDRO her, z.B.:
 1051, 1053 - 1055
 bzw. was verbirgt sich dahinter?
- 
				Hallo,
 auf die Schnelle habe ich jetzt folgende OEMDRO'S gesehen:
 (1055) 'delta der X-Punkte
 (1056) 'delta der Y-Punkte
 (1027) 'Durchmesser des Messtasters
 
 Bedeutung siehe angehängtes Bild. Diese können natürlich auch durch feste Werte ersetzt werden.
 
 Der Code ist so sicher nicht 1 zu 1 lauffähig, da ich einen CSMIO Controller habe, welche eine spezielle Routine für
 da antasten benutzt.
 
 Im Prinzip müssten folgende Funktionsaufrufe ersetzt bzw spezifisch für deine Hardware ersetzt werden:
 
 Im Code wird mehrfach die Funktion Probe aufgerufen, ein Aufruf
 
 Probe 100,0,0
 
 macht ein Antasten in X für 100mm in positiver Richtung.
 
 Probe 0,100,0 dann für Y
 
 hinter dieser Funktion verbirgt sich vereinfacht gesagt ein G31 X100 F200, aber die Funktion mach auch
 gleichzeitig ein zweifaches Antasten mit unterschiedlichen Geschwindigkeiten, um die Genauigkeit zu erhöhen.
 
 Es ist natürlich immer die Frage, was, und vor allem wie genau (0.1 , 0.01 , 0.001) will ich antasten.
 Ich taste mit einem Messtaster an, da ich mit meiner Maschine (Tongil TNV40 3,5t schwer) nicht mal eben
 mit einem Fräser gegen das Werkstück fahren kann und will.
 
 Die zweite Funktion welche im Code verwendet wird ist WaitForMove.
 
 hier die Funktion:
 'Bewegung abwarten
 Sub WaitForMove (Check as Boolean)
 While IsMoving()
 'prüfen ob wir gegen das Bauteil fahren
 If ((GetOEMLed(825) = True) and (Check = True)) Then
 MSGBox "Probe während Positionierfahrt aktiv",vbOK + vbCritical ,"Fehler !"
 DoButton(21)
 End
 End If
 Sleep(5)
 Wend
 End Sub
 
 die wartet im Prinzip nur bis die ausgelöste Bewegung beendet ist.
 Man kann mit Übergabe True/False noch bestimmen, ob während der Bewegung der Probe Eingang geprüft wird,
 um auf eine Kollision zu reagieren.
 
 Der Code wird für eine nicht rechtwinkliges Teil nicht funktionieren.
 
 
 
 
 
 
 
- 
				O.K., danke für die ausführliche Antwort.
 Ich verwende den ESS mit Mach3.
 Jetzt versuche ich mich mal in den Code reinzulesen. Ob es klappt weiß ich noch nicht.
 Gruß
- 
				ok ich habe die Funktion Probe mal allgemeingültig umgeschrieben:
 
 'Antastfunktion
 Public Function Probe(X as Double, Y as Double , Z as Double)
 Dim axisreverse,axisprobe,probedist
 
 'prüfen ob Probe bereits aktiv
 If GetOEMLed(825) Then
 MSGBox "Probe aktiv",vbOK + vbCritical ,"Fehler !"
 DoButton(21)
 End
 End If
 'Antasten immer mit Konturdrehung 0 Grad
 Code "G69"
 
 
 'Softwarelimits ggf. ausschalten
 Dim SoftLimitswhereon As Boolean
 If GetOEMLed(23) Then
 DoOEMButton(119)
 SoftLimitswhereon = True
 Sleep(250)
 End If
 
 
 'Meldungen ausgeben
 IF X > 0 Then
 Message("Probe X+")
 axisprobe = "X+"
 axisreverse = "X-"
 probedist = X
 End if
 IF X < 0 Then
 Message("Probe X-")
 axisprobe = "X-"
 axisreverse = "X+"
 probedist = X
 End if
 IF Y > 0 Then
 Message("Probe Y+")
 axisprobe = "Y+"
 axisreverse = "Y-"
 probedist = Y
 End if
 IF Y < 0 Then
 Message("Probe Y-")
 axisprobe = "Y-"
 axisreverse = "Y+"
 probedist = Y
 End if
 IF Z > 0 Then
 Message("Probe Z+")
 axisprobe = "Z+"
 axisreverse = "Z-"
 probedist = Z
 End if
 IF Z < 0 Then
 Message("Probe Z-")
 axisprobe = "Z-"
 axisreverse = "Z+"
 probedist = Z
 End if
 Sleep(200)
 
 
 '1.Versuch
 Message "1. Antastung"
 Code "G31 " & axisprobe  & probedist & " F200"
 
 While IsMoving()'warten bis Probe fertig
 Sleep(20)
 Wend
 
 Message "Probe 1.Kontakt bei: " &GetVar(2000) &"," &GetVar(2001) &"," &GetVar(2002) &"," &GetOemDro(83) &"," &GetOemDro(84) &"," &GetOemDro(85)
 Sleep(200)
 
 'Probe freifahren
 Message "Probe freifahren"
 While GetOEMLed(825)
 Code "G91 G01 " &axisreverse &"0.1 F600"
 While IsMoving()'warten bis Probe fertig
 Sleep(20)
 Wend
 Wend
 Code "G90"
 
 '2.Versuch
 Message "2. Antastung"
 Code "G31 " & axisprobe  & probedist & " F2"
 
 While IsMoving()'warten bis Probe fertig
 Sleep(20)
 Wend
 
 Message "Probe 2.Kontakt bei: " &GetVar(2000) &"," &GetVar(2001) &"," &GetVar(2002) &"," &GetOemDro(83) &"," &GetOemDro(84) &"," &GetOemDro(85)
 Sleep(200)
 
 'Softlimits ggf. wieder einschalten
 If ((Not GetOEMLed(23)) And (SoftLimitswhereon = True)) Then
 Sleep(500)
 DoOEMButton(119)
 End If
 
 Message "Probe " &Left(axisprobe,1) &" erfolgreich."
 
 End Function
 
 
 aber bitte vorsichtig testen, da ich das nur runtergeschrieben habe, ohne (mangels Möglichkeit) es zu testen.
- 
				Du kannst Dir alle diese Funktionen einfach in ein file in c:\mach3\macros\dein profilname kopieren.
 
 sagen wir mal das file heisst: ProbeFunktionen.M1S
 
 dann machst Du einen Button mit VB Script.
 
 hier wäre der Code für ein einfaches Antasten X+ 100mm
 
 Sub Main()
 
 Probe 100,0,0
 end sub
 
 #Expand <\..\..\macros\Dein Profilname\ProbeFunktionen>
 
 der Vorteil der #Expand Anweisung liegt darin, das Du deine Funktionen "bündeln" kannst, um diese immer
 wieder aus unterschiedlichen Situationen heraus aufrufen kannst, und, wenn Du einen Fehler behebst, ist dieser
 für alle Aufrufe behoben.
 
 OK momentan ist das alles vielleicht ein bisschen viel, aber im Laufe der Zeit wird es immer einfacher, und der
 Vorteil der Bündelung von Funktionen wird deutlich klarer.
 
 Gruß Tom
 
 
 
- 
				Hallo Tom,
 danke für die Arbeit, die du dir damit machst.
 Ich habe mir alles runtergeladen und versuche da mal durchzusteigen.
 ich habe noch ein Problem mit dem Screenset. Ich verwende den von Immo Winckler und der ist nicht editierbar.
 Ich muss erst einen anderen suchen und laden.
- 
				schau mal hier:
 
 https://einfach-cnc.de/mach3-fraesen-beschreibung/
 
 ist in etwa das gleiche.
- 
				Danke, den hatte ich mir gerade installiert.
			
- 
				So, den Button habe ich eingerichtet und die beiden Makros reinkopiert.
 Mit der Maschine ergibt sich folgendes:
 Nach Betätigung des Buttons verfährt die X-Achse bis zum DRO 100 mm und bleibt stehen.
 Wenn ich den TouchProbe betätige bleibt die Maschine stehen und fährt dann langsamer weiter. Betätige ich den TouchProbe nochmals dann bleibt die Maschine stehen. Wenn ich den TouchProbe nicht ein 2. Mal betätige, dann fährt die Maschine bis DRO 100 mm und bleibt dann stehen.
- 
				eigentlich müsstest Du drei Funktionen reinkopiert haben
 
 TouchG()
 Probe()
 WaitforMove()
 
 Habe mir gerade die modifizierte Funktion Probe() noch mal angesehen, die hat ein "Loch", wenn der Probe Eingang
 nicht innerhalb von 100mm (maximale Probe Distanz) kommt. Hier muss ich mir noch was überlegen. Wie gesagt
 bei der CSMIO ist das alles ein bisschen anders, in der Originalversion (CSMIO) wird das berücksichtigt und ggf. eine
 Fehlermeldung ausgegeben.
 
 Der generelle Ablauf zum Antasten eines Punktes sollte so ablaufen:
 -Achse fährt mit F200 bis der Probeeingang betätigt wird
 -Achse fährt so lange in die entgegengesetzte Richtung (F600) bis der Probe Eingang wieder frei wird
 -Achse fährt mit F2 bis der Probeeingang betätigt wird
 -dieser zweite genauere Wert wird dann für die Berechnung genommen
 
 wie geschrieben kann ich das momentan hier leider nicht testen.
 
 Gruß Tom
 
 
 
 
- 
				Sorry, ist mein Fehler. Ich habe nur „Probe“ auf den Button gelegt und „ProbeFunktionen“ abgelegt. Für „TouchG“ und „WaitforMove“ eine m1s anlegen?
			
- 
				schau dir reply#26 noch mal an, da habe ich das schon beschrieben.
 
 die Code für den button würde dann lauten
 
 Sub Main()
 
 TouchG
 end sub
 
 #Expand <\..\..\macros\Dein Profilname\ProbeFunktionen>
 
 Achtung die Expand Anweisung muss auf deine Profilnamen angepasst werden
 
 alle drei Funktionen in eine Datei (ProbeFunktionen.M1S)
- 
				So, ich habe nun die Codes in die Datei eingepflegt.
 Zum Test:
 Button drücken --> Statusmeldung: "1. Anstastung" - X wird zügig angefahren --> danach sehr langsames Freifahren. Jetzt  kommt die Fehlermeldung "Probe während Positionierfahrt aktiv"
 
 Kann es ein, dass da eine Überwachungszeit für das Freifahren aktiv ist und das Freifahren zu langsam ist?
- 
				schaue Dir bitte mal die Datei C:\Mach3\lasterrors.txt an.
 ich vermute, das Du nicht alle Statusmeldungen siehst, da die zu schnell hintereinander kommen.
- 
				Hier mal ein Ausschnitt aus der "Lasterrors".
 Ich kann hier keinen Fehler erkennen. Was ja wohl auch richtig sein kann, da das Makro ja ordnungsgemäß abbricht.
- 
				Ich habe jetzt mal den Code von Hand durchgesteppt. Soweit ich das überblicken kann läuft er von Hand.
 Was nicht paßt, ist das der 2. Meßpunkt nur ca. 1 - 2 mm neben dem ersten Meßpunkt liegt.
 Mir ist immer noch nicht klar woher einige der Variablen kommen:
 - 2000
 - 2001
 
 und deren Bedeutung im Code, hier z.B:
 'Softlimits ggf. wieder einschalten
 If ((Not GetOEMLed(23)) And (SoftLimitswhereon = True)) Then      'lt. Handbuch ist OEMLED (23) = SpindleSpeed true Acc. ???????
 Sleep(500)
 DoOEMButton(119)                                          ' SoftLimits Off/On toggle
 End If
 
 und hier:
 
    'Bewegung abwarten
 Sub WaitForMove (Check as Boolean)
 While IsMoving()
 'prüfen ob wir gegen das Bauteil fahren
 If ((GetOEMLed(825) = True) and (Check = True)) Then      '825 = Digitize Input
 MSGBox "Probe während Positionierfahrt aktiv",vbOK + vbCritical ,"Fehler !"
 DoButton(21)
 End
 End If
 Sleep(5)
 Wend
 End Sub
 
 
 Gruß
- 
				die Variablen 2000,2001,2002 kommen aus der G31 Funktion,
 hier werden die exakten Koordinaten X/Y/Z eingtragen, wenn der Probe Eingang kommt,
 macht das System selbständig.
 
 Du müsstest mal folgende Zeilen ändern, da Du ja keine EIngabefelder für DeltaX und DeltaY hast:
 
 'Parameter holen
 X = 50 'GetUserDro (1055) 'delta der X-Punkte
 Y = 50 'GetUserDro (1056) 'delta der Y-Punkte
 CurrentToolDiameter = 8 'GetUserDro (1027) 'hier wird der Durchmesser des Messtasters vorbesetzt
 
 bloß das wir das grundsätzlich ans Laufen bekommen.
 
 hier mal ein Auszug aus Lasterrors:
 
 Sat - 13:07:54 ---Probe X+
 Sat - 13:07:54 ---1. Antastung
 Sat - 13:07:58 ---Probe 1.Kontakt bei: 8.79,0,-68.9725,382.1625,195.8975,-85.74
 Sat - 13:07:58 ---Probe freifahren
 Sat - 13:07:58 ---2. Antastung
 Sat - 13:08:02 ---Probe 2.Kontakt bei: 8.8,0,-68.9725,382.1625,195.8975,-85.74
 Sat - 13:08:02 ---Vorposition P2 anfahren
 Sat - 13:08:07 ---EStop Button Pressed.
 Sat - 13:08:07 ---External EStop Requested.
 
 grundsätzlich schaut das mal gut aus, der erste Punkt wird angetastet, und beim Verfahren zu zweiten Punkt
 (es war ja kein DeltaX/DeltaY vorhanden) seinen wir gegen das Bauteil zu fahren.
 
 Gruß Tom
 
 PS: in irgend einem Post habe ich ein Bild angehängt, in dem man die Antastreihenfolge sehen kann.
 
 
 
 
 
- 
				Hallo,
 ich habe jetzt nochmals mit den Delta-Werten getestet. In meinem Fall 15 mm und ToolDiameter 3 mm.
 Wenn ich mit Hand durchsteppe geht das prinzipiell. Beim Automatikbetrieb steigt das Programm mit der bereits genannten Fehlermeldung immer noch aus.
- 
				hier noch mal ein Version der Funktion TouchG()
 
 ACHTUNG Deltas und Durchmesser wieder entsprechend anpassen
 
 'Antasten Werkstück (gedreht)
 Public Function TouchG()
 Message "Antasten schraeges Bauteil"
 
 'Parameter holen
 X = GetUserDro (1055) 'delta der X-Punkte
 Y = GetUserDro (1056) 'delta der Y-Punkte
 CurrentToolDiameter = GetUserDro (1027)
 
 'Parameter prüfen
 If X = 0 Then
 MSGBox "Delta X zu klein!",vbOK + vbCritical ,"Fehler !"
 Exit function
 End If
 If Y = 0 Then
 MSGBox "Delta Y zu klein!",vbOK + vbCritical ,"Fehler !"
 Exit function
 End If
 
 'PI vorbesetzen -----------------------------------------------
 pi=4*Atn(1)
 
 'Koordinatendrehung ausschalten
 Code "G69"
 Sleep(200)
 
 'X / Y auf null setzen
 Call SetDro (0,0)
 Call SetDro (1,0)
 Sleep(200)
 
 'die Y Seite vermessen
 
 'P1 antasten
 Probe 100,0,0
 'Koordinaten P2
 X1 = GetVar(2000)
 Y1=0
 
 'Vorposition P2 anfahren
 Message("Vorposition P2 anfahren")
 Y2 = Y
 Code "G91 G1 X-" &X & "F1800"
 WaitForMove(False)
 Code "G91 G1 Y" &Y2
 WaitForMove(True)
 
 'P2 antasten
 Probe 100,0,0
 'Koordinaten P2
 X2 = GetVar(2000)
 
 'die X Seite vermessen -----------------------------------------------
 
 'Vorposition P3 anfahren
 Message("Vorposition P3 anfahren")
 X3 = X1 + (CurrentToolDiameter/2) + 10
 Code "G91 G1 X-" &X & "F1800"
 WaitForMove(False)
 Code "G90 G1 Y-30"
 WaitForMove(True)
 Code "G90 G1 X" &X3
 WaitForMove(True)
 
 'P3 antasten
 Probe 0,100,0
 'Koordinaten P3
 Y3 = GetVar(2001)
 
 'Vorposition P4 anfahren
 Message("Vorposition P4 anfahren")
 X4 = X3 + X
 Code "G91 G1 Y-20 F1800"
 WaitForMove(False)
 Code "G90 G1 X" &X4
 WaitForMove(True)
 
 'P4 antasten
 Probe 0,100,0
 'Koordinaten P4
 Y4 = GetVar(2001) 'get the probe touch location
 
 'Z auffahren
 Code "G91 G01 Y-0.2 F1800"
 WaitForMove(False)
 Code "G91 G1 Z20"
 WaitForMove(True)
 
 'Brechnung
 t1= (X4-X3)*(Y1-Y3)-(Y4-Y3)*(X1-X3)
 b1= (Y4-Y3)*(X2-X1)-(X4-X3)*(Y2-Y1)
 ua=t1/b1
 
 'Nullpunkt berechnen
 XH=X1+ua*(X2-X1) ' X Home  distance away
 YH=Y1+ua*(Y2-Y1) ' Y Home  distance away
 
 '	Message("Koordinaten Nullpunkt : X " &XH &" Y " &YH)
 '	Sleep(200)
 
 
 'Winkel aus der längeren Seite berechnen
 If X>Y Then
 'längere Seite=X
 a=(Y4-Y3)
 b=(X4-X3)
 v=a/b
 NewAngle=Atn(v)*(180/pi)
 Else
 'längere Seite=Y
 a=(X2-X1)
 b=(Y2-Y1)
 v=b/a
 NewAngle=Atn(v)*(180/pi)
 
 If NewAngle > 0 Then
 NewAngle=NewAngle-90
 Else
 NewAngle=NewAngle+90
 End If
 End If
 '	Message("Neuer Winkel : " &NewAngle )
 '	Sleep(200)
 
 'zum neuen Nullpunkt fahren
 'Winkel = errechneter Winkel + 45°
 siWi = 2*Pi/360*(NewAngle+45)
 hyWi = SQR((CurrentToolDiameter/2)*(CurrentToolDiameter/2)*2)
 
 Dx = hyWi * Cos(siWi)
 Dy = hyWi * Sin(siWi)
 '	Message("Koordinaten Berechnung : X " &Dx &" Y " &Dy)
 '	Sleep(200)
 
 'Zu neuen Nullpunkt fahren
 Code "G90 G1 X" &XH+Dx & " Y" &YH+Dy
 WaitForMove(True)
 
 'neuen Nullpunkt setzen
 Call SetDro (0,0)
 Call SetDro (1,0)
 
 'Koordinatendrehung setzen
 Call SetOemDro (118,NewAngle)
 
 'Koordinaten ausgeben
 '	Message "X1 " &X1 &" Y1 " &Y1 & "   X2 " &X2 &" Y2 " &Y2 & "   X3 " &X3 &" Y3 " &Y3 & "   X4 " &X4 &" Y4 " &Y4
 
 'wieder auf absolut stellen
 Code "G90"
 Message ""
 
 End Function
 
- 
				Hallo,
 ich habe die neue Datei getestet. Es gibt folgende Fehlermeldung aus:
 Siehe Bild.
 
 Die Eingaben für DeltaX, DeltaY und den Durchmesser habe ich in das Screenset eingearbeitet. Das funktioniert soweit.
- 
				Eine Ergänzung noch zum obigen post.
 Das Programm stoppt immer noch mit der gleichen Fehlermeldung wie Anfangs geschrieben nach Durchlaufen des ersten Punktes.
- 
				Hast Du die Funktion WaitforMove() versehentlich gelöscht? 
			
- 
				Ich habe eine neue "TouchG" mit dem neuen Code erstellt. "WaitforMove" ist ja in der "ProbeFunktionen", die ja nun nicht mehr aufgerufen wird, da in "TouchG" nicht mehr vorhanden.
 Meine "TouchG" im Anhang.
- 
				nein, nach wie vor alle drei Funktionen
 
 TouchG()
 WaitforMove()
 Probe()
 
 in einer Datei (Probefunktionen), nur eben die alte TouchG() durch die neue ersetzen.
 
- 
				So, der Code läuft nun durch.
 Mit der F8-Taste mache ich normalerweise eine Referenzfahrt über alle Achsen. Das funktioniert jetzt nicht mehr. Kann das an den Macros liegen?
 Ich bekomme die Fehlermeldung: "Nothing to Feedhold"
 
- 
				Nein das liegt nicht an den Macros, das liegt an dem Screenset.
 
 Ich haben mal ein Liste angefügt, welche Schnellzugriffstasten bei Deinem Screenset was machen.
 
 Gruß Tom
- 
				Danke für den Hinweis. Ich hätte mich totgesucht.
			
- 
				Was bedeuten denn Vorsilben "si" bei siwi und "hy" bei hywi? 
			
- 
				Hallo,
 irgendwie habe ich den Post verpasst:
 
 siwi ist der Winkel im Bogenmaß, da die Sin/Cos Funktionen einen Winkel im Bogenmaß erwarten
 hywi ist der Versatz, der sich aus dem aktuellen Durchmessers des Werkzeugs ergibt, da der neue Nullpunkt ja im Zentrum der Spindel sein soll.
- 
				Danke für die Info.
 Ich habe jetzt alles am Laufen. Ich habe nun doch in die Winckler-Version reingebaut bekommen.
 
 Gruß
 
- 
				Hallo,
 ich habe eine Frage zum Thema.
 Ich möchte eine Tastplatte verwenden, die über einen Rand (Abstand bis zum Messobjekt) verfügt. Ähnlich hier: https://www.youtube.com/watch?v=bhZdbgM6S70.
 Nun muss noch die Breite zw. Außenkante und Innenkante der Tastplatte als Abstand berücksichtigt werden.
 Reicht es aus, wenn ich einfach die Breite des Randes zum Durchmesser/2 addiere? Erschwerend kommt dann noch hinzu das die Abstände in AX und AY, bedingt durch die Fertigung, nicht genau gleich sein könnten.
 (http://)
 Danke
- 
				DeltaX und DeltaY sind eh Parameter, und können somit beliebig, auch unterschiedlich sein.
 
 Wenn der Tastrand auf beiden Seiten gleich ist kannst Du den einfach dazuzählen.
- 
				Hallo,
 waren deltaX und DeltaY nicht die Abstände der Messpunkte zueinander?
 Ich meinte AX und AY auf meiner Skizze.
- 
				Sorry habe mich verlesen, wir reden von Ax und Ay.
 
 hyWi = SQR(((CurrentToolDiameter/2)+Ax)*((CurrentToolDiameter/2)+Ay)*2)
 
 sollte passen.
 
 Einfach mal mit extremen Ax zu Ay Unterschieden testen, wenn es nicht passt, muß ich mit nochmal komplett reindenken,
 ist zu lange her.
- 
				Hallo,
 danke.
 So in etwa hatte ich es mir auch gedacht. Ich war mir bloß nicht sicher.
 Ich probier das mal aus.
 
 
- 
				Hallo,
 ich muss das Thema noch mal aufleben lassen.
 Ich habe ein Problem bei der Ausführungen von Assistenten entdeckt.
 Wenn ich z.B. den Assistenten "Surface" aufrufe und den "Post G Code"-Button drücke, dann ruft Mach3 anscheinend zuerst das Makro zum Starten des "Bauteil Ausrichten" auf. Bei mir heißt das "M1030.m1s mit folgenden Inhalt:
 Sub Main()
 
 TouchG
 'Probe 100,0,0
 end sub
 
 #Expand <\..\..\macros\01_ESS-DualPort\ProbeFunktionen>
 
 
Das heißt, es beginnt die Maschine den ersten Punkt zu suchen, findet diesen natürlich nicht, da kein Taster angeschlossen ist.
 
 Ausgelöst wird die Geschichte durch den letzten Befehl (Call LoadTeachFile) im Assistenz-Makro (Surface). Ich finde keine Möglichkeit den Start des "Bauteil ausrichten" zu verhindern.:
 
 Sub Main()
 DoOEMButton (169)
 FeedRough = Abs(GetOEMDRO(1070))
 FeedFinish = Abs(GetOEMDRO(1083))
 ToolDia = Abs(GetOEMDRO(1071))
 ToolRad = ToolDia / 2
 StepOverPercent = Abs(GetOEMDRO(1096))
 
 XPOS = GetOEMDRO(1072)
 YPOS = GetOEMDRO(1073)
 ZStart = GetOEMDRO(1084)
 
 Tool_Offset_X = Abs(GetOEMDRO(1078))
 Tool_Offset_Y = Abs(GetOEMDRO(1082))
 SafeZ = Abs(GetOEMDRO(1079))
 
 Length = Abs(GetOEMDRO(1080))
 Width = Abs(GetOEMDRO(1081))
 Depth = Abs(GetOEMDRO(1075))
 
 StepDepth = Abs(GetOEMDRO(1076))
 Clearance = StepDepth * 1.5
 FinalCutDepth = Abs(GetOEMDRO(1095))
 ' test inputs
 
 If FinalCutDepth = 0 Then
 Code "(MSG,Final Cut Depth can't be zero)"
 End If
 
 If StepOverPercent = 0 Then
 Code "(MSG,Tool Step Over Percentage can't be zero)"
 End If
 
 If StepOverPercent > 100 Then
 Code "(MSG,Tool Step Over Percentage can't be > 100%)"
 End If
 
 If FinalCutDepth = StepDepth Then
 Code "(MSG,Final Cut Depth can't be equal to Step Depth)"
 End If
 
 If FeedRough = 0 Then
 Code "(MSG,Feed Rate can't be zero)"
 End If
 
 If StepDepth > Depth Then
 StepDepth = Abs(Depth)
 End If
 
 If StepDepth = 0 Then
 Code "(MSG,Step down can't be zero)"
 End If
 
 If Length = 0 Then
 Code "(MSG,Length can't be zero)"
 End If
 
 If Depth = 0 Then
 Code "(MSG,Depth can't be zero)"
 End If
 
 If Width = 0 Then
 Code "(MSG,Width can't be zero)"
 End If
 
 If SafeZ <= ZStart Then
 Code "(MSG,********  SafeZ <= ZStart  *******)"
 End If
 
 If ToolDia = 0 Then
 Code "(MSG,Tool Diameter can't be zero)"
 End If
 
 OpenTeachFile "FaceStockX.tap"
 
 XStart = XPOS - Tool_Offset_X + ToolRad
 YStart = YPOS - Tool_Offset_Y + ToolRad
 XFinal = XPOS + Length + Tool_Offset_X - ToolRad
 YFinal = YPOS + Width + Tool_Offset_Y - ToolRad
 
 If Width < ToolDia Then
 YStart = YPOS + ToolRad
 YFinal = YStart
 End If
 
 XToolDown = XStart - Tool_Offset_X - ToolDia
 YToolDown = YStart
 
 Depth = Depth
 StepDepth = StepDepth
 StepOverPercent = StepOverPercent / 100
 
 PassNumber = 1
 Code "F" & FeedRough
 
 DepthofPass = ZStart - PassNumber * StepDepth
 If DepthofPass > ZStart - Depth + FinalCutDepth Then
 Do
 DepthofPass = ZStart - PassNumber * StepDepth
 If DepthofPass <= (ZStart - Depth + FinalCutDepth) Or PassNumber > 2000 Then
 Exit Do
 End If
 
 Code "G00 Z" & SafeZ
 Code "G00 X" & XToolDown & " Y" & YToolDown
 Code "G00 Z" & DepthofPass
 
 PassType = 1
 YpassNo = 0
 Do
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 'Code "F" & FeedRough
 Code "G01 Y" & YofPass
 Code "G01 X" & XFinal
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 Code "G01 Y" & YofPass
 Code "G01 X" & XStart
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 Loop
 YofPass = YFinal
 Code "G01 Y" & YofPass
 If (PassType = 1) Then
 Code "G01 X" & XFinal
 Else
 Code "G01 X" & XStart
 End If
 PassNumber = PassNumber + 1
 Loop
 End If
 
 If FinalCutDepth <> 0 Then
 PassType = 1
 DepthofPass = ZStart - Depth + FinalCutDepth
 
 Code "G00 Z" & SafeZ
 Code "G00 X" & XToolDown & " Y" & YToolDown
 Code "G00 Z" & DepthofPass
 
 
 YpassNo = 0
 Do
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 Code "G01 Y" & YofPass
 Code "G01 X" & XFinal
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 Code "G01 Y" & YofPass
 Code "G01 X" & XStart
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 Loop
 YofPass = YFinal
 Code "G01 Y" & YofPass
 If (PassType = 1) Then
 Code "G01 X" & XFinal
 Else
 Code "G01 X" & XStart
 End If
 End If
 
 PassType = 1
 DepthofPass = ZStart - Depth
 
 Code "G00 Z" & SafeZ
 Code "G00 X" & XToolDown & " Y" & YToolDown
 Code "G00 Z" & DepthofPass
 Code "F" & FeedFinish
 
 YpassNo = 0
 Do
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 
 Code "G01 Y" & YofPass
 Code "G01 X" & XFinal
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 
 YofPass = YStart + (ToolDia * StepOverPercent * YpassNo)
 If (YofPass >= YFinal) Then
 Exit Do
 End If
 Code "G01 Y" & YofPass
 Code "G01 X" & XStart
 
 PassType = PassType * -1
 YpassNo = YpassNo + 1
 Loop
 YofPass = YFinal
 Code "G01 Y" & YofPass
 If (PassType = 1) Then
 Code "G01 X" & XFinal
 Else
 Code "G01 X" & XStart
 End If
 
 Code "G00 Z" & SafeZ
 Code "G00 X" & XToolDown & " Y" & YToolDown
 
 Code "M30"
 CloseTeachFile
 
 Call LoadTeachFile
 End Sub
 
 Main
 Bei "Call LoadTeachFile" wird aus der "Surface"-Oberfläche in das Hauptfenster von Mach3 umgeschaltet.
 
 Weiß jemand, was man da machen kann?
 
 Gruß
 
 
 
 
- 
				Servus,
 
 auf die Schnelle habe ich das hier:
 
 https://www.machsupport.com/forum/index.php/topic,30803.msg215687.html#msg215687
 
 Reply #6 !!
 
 gefunden. Das Macro m1030.m1s schein eine Sonderrolle zu spielen !?
 Davon musste ich bis jetzt auch nichts.
 
 Gruß Tom
- 
				Danke, dann muss ich wohl alles umbenennen.
 Google hatte ich auch vor meiner Anfrage bemüht, allerdings nichts gefunden.
 
 Danke nochmals, Du bist mein Held!