Makroprogrammierung: Eingaben, Ergebnisse und Zustände sauber trennen
Eine Formel macht ein Programm noch nicht zu einem gut verwendbaren Baustein. Wenn dieselbe Berechnung an mehreren Stellen benötigt wird, entstehen zusätzliche Fragen: Welche Werte erwartet der Aufruf? Wo steht anschließend das Ergebnis? Was geschieht bei ungültigen Eingaben? Bleibt nach dem Aufruf eine veränderte Einstellung zurück? Dieser Artikel behandelt diese Schnittstellen. Die Grundlagen von Variablen und Positionsreihen stehen bereits im Beitrag zur Parameterprogrammierung.
Ein Makro braucht eine begrenzte Aufgabe
Eine klar begrenzte Aufgabe lässt sich leichter prüfen als ein Baustein, der gleichzeitig Positionen berechnet, Werkzeuge wechselt und mehrere Maschinenzustände verändert. Für ein eigenes Lehrmodell wählen wir deshalb ausschließlich eine Berechnung: Aus zwei geordneten X-Koordinaten sollen Mitte und Abstand ermittelt werden. Das Beispiel enthält keine Fahrbewegung, keine Messfahrt und keine Werkzeugkorrektur. Es erklärt, wie ein Aufruf verlässliche Ergebnisse bereitstellen kann.
Die Eingaben heißen x_links und x_rechts. Beide beschreiben in unserem Modell bereits festgelegte geometrische Koordinaten in Millimetern und im selben Bezugssystem. Es handelt sich nicht um unbearbeitete Messtastersignale. Die Aufgabenbeschreibung verlangt x_rechts größer als x_links. Als Ergebnisse werden die Mitte, der Abstand und eine Aussage über die Gültigkeit zurückgegeben. Diese Festlegungen sind Teil des Beispiels; andere Aufgaben dürfen andere Regeln besitzen, müssen sie aber ebenso deutlich beschreiben.
Lehrbeispiel mit zwei eindeutigen Ergebnissen
Für x_links = 18,2 mm und x_rechts = 42,6 mm ergibt sich der Abstand zu 42,6 − 18,2 = 24,4 mm. Die Mitte liegt bei 18,2 + 24,4 / 2 = 30,4 mm. Die zweite Schreibweise zeigt unmittelbar, dass von der linken Position die halbe Spanne hinzugefügt wird. Auch (18,2 + 42,6) / 2 liefert dasselbe Ergebnis. Es sind frei gewählte Lehrwerte und keine Messdaten einer realen Maschine.
Der aufrufende Programmteil darf mit diesen Ergebnissen rechnen, wenn der Aufruf erfolgreich war. Die Zahl 30,4 allein beweist dagegen nicht, dass gerade eine gültige Berechnung stattgefunden hat. Sie könnte noch aus einem früheren Aufruf stammen. Deshalb behandeln wir Ergebnis und Gültigkeitsstatus als zusammengehörig. Wie diese Information in einer konkreten CNC-Sprache gespeichert oder zurückgegeben wird, richtet sich nach deren dokumentierten Möglichkeiten.
| Schnittstellenpunkt | Vereinbarung im Lehrmodell |
|---|---|
| Eingabe 1 | Linke X-Koordinate, Millimeter, vereinbarter Bezug |
| Eingabe 2 | Rechte X-Koordinate, gleiche Einheit und gleicher Bezug |
| Vorbedingung | Beide Werte gültig; rechte Koordinate größer als linke |
| Ergebnis | Mitte und positiver Abstand |
| Fehlerfall | Kein neues gültiges Ergebnis; Fehlerstatus auswerten |
| Nebenwirkung | Keine Bewegung und keine Änderung von Maschinenmodi |
Ablauf zuerst als Pseudocode formulieren
Der folgende Pseudocode ist absichtlich keine G-Code-Schreibweise. Er beschreibt die Logik unabhängig von einer Steuerung. Die Ausgabe „ungültig“ steht für einen festgelegten Status und nicht für einen bestimmten Maschinenbefehl. Ein reales Programm müsste außerdem das vorhandene Datenformat und die Fehlerbehandlung der jeweiligen Steuerung berücksichtigen.
FUNKTION MitteUndAbstand(x_links, x_rechts):
Ergebnisstatus = ungueltig
WENN Eingaben fehlen ODER x_rechts <= x_links:
GIB Fehlerstatus zurueck
Abstand = x_rechts - x_links
Mitte = x_links + Abstand / 2
GIB gueltig, Mitte, Abstand zurueckWichtig ist die Reihenfolge: Zunächst wird verhindert, dass ein alter Erfolg stillschweigend weitergilt. Danach werden die Eingaben geprüft. Erst für einen zulässigen Fall entstehen neue Ergebnisse. Der aufrufende Teil muss den Fehlerstatus tatsächlich beachten; eine gute Prüfung im Makro hilft wenig, wenn anschließend unabhängig davon ein alter Wert verwendet wird. Das ist eine Entwurfsregel für dieses Lehrmodell, keine Behauptung über die automatische Behandlung jeder CNC-Variablen.
Das Prinzip Schritt für Schritt
Startet nur auf Wunsch. Pause hält den aktuellen Stand fest. Die Darstellung läuft in Lerngeschwindigkeit; sie simuliert keine Maschinensteuerung. Ohne Bewegung erklären Grafik und Liste denselben Inhalt.
- Der Aufruf übergibt 18,2 mm und 42,6 mm im selben Koordinatenbezug.
- Die Eingaben erfüllen die vereinbarte Reihenfolge: 42,6 ist größer als 18,2.
- Abstand: 24,4 mm. Mitte: 18,2 plus 12,2 ergibt 30,4 mm.
- Der Aufrufer erhält neue Werte zusammen mit dem gültigen Status. Ein Fehlerfall darf keinen früheren Erfolg vortäuschen.
Nicht nur den Normalfall prüfen
Eine kleine Prüftabelle sollte auch Fälle enthalten, die bewusst nicht akzeptiert werden. Vertauschte Eingaben werden in unserem Modell zurückgewiesen und nicht heimlich sortiert. Das ist sinnvoll, weil die Namen links und rechts bereits eine Bedeutung tragen. Ein automatisches Sortieren könnte einen Fehler im aufrufenden Programm verdecken. Für eine anders definierte Hilfsfunktion wäre eine Sortierung möglich, müsste aber ausdrücklich zum Vertrag gehören.
| Eingaben in mm | Erwartung im Lehrmodell |
|---|---|
| 18,2 und 42,6 | Gültig: Mitte 30,4; Abstand 24,4 |
| −5 und 7 | Gültig: Mitte 1; Abstand 12 |
| 12 und 12 | Ungültig: kein positiver Abstand |
| 42,6 und 18,2 | Ungültig: vereinbarte Reihenfolge verletzt |
| Gültiger Aufruf, danach ungültiger Aufruf | Zweiter Status ungültig; erstes Ergebnis nicht als neu verwenden |
Negative Koordinaten sind hier nicht grundsätzlich ungültig. Sie können sich aus dem gewählten Bezug ergeben. Die Prüfbedingung darf deshalb nicht aus Gewohnheit alle negativen Zahlen verbieten. Umgekehrt garantiert die korrekte Mathematik keine zulässige Werkzeugposition. Sobald berechnete Werte in Bewegungen eingehen, kommen Arbeitsraum, Werkzeug, Aufspannung und Maschinenzustand hinzu. Die Prüfung eines CNC-Programms muss den vollständigen Ablauf betrachten.
Lokale Daten und globale Ergebnisse unterscheiden
LinuxCNC 2.9 dokumentiert für O-Code-Unterprogramme mit call lokale nummerierte Parameter #1 bis #30, deren Werte beim Rücksprung im aufrufenden Kontext wiederhergestellt werden. Höhere nummerierte Parameter und globale benannte Parameter können dagegen Änderungen über den Aufruf hinaus sichtbar machen. Die ebenfalls angebotene M98/M99-Aufrufvariante besitzt andere Regeln. Deshalb sollte ein Beispiel für eine Aufrufart nicht ungeprüft auf eine andere übertragen werden.
Für die eigene Dokumentation genügt die Aussage „Variable für Ergebnis“ nicht. Benenne, wem der Speicher gehört, wann er gültig ist und wer ihn verändern darf. Ein temporärer Zwischenwert sollte nicht unbeabsichtigt als dauerhafte Ausgabe verwendet werden. Werden globale Ergebnisplätze eingesetzt, braucht es eine klare Zuordnung, damit ein späterer Hilfsaufruf die Werte nicht unbemerkt überschreibt. Die konkrete Umsetzung ist erst nach Auswahl von Steuerung und Softwarestand festzulegen.
Rücksprung stellt nicht automatisch alles wieder her
Ein Unterprogramm kann neben Daten auch modale Einstellungen beeinflussen. Beispielsweise ändert sich die Bedeutung späterer Koordinaten, wenn ein anderer Distanzmodus aktiv bleibt. LinuxCNC beschreibt mit M73 eine Möglichkeit, den dokumentierten modalen Zustand beim Verlassen eines Unterprogramms wiederherzustellen. Die Dokumentation nennt aber ausdrücklich Grenzen: Ein Programmabbruch innerhalb des Unterprogramms bewirkt diese Wiederherstellung nicht. Daraus darf keine allgemeine Zusage eines unveränderten Maschinenzustands abgeleitet werden.
In einer Schnittstellenbeschreibung sollten daher Voraussetzungen und zugesicherter Zustand nach erfolgreicher Rückkehr getrennt stehen. Der Fehler- oder Abbruchfall erhält einen eigenen Eintrag. Unser Rechenmodell vermeidet diese Schwierigkeit, weil es keine Maschinenmodi verändert. Ein später erweitertes Makro müsste neu bewertet werden. Die Unterschiede zwischen relativen und absoluten Koordinaten bleiben auch dann wichtig, wenn die Zahlen automatisch berechnet wurden.
Wiederverwendung braucht einen nachvollziehbaren Stand
Gib einem wiederverwendeten Baustein eine eindeutige Bezeichnung und einen dokumentierten Stand. Halte fest, welche Aufrufer ihn verwenden und welche Testfälle zu diesem Stand gehören. Eine Änderung an der Eingabereihenfolge kann mehrere Programme betreffen, selbst wenn die Berechnung unverändert bleibt. Gerade solche Schnittstellenänderungen sind leicht zu übersehen, weil das Makro für sich genommen weiterhin plausible Zahlen liefert.
Ein gutes Makro spart Wiederholungen und macht eine begrenzte Aufgabe überprüfbar. Sein Wert liegt nicht in möglichst vielen verschachtelten Anweisungen, sondern in klaren Eingaben, verständlicher Logik und definierten Ergebnissen. Die hier gezeigte Mitte-Abstand-Funktion bleibt bewusst eine reine Rechenhilfe. Ihre Verbindung mit einer realen CNC-Bewegung wäre ein zusätzlicher, separat zu prüfender Entwicklungsschritt.
Quellen und fachliche Einordnung
Primärquellen, geprüft am 26.10.2026. Eigene Lehrbeispiele; keine dokumentierten Maschinenversuche und keine pauschalen Schnittwertempfehlungen.