Das Programmieren von CS3-Ereignissen kann – besonders beim Betrachten des realen Ablaufs auf der Modellbahn – sehr großen Spaß bereiten. Aber insbesondere am Anfang auch großen Frust erzeugen; und ganz im Besonderen für Modellbahner, die niemals eine Programmiersprache und die logischen Strukturen der Programmierung gelernt haben.
Ein Beispiel
Es soll ein Kontaktgleis abgefragt werden. Wenn dieses Gleis besetzt ist, soll der Zug anhalten und warten, bis das Gleis wieder frei ist. Im Einstellungsfenster für das Kontaktgleis findet der Nutzer eine Einstellung namens „Warten“.
„Prima!“ denkt sich der Programmier-Neuling, hier kann ich also dem Zug sagen, dass er warten soll.
Leider falsch, denn hier spielt die starre Logik einer Programmierung dem gesunden Menschenverstand einen Streich. Das „warten“ bezieht sich nämlich nicht auf den Zug, sondern auf den Ablauf der Programmierung. Insofern würde der eigentliche Befehl, den Zug anzuhalten, schlicht fehlen.
Logisches Denken und die Wirklichkeit
Nehmen wir mal ein Beispiel aus dem täglichen Leben. Ein Paar sitzt zusammen beim Frühstück, die Kaffeekanne ist schon fast leer und der besorgte Mann fragt seine Frau, die tatsächlichen keinen Kaffee mehr möchte, „Du willst wirklich keinen Kaffee mehr?“. Wir würden nun etwas wie „Nein, danke.“ erwarten und jeder würde verstehen, was gemeint ist.
Rein logisch gesehen wären in diesem Fall aber die korrekte Antwort „Ja“! Genauer formuliert „Ja, es ist richtig, dass ich keinen Kaffee mehr möchte“. Ein „Nein, danke“ hieße ja – rein logisch – „Nein, es ist falsch, dass ich keinen Kaffee mehr möchte“.
Und genau dieses starre und logische Denken ist es, was für die Programmierung richtig und wichtig ist. Das „kleinkarierte“ Abarbeiten der einzelnen Programmschritte ist eben genau das, was ein Computer, in unserem Fall die CS3, tut.
Logisches Denken trainieren
Die einfachste Methode logisch und strukturiert zu denken, ist sich bewusst „dumm zu stellen“. Etwas konkreter auf unseren Anwendungsfall formuliert: man kann jeden einzelnen Schritt der Programmierung wie eine Anordnung für einen „sturen Befehlsempfänger“ verstehen.
Bezogen auf das eingangs genannte Beispiel heißt „warten“ eben nur „Garnichts machen bis die festgelegte Kondition eintritt“ und nicht „Aha, dann muss ich wohl den Zug anhalten“.
Die Frage, wie man logisches Denken trainieren kann, habe ich mal „dem“ Meister des logischen Denkens gestellt, nämlich der künstlichen Intelligenz „ChatGPT“. Hier einige Tipps, die sich gut auf das Programmieren mit der CS3 anwenden lassen.
Anm.: in diesem Absatz sind die nachfolgenden Texte in kursiver Schrift von ChatGPT formuliert worden.
1. „Schritt-für-Schritt-Vorgehen: Zerlege komplexe Probleme in kleinere, handhabbare Schritte. Arbeite diese systematisch ab.“
Das ist (für Anfänger der Ereignis-Programmierung glücklicherweise!) genau die Paradedisziplin der CS3 und spiegelt einen häufig gewählten Ablauf der Programmierung wider:
Ein Zug steht an einer bestimmten Stelle. Mittels eines von Hand ausgelösten Ereignisses wird überprüft, ob das nächste Kontaktgleis frei ist und der Zug wird in Fahrt gesetzt (Ereignis 1):
Damit ist für Ereignis 1 die Aufgabe erledigt.
Auf seinem Streckenverlauf (der Fahrstraße) wird der Zug von dem nächsten Kontaktgleis „in Empfang genommen“, welches bei Kontakt mit diesem Gleis ein weiteres Ereignis auslöst, das wiederum seinen weiteren Verlauf beschreibt.
In diesem sehr einfachen Beispiel das Anhalten des Zuges (Ereignis 2):
2. „Praktische Projekte: Arbeite an kleinen Projekten, um das Gelernte anzuwenden. Beginne mit einfachen Programmen und steigere die Komplexität allmählich.“
Bezogen auf die CS3-Ereignis-Programmierung heißt das, man sollte am Anfang der Programmierung nicht gleich den Betrieb des Schattenbahnhofs mit automatischer Gleisauswahl in Angriff nehmen, sondern tatsächlich mit sehr einfachen Beispielen starten.
Ein ganz wichtiger Aspekt dabei ist, dass so die kleinen Erfolgserlebnisse und der Spaß nicht in wahrsten Sinne des Wortes „auf der Strecke bleiben“.
3. Pseudocode schreiben: Schreibe Algorithmen in Pseudocode, bevor du sie in einer Programmiersprache umsetzt. Das hilft, die Logik zu klären.
Es macht sehr viel Sinn, die Abläufe der Züge nicht erst während der CS3-Ereignis-Programmierung zu planen, sondern sich vorher anhand des Gleisplans eine Abfolge zu überlegen und zu skizzieren. Dabei spielt es kaum eine Rolle, ob man das mittels Papier und Stift erledigt oder ein entsprechendes Planungsprogramm wie etwa das 3D-Modellbahn Studio nutzt.
Hier kommt übrigens auch der Begriff der Fahrstraßen zum Tragen. Fahrstraßen sind ein zentrales Konzept im Modellbahnbau, um den sicheren und reibungslosen Betrieb einer Modellbahnanlage zu gewährleisten. Sie umfassen die Planung und Verwaltung der Streckenführung durch Weichen- und Signalstellungen und spielen eine wichtige Rolle bei der Automatisierung und Sicherheit der Zugfahrten auf der Anlage.
4. Code von anderen lesen: Analysiere den Code von erfahreneren Programmierern, um verschiedene Lösungsansätze und Stile kennenzulernen.
Auch hier kann ich nur voll und ganz zustimmen und es mal so benennen: es erweitert den Horizont und kann schmerzvolle Erfahrungen verhindern.
Zunächst mal zwei unterschiedliche Lösungen des eingangs beschriebenen Beispiels. Beide Lösungen erreichen – mehr oder minder! – das Gleiche und beide werden durch Auslösen des Kontaktgleises k16 gestartet:
Lösung 1:
Beschreibung: Bei Eintreffen auf k16 wird der Zug in jedem Fall gestoppt. Dann wird darauf gewartet, dass das nächste Kontaktgleis K34 frei wird (oder frei ist), dann wird eine folgende Weiche gestellt und der Zug wieder in Fahrt versetzt.
Lösung 2:
Beschreibung: Bei Eintreffen auf k16 wird eine „Wenn.. dann… sonst…“-Abfrage als separates Ereignis ausgelöst. Dieses Ereignis („IF 1“) fragt den Frei-Status vom
Kontaktgleis K34 ab und löst in diesem Fall das Ereignis „Holzzug 2 fährt weiter“ aus, im anderen Fall (dem Besetzt-Fall) wird das Ereignis „Holzzug 2 muss warten“ aus.
„Holzzug 2 fährt weiter“ stellt die nachfolgende Weiche.
„Holzzug 2 muss warten“ hält den Zug an, wartet auf das Freiwerden von Kontaktgleis K34, löst dann „Holzzug 2 fährt weiter“ aus und versetzt den Zug wieder in Fahrt.
Vergleich der beiden Lösungen
Um es gleich vorwegzunehmen: es gibt bei diesen Lösungen kein „Falsch“ und kein „Richtig“, sondern es geht darum, von beiden Ansätzen zu lernen.
Fazit aus beiden Lösungen
Zugegeben, die beiden Lösungen stellen zwei Extreme dar. Lösung 1 würde wohl eher von einem erfahrenen, aber ungeduldigen Ereignis-Programmierer stammen und Lösung zwei wohl eher von einem gründlichen Programmier-Neuling, der schmerzhafte Erfahrungen vermeiden will.
Schlussendlich sollte jeder „seinen“ Weg finden, CS3-Ereignisse zu programmieren und die seine Präferenzen spiegeln.
Die anfänglichen Tücken der Ereignis-Programmierung
Ein echter Klassiker der anfänglichen Ereignis-Programmierung ist der Satz „Und auf einmal fährt eine ganz andere Lok an einer ganz anderen Stelle los! Woher kommt DAS denn?“.
Nun, auch das ist ein „Missverständnis des menschlichen Denkens“. Schauen wir einmal auf dieses Ereignis 3:
Dieses Ereignis wird oft wie folgt interpretiert: „Wenn die Lok BR 50 über das das Kontaktgleis TEST-KG1 fährt…“.
Das ist aber nicht „logisch“ interpretiert. Auch hier hilft wieder das sture Betrachten der Einzelschritte, denn dieses Ereignis wird IMMER ausgeführt, wenn IRGENDEIN Zug diesen Kontakt auslöst.
Rufen wir uns jetzt noch einmal die beiden Ereignisse 1 und 2 aus dem ersten Beispiel Erinnerung:
Das bedeutet, dass beim Auslösen von „TEST-KG1“ nicht nur die Lok 218 497-6 anhält (Ereignis 2), sondern auch die BR 50 losfährt (Ereignis 3).
Unterstützung durch den „CS3-Ereignis-Analyser“
Wenn die Anzahl der programmierten Ereignisse steigt, dann kann das schnell zu solchen ungewollten Effekten führen. Die CS3 hat bauartbedingt einen kleinen Bildschirm und kann komplexere Zusammenhänge nicht darstellen. Hier hilft der „CS3-Ereignis-Analyser“, ein kostenloses Werkzeug, um solche Abläufe leichter nachvollziehen zu können.
Beispielsweise können alle Ereignisse, die von einem bestimmten Kontaktgleis ausgelöst werden, gruppiert angezeigt werden.
Mehr Details dazu findet man unter https://technik-concierge.de/cs3-ereignis-analyser/.
Augenzwinkerndes Schlusswort
Wie sage ich immer so schön: Der Anblick zweier 500€-Loks, die aufeinander zurasen, erhöht die Programmier-Disziplin enorm!
Ich hoffe, dass diese Beispiele eine kleine Hilfe sind.
Viele Grüße
Matthias