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.

VergleichBedeutung
a = ba ist gleich b
a <> ba ist ungleich b
a > ba ist grösser als b
a >= ba ist grösser oder gleich b
a < ba ist kleiner als b
a <= ba 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

BausteinEinsatz in der Werkstatt
VariableMasse, Vorschübe und Zähler, die sich zwischen Teilen ändern
RechnenPositionen auf einem Lochkreis, Tiefe pro Schnitt, Drehzahl aus Schnittgeschwindigkeit
IF / ELSEAndere Werte für andere Grössen oder Werkstoffe, Prüfen von Eingaben
AlarmAnhalten mit klarer Meldung, wenn ein Wert falsch ist
WHILEWiederholen, bis eine Tiefe oder ein Mass erreicht ist
FOR / ZählerFeste Anzahl Bohrungen, Schnitte oder Teile
GOTOSprünge bei Steuerungen ohne strukturierte IF-Blöcke
UnterprogrammEigene Zyklen, die für viele Teile funktionieren

Die nächste Seite, Makros und Computercode, zeigt dieselben Bausteine in Python und in NC-Makrosyntax nebeneinander.