Grundlagen Programmablauf: wie ein Programm entscheidet
Variablen, Bedingungen, IF/ELSE, Schleifen und Unterprogramme für Zerspaner erklärt, mit einer einfachen Fantasiesprache und unabhängig von jeder CNC-Steuerung.
Ein G-Code-Programm läuft von oben nach unten, Satz für Satz. Jeder Wert steht fest im Programm: X50, Z-12, F200. Ändert sich das Teil, muss das Programm geändert werden.
Ein Makroprogramm kann mehr. Es speichert Werte unter einem Namen, berechnet daraus neue Werte, prüft Bedingungen und springt je nach Ergebnis an eine andere Stelle im Programm. Diese Werkzeuge nennt man Programmablauf oder Kontrollfluss, weil sie steuern, in welcher Reihenfolge die Sätze abgearbeitet werden.
Diese Seite erklärt den Programmablauf mit einer Fantasiesprache, die sich wie einfaches Englisch liest. Sie läuft auf keiner Maschine. Ziel ist, zuerst die Ideen zu verstehen. Die echte Syntax der einzelnen Steuerungen folgt später in der Serie und ändert nur die Schreibweise.
Variablen
Eine Variable ist ein Speicherplatz mit einem Namen und einem Wert. Man kann sie sich wie eine beschriftete Schublade vorstellen: Auf dem Schild steht TIEFE, darin liegt die Zahl 12.
SET tiefe = 12
SET vorschub = 250
SET durchmesser = 8
Überall, wo das Programm den Wert braucht, verwendet es den Namen. Bekommt die Schublade einen neuen Wert, arbeitet jede Zeile mit dem Namen automatisch mit dem neuen Wert.
MOVE_FEED Z = -tiefe F = vorschub
Auf den meisten CNC-Steuerungen hat eine Variable statt eines Namens eine Nummer, zum Beispiel #100. Die Idee bleibt dieselbe.
Rechnen
Variablen lassen sich mit Grundrechenarten verknüpfen. Das Ergebnis landet wieder in einer Variablen.
SET radius = durchmesser / 2
SET tiefe_pro_schnitt = tiefe / 4
SET lochwinkel = 360 / anzahl_bohrungen
Eine Zeile wie SET zaehler = zaehler + 1 wirkt zuerst seltsam. Man liest sie von rechts nach links: Nimm den aktuellen Wert von zaehler, zähle 1 dazu, lege das Ergebnis wieder in zaehler ab. So zählt ein Programm.
Dazu kommen die üblichen Funktionen: Quadratwurzel, Sinus und Cosinus für Lochkreise, Runden, Betrag.
Bedingungen
Eine Bedingung ist eine Frage, die mit Ja oder Nein beantwortet wird. Sie vergleicht zwei Werte.
| Vergleich | Bedeutung |
|---|---|
| a = b | a ist gleich b |
| a <> b | a ist ungleich b |
| a > b | a ist grösser als b |
| a >= b | a ist grösser oder gleich b |
| a < b | a ist kleiner als b |
| a <= b | a ist kleiner oder gleich b |
Zwei Bedingungen lassen sich verknüpfen. AND heisst, beide müssen erfüllt sein. OR heisst, mindestens eine muss erfüllt sein.
durchmesser > 6 AND durchmesser < 12
werkzeuglaenge < 50 OR werkzeuglaenge > 250
IF und THEN: nur bei Bedarf
Die einfachste Entscheidung: Ist die Bedingung erfüllt, laufen die Zeilen zwischen IF und END IF. Sonst überspringt das Programm sie.
IF tiefe > 30 THEN
SET zustellung = 3
END IF
Tiefe Bohrungen bekommen eine Zustellung von 3 mm. Bei flachen Bohrungen ändert sich nichts.
IF, THEN und ELSE: zwischen zwei Wegen wählen
Mit ELSE macht das Programm immer eines von zwei Dingen.
IF material = STAHL THEN
SET drehzahl = 1200
ELSE
SET drehzahl = 3500
END IF
Mehr als zwei Fälle werden mit hintereinander oder ineinander gesetzten Entscheidungen gelöst:
IF durchmesser <= 6 THEN
SET vorschub = 120
ELSE IF durchmesser <= 12 THEN
SET vorschub = 180
ELSE
SET vorschub = 220
END IF
Das Programm prüft von oben nach unten und nimmt den ersten passenden Fall.
Eingaben prüfen und mit Meldung anhalten
Bedingungen sind das wichtigste Sicherheitswerkzeug in Makros. Bevor ein Zyklus die Maschine bewegt, prüft er, ob die Werte sinnvoll sind.
IF tiefe <= 0 THEN
ALARM "TIEFE MUSS POSITIV SEIN"
END IF
Ein Alarm hält die Maschine an und zeigt dem Bediener den Text. Hier anzuhalten ist viel besser, als es nach einer Kollision zu bemerken.
WHILE: wiederholen, solange eine Bedingung gilt
Eine Schleife wiederholt eine Gruppe von Zeilen. Die WHILE-Schleife prüft ihre Bedingung vor jedem Durchlauf. Sobald die Bedingung nicht mehr erfüllt ist, läuft das Programm nach END WHILE weiter.
SET aktuelle_tiefe = 0
WHILE aktuelle_tiefe < tiefe DO
SET aktuelle_tiefe = aktuelle_tiefe + zustellung
IF aktuelle_tiefe > tiefe THEN
SET aktuelle_tiefe = tiefe
END IF
MOVE_FEED Z = -aktuelle_tiefe
MOVE_RAPID Z = 2
END WHILE
Das ist ein Tieflochbohrzyklus: eine Zustellung tiefer bohren, zurückziehen, wiederholen bis zur Endtiefe. Das IF in der Schleife sorgt dafür, dass die letzte Zustellung nicht unter die Endtiefe geht.
In einer Schleife muss sich etwas ändern, das die Bedingung beeinflusst. Würde aktuelle_tiefe nie wachsen, liefe die Schleife endlos. An der Maschine heisst das: ein Programm, das nie endet, oder ein Werkzeug, das immer weiter fährt. Prüfen Sie jede Schleife darauf, bevor Sie sie laufen lassen.
FOR: eine feste Anzahl wiederholen
Ist die Anzahl Wiederholungen bekannt, liest sich eine Zählschleife einfacher. Der Zähler beginnt beim ersten Wert, steigt pro Durchlauf um eins und hört nach dem letzten Wert auf.
FOR bohrung = 1 TO 6
SET winkel = startwinkel + (bohrung - 1) * 60
SET x = mitte_x + radius * COS(winkel)
SET y = mitte_y + radius * SIN(winkel)
DRILL_AT x, y
END FOR
Sechs Bohrungen auf einem Lochkreis, alle 60° eine. Viele CNC-Steuerungen kennen keine FOR-Schleife. Dann baut man sie aus einer WHILE-Schleife und einem Zähler:
SET bohrung = 1
WHILE bohrung <= 6 DO
...
SET bohrung = bohrung + 1
END WHILE
Beide Varianten machen genau dasselbe.
GOTO: an eine Marke springen
Ältere NC-Makrosprachen haben weder END IF noch ELSE. Sie arbeiten mit Sprüngen. Eine Marke kennzeichnet eine Zeile, GOTO setzt das Programm an dieser Marke fort.
IF tiefe <= 30 THEN GOTO ohne_zustellung
SET zustellung = 3
LABEL ohne_zustellung
Das macht dasselbe wie das erste IF-Beispiel. Sprünge funktionieren, viele davon machen ein Programm aber schwer lesbar, weil man oben und unten nach den Marken suchen muss. Verwenden Sie strukturierte Schleifen und IF-Blöcke, wo die Steuerung sie anbietet, und halten Sie Sprünge kurz und einfach.
Unterprogramme mit Parametern
Ein Unterprogramm ist ein Programmteil mit eigenem Namen, der von überall aufgerufen werden kann. Parameter sind Werte, die beim Aufruf übergeben werden. Im Unterprogramm verhalten sie sich wie normale Variablen.
SUBPROGRAM lochkreis(mitte_x, mitte_y, radius, anzahl, startwinkel)
SET winkelschritt = 360 / anzahl
SET bohrung = 1
WHILE bohrung <= anzahl DO
SET winkel = startwinkel + (bohrung - 1) * winkelschritt
DRILL_AT mitte_x + radius * COS(winkel), mitte_y + radius * SIN(winkel)
SET bohrung = bohrung + 1
END WHILE
END SUBPROGRAM
CALL lochkreis(0, 0, 40, 6, 0)
CALL lochkreis(150, 0, 25, 4, 45)
Das Hauptprogramm sagt jetzt nur noch, was es will: hier ein Lochkreis, dort ein zweiter. Wie die Bohrungen berechnet werden, steht an einer einzigen Stelle. Eine Korrektur im Unterprogramm wirkt auf jeden Aufruf. Genau das ist ein eigener Zyklus auf einer CNC-Steuerung.
Lokale und gemeinsame Variablen
Eine Variable, die nur innerhalb eines Unterprogramms existiert, ist lokal. Endet das Unterprogramm, verschwindet sie, und sie kann gleichnamige Variablen an anderer Stelle nicht stören. Eine gemeinsame (globale) Variable ist überall sichtbar und behält ihren Wert zwischen den Aufrufen. Gemeinsame Variablen eignen sich für Werte, die mehrere Programme brauchen, etwa einen Stückzähler. Sie sind aber auch eine häufige Fehlerquelle, weil jedes Programm sie überschreiben kann.
Die Bausteine im Überblick
| Baustein | Einsatz in der Werkstatt |
|---|---|
| Variable | Masse, Vorschübe und Zähler, die sich zwischen Teilen ändern |
| Rechnen | Positionen auf einem Lochkreis, Tiefe pro Schnitt, Drehzahl aus Schnittgeschwindigkeit |
| IF / ELSE | Andere Werte für andere Grössen oder Werkstoffe, Prüfen von Eingaben |
| Alarm | Anhalten mit klarer Meldung, wenn ein Wert falsch ist |
| WHILE | Wiederholen, bis eine Tiefe oder ein Mass erreicht ist |
| FOR / Zähler | Feste Anzahl Bohrungen, Schnitte oder Teile |
| GOTO | Sprünge bei Steuerungen ohne strukturierte IF-Blöcke |
| Unterprogramm | Eigene Zyklen, die für viele Teile funktionieren |
Die nächste Seite, Makros und Computercode, zeigt dieselben Bausteine in Python und in NC-Makrosyntax nebeneinander.