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!