Fanuc Macro B: Variablen, IF, WHILE und G65 erklärt
Fanuc Custom Macro B für Zerspaner: Variablentypen, Rechnen, IF und WHILE, Makroaufrufe mit G65 und G66, Adressbuchstaben, Systemvariablen und ein vollständiger Lochkreiszyklus.
Fanuc Custom Macro B, meist kurz Macro B genannt, ist die Makrosprache der Fanuc-Steuerungen und vieler Steuerungen, die den Fanuc-Dialekt übernehmen. Diese Seite erklärt die Teile, die Sie im Alltag brauchen. Die allgemeinen Ideen hinter Variablen, Bedingungen und Schleifen stehen unter Grundlagen Programmablauf.
Auf älteren Steuerungen ist Macro B eine Option. Zeigt der Korrekturbildschirm eine Seite für Makrovariablen, ist die Funktion installiert. Die verfügbaren Variablenbereiche und einige Details hängen von der Steuerungsgeneration und den Einstellungen des Maschinenherstellers ab. Im Zweifel zuerst mit harmlosen Werten im MDI testen.
Variablen
Eine Variable wird als # mit einer Nummer geschrieben. Die Nummer bestimmt, um welche Art Variable es sich handelt.
| Nummer | Art | Verhalten |
|---|---|---|
| #0 | Immer leer | Kann gelesen, nie beschrieben werden. Dient zum Prüfen, ob eine andere Variable leer ist |
| #1 bis #33 | Lokal | Gehören zu einem Makroaufruf. Die Argumente eines G65-Aufrufs landen hier. Bei jedem Aufruf zuerst leer |
| #100 bis #199 | Gemeinsam, flüchtig | Für alle Programme gemeinsam. Werden beim Ausschalten gelöscht |
| #500 bis #999 | Gemeinsam, bleibend | Für alle Programme gemeinsam. Behalten ihren Wert nach dem Ausschalten |
| ab #1000 | System | Zugriff auf Maschinendaten: Korrekturen, Positionen, Modalzustände, Alarme, Zeitgeber |
Auf älteren oder kleineren Steuerungen ist eventuell nur ein Teil der gemeinsamen Bereiche vorhanden, zum Beispiel #100 bis #149 und #500 bis #531. Gemeinsame Variablen lassen sich auf der Makrovariablen-Seite des Korrekturbildschirms ansehen und ändern.
Leer und null
Eine leere Variable (Null-Variable) und eine Variable mit dem Wert 0 verhalten sich an einigen Stellen unterschiedlich.
| Situation | #1 leer | #1 = 0 |
|---|---|---|
G01 X50. Y#1 | Y entfällt, nur X fährt | Y fährt auf 0 |
#2=#1 | #2 wird leer | #2 wird 0 |
#2=#1+5 | #2 wird 5 (leer zählt beim Rechnen als 0) | #2 wird 5 |
IF[#1 EQ #0] | erfüllt | nicht erfüllt |
IF[#1 EQ 0] | nicht erfüllt | erfüllt |
IF[#1 GT 0] | nicht erfüllt | nicht erfüllt |
Nur EQ und NE unterscheiden zwischen leer und null. Alle anderen Vergleiche behandeln leer wie null. Ob ein Argument angegeben wurde, prüfen Sie mit einem Vergleich gegen #0.
Variablen in NC-Wörtern
Die meisten Adressen nehmen statt einer Zahl eine Variable an. Ein Minus vor dem # kehrt das Vorzeichen um.
#24=35.5
#26=12.
G01 X#24 Z-#26 F#9
G#10 X[#24+5.]Wichtige Regeln:
- Eine Rechnung in einer Adresse braucht eckige Klammern:
X[#24+5.]. - O, N und die Nummer der Satzausblendung nach / dürfen keine Variablen sein.
- Die Steuerung rundet den Wert auf die Auflösung der Adresse. Bei 0.001 mm Auflösung wird aus 12.34567 der Wert 12.346.
- Eine Variablennummer kann berechnet werden:
#[100+#1]ist die Variable mit der Nummer 100 plus dem Wert von #1.
Rechnen
Eine Zuweisung hat die Form #i=<Ausdruck>. Konstanten ohne Dezimalpunkt gelten als ganze Zahlen mit Dezimalpunkt, #1=12 ist also dasselbe wie #1=12.0.
| Operation | Beispiel | Hinweis |
|---|---|---|
| Addieren, subtrahieren | #3=#1+#2, #3=#1-#2 | |
| Multiplizieren, dividieren | #3=#1*#2, #3=#1/#2 | Division durch null hält mit Alarm an |
| Rest einer Division | #3=#1 MOD #2 | Beide Werte werden zuerst auf ganze Zahlen gerundet |
| Sinus, Cosinus, Tangens | SIN[#1], COS[#1], TAN[#1] | Winkel in Grad, 30’ = 0.5° |
| Umkehrfunktionen | ASIN[#1], ACOS[#1], ATAN[#1] | Ergebnis in Grad |
| Winkel aus zwei Werten | ATAN[#2]/[#1] | Wie ATAN2: zuerst Y-Wert, dann X-Wert |
| Quadratwurzel | SQRT[#1] | |
| Betrag | ABS[#1] | |
| Runden | ROUND[#1] | In Rechnungen auf die nächste ganze Zahl |
| Nachkommastellen abschneiden | FIX[#1] | Richtung null: 1.7 ergibt 1, −1.7 ergibt −1 |
| Aufrunden | FUP[#1] | Weg von null: 1.2 ergibt 2, −1.2 ergibt −2 |
| Potenz, Logarithmus | POW[#1,#2], LN[#1], EXP[#1] | Neuere Steuerungen |
| Bitweise Logik | AND, OR, XOR | Für PLC-Signale und Bitmuster |
Zuerst werden Funktionen berechnet, dann Multiplikation und Division, dann Addition und Subtraktion. Eckige Klammern ändern die Reihenfolge und lassen sich bis zu fünf Ebenen tief verschachteln. Runde Klammern sind Kommentare.
#5=#1+#2*SIN[#3] (ZUERST SINUS, DANN *, DANN +)
#6=[#1+#2]*SIN[#3] (ZUERST KLAMMER)Fallen bei der Genauigkeit
Die Steuerung rechnet mit Binärzahlen. Ergebnisse, die ganzzahlig sein sollten, können minimal zu klein ausfallen. FIX schneidet dann eine ganze Einheit ab. Zwei Gewohnheiten verhindern die meisten Probleme:
#3=FIX[#2+0.0001] (SICHERHEITSZUSCHLAG VOR DEM ABSCHNEIDEN)
IF[ABS[#1-#2] LT 0.001] GOTO 20 (GLEICH INNERHALB 0.001 MM)In einer NC-Adresse rundet die Steuerung auf die Auflösung der Achse. Addiert ein Programm gerundete und ungerundete Werte, steht das Werkzeug am Ende ein paar Tausendstel neben dem Startpunkt. Runden Sie jeden Wert mit ROUND, bevor Sie addieren, wenn genaue Rückfahrpositionen wichtig sind.
Sprünge und Bedingungen
GOTO
GOTO n setzt das Programm am Satz mit der Satznummer Nn fort. Die Nummer kann auch aus einer Variablen kommen: GOTO #10.
- Die N-Nummer muss am Anfang des Zielsatzes stehen.
- Jede N-Nummer darf in einem Programm nur einmal vorkommen. Bei doppelten Nummern ist das Sprungziel nicht definiert.
- Rückwärtssprünge dauern länger als Vorwärtssprünge, weil die Steuerung das Programm durchsucht. Für Wiederholungen WHILE verwenden.
IF mit GOTO
IF[#26 LE 0] GOTO 900Ist die Bedingung erfüllt, springt das Programm zu N900. Sonst läuft es mit dem nächsten Satz weiter.
IF mit THEN
IF[#11 EQ #0] THEN #11=4Ist die Bedingung erfüllt, wird die eine Makroanweisung nach THEN ausgeführt. Nach THEN darf weder eine Bewegung noch eine Liste mehrerer Anweisungen stehen.
Vergleichsoperatoren
| Operator | Bedeutung |
|---|---|
| EQ | gleich |
| NE | ungleich |
| GT | grösser als |
| GE | grösser oder gleich |
| LT | kleiner als |
| LE | kleiner oder gleich |
Bedingungen lassen sich mit AND, OR und XOR verknüpfen. Jede Einzelbedingung bekommt eigene Klammern:
IF[[#24 GT 0] AND [#24 LT 100]] GOTO 10ELSE mit Sprüngen
Macro B kennt kein ELSE. Eine Entscheidung zwischen zwei Wegen braucht zwei Sprünge:
IF[#17 GT 3.] GOTO 10
#30=200. (VORSCHUB KLEINE ZUSTELLUNG)
GOTO 20
N10 #30=140. (VORSCHUB GROSSE ZUSTELLUNG)
N20 (BEIDE FAELLE LAUFEN HIER WEITER)WHILE-Schleifen
WHILE[<Bedingung>] DO1
(ZU WIEDERHOLENDE SAETZE)
END1Solange die Bedingung erfüllt ist, wiederholen sich die Sätze zwischen DO und END. Ist sie nicht mehr erfüllt, läuft das Programm nach END weiter.
- Die Schleifennummer nach DO und END ist 1, 2 oder 3. Sie ordnet jedem DO sein END zu.
- Schleifen lassen sich drei Ebenen tief verschachteln. Die innere Schleife braucht eine andere Nummer als die äussere.
- Dieselbe Nummer darf für eine spätere Schleife wieder verwendet werden, die sich nicht überschneidet.
- Zwei Schleifen dürfen sich nicht kreuzen: Das innere END muss vor dem äusseren END stehen.
- Ein GOTO darf aus einer Schleife herausspringen, nie hinein.
- DO ohne WHILE läuft endlos. Das ist nur zusammen mit einem GOTO sinnvoll, das die Schleife verlässt.
#20=0 (ZEILENZAEHLER)
WHILE[#20 LT 3] DO1
#21=0 (SPALTENZAEHLER)
WHILE[#21 LT 5] DO2
X[#21*15.] Y[#20*10.] (AKTIVER BOHRZYKLUS BOHRT HIER)
#21=#21+1
END2
#20=#20+1
END1Das bohrt ein Raster aus 3 Zeilen und 5 Spalten mit 15 mm und 10 mm Abstand, mit einem vorher aktivierten Bohrzyklus.
Makros aufrufen
M98 oder G65
| M98 Pxxxx | G65 Pxxxx | |
|---|---|---|
| Art | Unterprogrammaufruf | Makroaufruf |
| Argumente | Nein | Ja, über Buchstaben |
| Lokale Variablen #1 bis #33 | Gemeinsam mit dem aufrufenden Programm | Neuer, leerer Satz bei jedem Aufruf |
| Weitere Befehle im selben Satz | Erlaubt, werden zuerst ausgeführt | Nicht erlaubt, Alarm |
| Halt im Einzelsatz beim Aufruf | Ja | Nein |
Beide enden mit M99, das zum Satz nach dem Aufruf zurückkehrt.
G65 mit Argumenten
G65 P9100 L1 X0 Y0 R40. H6. A15.P ist die Programmnummer, L die Anzahl Wiederholungen (Vorgabe 1). Alle anderen Buchstaben sind Argumente. Jeder Buchstabe schreibt seinen Wert in eine feste lokale Variable:
| Buchstabe | Variable | Buchstabe | Variable | Buchstabe | Variable |
|---|---|---|---|---|---|
| A | #1 | I | #4 | T | #20 |
| B | #2 | J | #5 | U | #21 |
| C | #3 | K | #6 | V | #22 |
| D | #7 | M | #13 | W | #23 |
| E | #8 | Q | #17 | X | #24 |
| F | #9 | R | #18 | Y | #25 |
| H | #11 | S | #19 | Z | #26 |
G, L, N, O und P können keine Argumente sein. Nicht angegebene Buchstaben lassen ihre Variable leer. Eine zweite Zuordnung erlaubt I, J und K bis zu zehnmal, um mehrere Punkte zu übergeben. Sie wird selten verwendet.
Schreiben Sie Argumente immer mit Dezimalpunkt. Je nach Einstellung kommt X10 ohne Punkt im Makro als 0.01 oder als 10 an, X10. dagegen immer als 10.
Modaler Aufruf mit G66
G66 P9200 Z-8. R2. F120.
G00 X20. Y10.
X50.
X80. Y30.
G67Nach G66 läuft das Makro nach jedem Satz mit Achsbewegung, mit den Argumenten aus dem G66-Satz. G67 beendet den modalen Aufruf. So entstehen eigene Zyklen nach dem Muster der Bohrzyklen.
Eigene G- und M-Codes
Über Parameter lässt sich ein G- oder M-Code mit einem Makroprogramm verknüpfen. Die Parameter 6050 bis 6059 ordnen G-Codes den Programmen O9010 bis O9019 zu. Die Parameter 6080 bis 6089 ordnen M-Codes den Programmen O9020 bis O9029 zu. Steht in 6050 der Wert 130, ruft der Satz G130 X0 Y0 R40. H6. das Programm O9010 mit diesen Argumenten auf, genau wie G65 P9010. Parameter ändert nur, wer die Maschine kennt; klären Sie es vorher mit dem Maschinenhersteller.
Makroaufrufe lassen sich je nach Steuerung vier oder fünf Ebenen tief verschachteln. Jede Ebene hat ihren eigenen Satz lokaler Variablen.
Makroprogramme schützen
Die Programme O9000 bis O9999 lassen sich mit Bit 4 (NE9) von Parameter 3202 gegen Bearbeiten schützen. Fertige Zyklen werden meist dort abgelegt, damit niemand sie versehentlich ändert.
Makrosätze und Einzelsatz
Sätze mit einer Rechnung, einem Sprung, einer Schleife oder einem Makroaufruf sind Makroanweisungen. Alle anderen Sätze sind NC-Anweisungen. Im Einzelsatzbetrieb hält die Maschine nach jeder NC-Anweisung an, durch Makroanweisungen läuft sie standardmässig ohne Halt. Mit Bit 5 (SBM) von Parameter 6000 hält die Steuerung auch nach Makroanweisungen an, was beim schrittweisen Testen eines neuen Makros hilft.
Die Steuerung liest Makroanweisungen ausserdem voraus, während die Maschine noch fährt. Eine Rechnung kann also erledigt sein, bevor die Bewegung darüber fertig ist. Muss ein Wert aus der Maschine nach einer Bewegung gelesen werden, etwa eine Position oder ein Messergebnis, muss das Lesen warten, bis die Bewegung abgeschlossen ist. Eine Verweilzeit oder ein Satz, der das Vorauslesen anhält, löst das.
Systemvariablen
Systemvariablen verbinden das Makro mit der Maschine. Die Tabellen zeigen die meistgenutzten auf Fanuc-Frässteuerungen. Einige Nummern unterscheiden sich zwischen Steuerungsgenerationen sowie zwischen Fräsen und Drehen, prüfen Sie sie deshalb an Ihrer Maschine, bevor Sie darauf schreiben.
Alarme und Meldungen
| Variable | Verwendung |
|---|---|
| #3000 | #3000=n (TEXT) hält das Programm mit einem Makroalarm an und zeigt den Text. Auf vielen Steuerungen ist die Alarmnummer 3000 plus n |
| #3006 | #3006=1 (TEXT) hält das Programm an und zeigt den Text als Meldung. NC-Start setzt fort |
IF[#18 LE 0] THEN #3000=1 (RADIUS R MUSS POSITIV SEIN)
#3006=1 (SPANNUNG PRUEFEN DANN NC-START)Der Text sollte kurz sein, auf älteren Bildschirmen passen etwa 26 Zeichen.
Zeit, Zähler und Ablaufsteuerung
| Variable | Verwendung |
|---|---|
| #3001 | Millisekunden-Zeitgeber. Beginnt beim Einschalten bei 0 und kann vom Programm auf 0 gesetzt werden |
| #3002 | Stundenzähler, der läuft, solange der Zyklusstart aktiv ist. Bleibt nach dem Ausschalten erhalten |
| #3011 | Datum als Zahl, zum Beispiel 20261013 |
| #3012 | Uhrzeit als Zahl, zum Beispiel 143005 für 14:30:05 |
| #3003 | Einzelsatz und Warten auf M/S/T-Quittung ein oder aus |
| #3004 | Vorschubhalt, Vorschub-Override und Genauhaltprüfung ein oder aus |
| #3901 | Stückzähler (gefertigte Teile) |
| #3902 | Soll-Stückzahl |
#3001=0
M98 P2000 (BEARBEITUNG)
#510=#3001/1000 (ZYKLUSZEIT IN SEKUNDEN)#3003 und #3004 schalten Bedienfunktionen wie Einzelsatz oder Vorschubhalt ab. Verwenden Sie sie nur in kurzen Abschnitten wie beim Gewindebohren und schalten Sie sie gleich danach wieder ein.
Modale Informationen
| Variable | Inhalt |
|---|---|
| #4001 bis #4030 | Aktiver G-Code jeder Gruppe. #4001 ist Gruppe 1 (G00, G01, …), #4003 Gruppe 3 (G90 oder G91), #4014 Gruppe 14 (Nullpunkt 54 bis 59) |
| #4107 | Aktive D-Nummer |
| #4109 | Aktiver Vorschub F |
| #4111 | Aktive H-Nummer |
| #4119 | Programmierte Drehzahl S |
| #4120 | Aktive Werkzeugnummer T |
Diese Werte sind nur lesbar. Typisch ist, einen Zustand am Anfang eines Makros zu sichern und am Ende wiederherzustellen:
#30=#4003 (G90 ODER G91 SICHERN)
G91
(INKREMENTELLE BEWEGUNGEN)
G#30 (WIEDERHERSTELLEN)Positionen
| Variable | Inhalt |
|---|---|
| #5001 bis #5005 | Endpunkt des letzten Satzes, Werkstückkoordinaten (Achsen 1 bis 5) |
| #5021 bis #5025 | Aktuelle Position in Maschinenkoordinaten |
| #5041 bis #5045 | Aktuelle Position in Werkstückkoordinaten |
| #5061 bis #5065 | Position, an der das Messsignal (Taster) mit G31 geschaltet hat |
Achse 1 ist meist X, Achse 2 Y, Achse 3 Z. #5003 ist also der Z-Endpunkt des letzten Satzes.
Nullpunktverschiebungen
| Variable | Nullpunkt |
|---|---|
| #5201 bis #5205 | Externe (gemeinsame) Verschiebung |
| #5221 bis #5225 | G54 |
| #5241 bis #5245 | G55 |
| #5261 bis #5265 | G56 |
| #5281 bis #5285 | G57 |
| #5301 bis #5305 | G58 |
| #5321 bis #5325 | G59 |
| #7001 bis #7005 | G54.1 P1 |
| #7021 bis #7025 | G54.1 P2, und so weiter in Schritten von 20 |
Jeder Nullpunkt beginnt 20 Nummern nach dem vorherigen. Mehr dazu, inklusive einer berechneten Adresse für G54 bis G59, steht auf der Seite Fanuc Nullpunkt-Parameter.
Werkzeugkorrekturen
Die Variablennummern hängen vom Korrekturspeicher-Typ der Steuerung ab. Auf den meisten Bearbeitungszentren mit getrennten Werten für Länge und Radius sowie für Geometrie und Verschleiss (Speichertyp C) gilt:
| Variablen | Inhalt |
|---|---|
| ab #11001 | Länge Geometrie (H) |
| ab #10001 | Länge Verschleiss (H) |
| ab #13001 | Radius Geometrie (D) |
| ab #12001 | Radius Verschleiss (D) |
Die letzten Stellen sind die Korrekturnummer: #11005 ist die Längengeometrie von H5. Steuerungen mit bis zu 200 Korrekturen akzeptieren auch die älteren Nummern ab #2001.
#1=#4120 (AKTIVES WERKZEUG)
#2=#[11000+#1] (SEINE LAENGE, WENN H-NUMMER = T-NUMMER)
IF[#2 GT 50.] GOTO 10
#3000=2 (WERKZEUG ZU KURZ)
N10Beispiel: Lochkreiszyklus mit Eingabeprüfung
Das Makro bohrt einen Lochkreis mit dem Bohrzyklus, der beim Aufruf aktiv ist. Es prüft zuerst die Eingaben und hinterlässt die Maschine im selben Zustand, in dem es sie vorgefunden hat.
O1000 (HAUPTPROGRAMM)
G90 G54 G17
T5 M06
G43 H5 Z50.
S1800 M03
G98 G81 Z-12. R2. F160 K0 (ZYKLUS SPEICHERN, KEINE BOHRUNG)
G65 P9100 X60. Y40. R35. H8. A22.5
G65 P9100 X160. Y40. R20. H4.
G80
G28 G91 Z0
M30O9100 (LOCHKREIS)
(X=#24 Y=#25 MITTELPUNKT, R=#18 RADIUS)
(H=#11 ANZAHL, A=#1 STARTWINKEL)
IF[#24 EQ #0] GOTO 900
IF[#25 EQ #0] GOTO 900
IF[#18 LE 0] GOTO 910
IF[#11 LT 1] GOTO 920
IF[#1 EQ #0] THEN #1=0
#30=#4003 (G90/G91 SICHERN)
#10=360./#11 (WINKELSCHRITT)
#12=0 (ZAEHLER)
G90
WHILE[#12 LT #11] DO1
#13=#1+#12*#10
X[#24+#18*COS[#13]] Y[#25+#18*SIN[#13]]
#12=#12+1
END1
G#30 (G90/G91 WIEDERHERSTELLEN)
M99
N900 #3000=1 (MITTELPUNKT X Y FEHLT)
N910 #3000=2 (RADIUS R FEHLT)
N920 #3000=3 (ANZAHL H FEHLT)Was passiert:
- Die ersten Prüfungen halten das Programm mit einem klaren Alarm an, wenn ein Argument fehlt. Ein leeres H hält ebenfalls bei N920 an, weil leer im LT-Vergleich als 0 zählt.
- Ein fehlender Startwinkel ist kein Fehler, er wird auf 0 gesetzt.
- Das Makro sichert G90 oder G91, schaltet auf absolut und stellt am Ende den alten Zustand wieder her.
- Jeder X/Y-Satz löst den Bohrzyklus aus, der vom Hauptprogramm her noch aktiv ist.
- Die Alarmsätze stehen nach M99 und werden nur über die Sprünge erreicht.
Tipps für die Werkstatt
- Führen Sie eine Liste aller gemeinsamen Variablen, die Sie verwenden, und was sie bedeuten. Schreiben Sie die Bedeutung als Kommentar an die Stelle im Programm, wo die Variable gesetzt wird.
- Nutzen Sie den bleibenden Bereich ab #500 nur für Werte, die das Ausschalten überstehen müssen, und sichern Sie sie mit den übrigen Maschinendaten.
- Prüfen Sie alle Argumente am Anfang eines Makros. Ein klarer Alarm kostet nichts, eine falsche Position kostet ein Teil oder eine Spindel.
- Testen Sie neue Makros mit tiefem Vorschub-Override und im Einzelsatz, bei Bedarf mit gesetztem Bit 5 von Parameter 6000, damit auch Makrosätze anhalten.
- Schreiben Sie Argumente und Konstanten mit Dezimalpunkt.
- Legen Sie fertige Zyklen im Bereich O9000 ab und schützen Sie sie.
Eine praktische Anwendung von Macro B mit Systemvariablen und etwas Geometrie zeigt die Seite Schwenkzyklus selbst gebaut.