seit 2005 plane ich, eine Stellwerksimulation zu programmieren. In der Zwischenzeit gab es ettliche Anläufe, die aber immer relativ schnell wieder eingestellt wurden. Im September 2011 startete ich einen neuen Anlauf - jetzt auf Basis von C++ und QT. Beides hat sich bewährt, so dass ich jetzt in den letzten Wochen und Monaten gut vorangekommen bin. Daher möchte ich das Projekt schon mal kurz vorstellen.
Gleich im Voraus: Was ich jetzt beschreibe, funktioniert im Groben schon. Es mangelt momentan aber vorallem an den vielen kleinen Details. Daher gibt es momentan noch keine öffentlich verfügbare Testversion - bis dahin müssen noch einige Sachen fertiggestellt werden. Wichtig aber ist: Das Grundkonzept ist aufgegangen - was mich selbst etwas verblüfft, ich hätte mit wesentlich mehr Problemen gerechnet als es letztendlich dann waren.
Das Vorbild für die Stellwerksimulation ist letztendlich Zusi. Ziel war es ein möglichst flexibles System zu entwerfen, das sich möglichst stark am Vorbild orientiert. Flexibilität bedeutet bei mir, dass der Simulator nur sehr wenige Funktionen des Stellwerks fest einprogrammiert hat. Die Stellwerkslogik ist damit für jeden frei zugänglich - und genau das ist Sinn der Sache. Der Simulator simuliert eben nicht eine konkrete Bauform, sondern soll im Endzustand nahezu alles simulieren können, was es so in der Realität gibt. "Nahezu" deswegen, weil das Bedienkonzept von den meisten ESTWs sich doch so stark unterscheidet, dass der Simulator darauf nicht ausgelegt ist.
Das Programm ist grundlegend gesagt momentan dreigeteilt. Es gibt die Ebene Außenanlage, die Ebene Relaisanlage sowie die Ebene Stelltisch. Die Außenanlage ist dabei sozusagen "Server" für die Relaisanlage, die Relaisanlage wiederum Server für den Stelltisch. Dabei können sich mehrere Stelltische auf eine Relaisanlage verbinden, aber auch mehrere Relaisanlagen auf eine Außenanlage - genauso kann sich aber auch ein Stelltisch auf mehrere Relaisanlagen verbinden.
Konkret könnte man so zum Beispiel eine Art "Bereichsübersicht" für große Relaisstellwerke erstellen, die dann zwar nicht mehr vorbildgerecht ist, aber die am Bildschirm nötige Übersicht über das Stellwerk bietet. Alle drei Bestandteile kommunizieren ausschließlich über eine standardisierte Klasse miteinander - das bietet einen Ansatzpunkt um mit geringem Aufwand Netzwerkfunktionen zu implementieren.
Die Stellwerkslogik wird dabei über Textdateien definiert. Über ein XML-Format werden zum Beispiel Tischfelder definiert. Einfache Aufgaben (z.B. eine gedrückte Taste) werden dabei ebenfalls direkt auf Tischfeldebene in Form von XML definiert. Grafiken können in den Formaten png und svg eingebunden werden, wobei bei gezeichneten Tischfeldern svg zu bevorzugen ist, da der Stelltisch hier problemlos ohne Entstehen von hässlichen Pixeln skaliert werden kann.
Bei den komplexen Aufgaben - verfügbar nur auf Relaisanlagenebene - hat man die Wahl zwischen derselben XML-Syntax wie auf Tischfeldebene, oder einer Skriptsprache. Bei der Skriptsprache handelt es sich um ECMA-Skript - den Namen wird kaum jemand kennen, aber ECMA ist quasi die Basis von JavaScript.
Diese beiden Aufgaben - also das Erstellen von Tischfeldern, aber auch die Definition von Relaisgruppen in ECMA-Skript sind natürlich eine Sache in die man sich Einarbeiten muss. Während bei mechanischen und elektromechanischen Stellwerken der Aufwand relativ überschaubar ist, haben meine Versuche mit einer Art Spurplanstellwerk (angelehnt ans SpDrS60, bietet aber nur ein paar Grundfunktionen und verhält sich auch noch ziemlich anders als ein reales S60) gezeigt dass man hier für einzelne Relaisgruppen durchaus mit einer Quelltextlänge von mehrere hundert Zeilen oder mehr rechnen muss.
Tischfelder bieten dabei die Möglichkeit der Parametrisierbarkeit an. Konkret heißt das, dass über XML-Tags Parameter definiert werden, die dann vom Benutzer über einen graphischen Editor ausgefüllt werden. Momentan können hier Texte, Zahlen sowie Relaisgruppenverknüpfungen eingegeben werden. Künftig wird das aber deutlich erweitert werden, so dass dann z.B. auch ein Farbwähler etc. zur Verfügung stehen werden.
Zu gegebener Zeit wird es eine Dokumentation sowie eine Art Tutorial dazu geben.
Kommen wir aber mal zu den Editoren:
Die Flexibilität hat leider einen Preis: Für größtmögliche Flexibilität gibt es die Aufteilung Außenanlage - Relaisanlage - Stelltisch, und daher gibt es auch drei Editoren. Momentan ist es so, dass man leider auch alles drei einzeln bauen muss. In fernerer Zukunft wird es hier möglicherweise Automatisierungen geben, aber das ist nihct ganz so einfach wie man auf den ersten Blick vielleicht denkt. Letztendlich ist mit etwas Übung der Aufwand aber gar nicht mal so groß, auch wenn es ein nerviges Geklicke ist.
Erstmal allgemein: Ein reales Stellwerk fährt man normal auch nicht in die Fabrik zum Umbauen, sondern baut es vor Ort und häufig im laufenden Betrieb um. Der Stellwerksimulator handhabt das genauso - es gibt keinen separaten Editor, Umbauten können also im laufenden Betrieb gemacht werden. Das funktioniert eigentlich ganz gut, solange man etwas aufpasst was man macht und dem Zug nicht gleich im Außenanlageneditor die "Gleise unter den Rädern" wegbaut. Generell muss aber der, der die Skripte schreibt, sich aber natürlich bewusst sein dass der Umbau im laufenden Betrieb geschieht und das mit berücksichtigen. Meinen ersten Erfahrungen im Skriptschreiben nach scheint das aber kein allzu großes Problem zu sein - ob das wirklich stimmt, wird man noch sehen müssen.
Generell: Mit einem vollständigen Satz an Tischfeldern sowie Relaisgruppen kann man ein Stellwerk (fast) komplett über die graphische Oberfläche bauen - man muss also hier nicht den Texteditor bemühen. Alles was auf den folgenden Screenshots zu sehen ist ist mit der Maus aus den Bausteinen, die am Rand zu sehen sind, zusammengeklickt.
Fangen wir an mit dem Kernstück, dem Stelltisch:

Was mit meinem Teststellwerk schon geht ist wie man sieht das Einstellen von Fahrstraßen, das Umstellen/Sperren/Entsperren von Weichen, das Auflösen von Fahrstraßen und Umfahrzugstraßen. Was noch nicht geht ist eine automatische Fahrstraßenwahl - momentan ist es mehr oder weniger Zufall was bei verschiedenen Fahrwegmöglichkeiten rauskommt - kritisch sind hier die Weichen 1 bis 4, von alleine fährt der Simulator momentan bevorugt alle vier Weichen abzweigend wenn er kann :-)
Nun zum Relaisanlageneditor:

Hier sehen wir momentan die Variante für Spurplanstellwerke - per Mausklick werden hier die einzelnen Relaisgruppen miteinander verbunden. Als Symbolik verwende ich hier die Symbole aus dem SpDrS60-Technikbuch - und ja, ich weiß dass die Hauptsignalgruppe ein falsches Symbol hat :-) Alle diese Gruppen sind in Form von ECMA-Skript mit noch ein paar XML-Tags definiert.
Nun zum Aussenanlageneditor:

Das ist der einzige Teil wo der größte Teil der Logik fest einprogrammiert ist. Das einzige was flexibel definierbar ist ist das Element "Signal". Über eine XML-Datei wird definiert, welche Lichtpunkte das Signal ist, und über weitere Tags wird als "Signalbuch" definiert was für eine Bedeutung welche Lichtpunktkombination hat. Vom Stellwerk kommt hier wirklich nur die Information "Lichtpunkt xy an" bzw. "Lichtpunkt xy aus", an das Stellwerk gehen Meldungen welcher Lichtpunkt brennt, welcher dunkel ist - und zukünftig welcher einen defekten Hauptfaden hat.
Für die Zukunft angedacht ist außerdem eine frei definierbare graphische Darstellung des Signalbildes, das hat aber keine hohe Priorität.
Wie geht es nun weiter - ich habe hier noch eine Liste von diversen kleineren und größeren Sachen die noch erledigt werden müssen, bevor es eine erste öffentliche Testversion gibt. Dazu gehören noch Detailerweiterungen im Editor, denn man kann fast alles per Mausklick machen - nur keine neuen Stelltische/Relaisanlagen/Außenanlagen anlegen sowie Bibliotheken laden. Ebenso muss man ANschaltgruppen (wem das was sagt) noch mit dem Texteditor einbinden. Im Bereich der Anschaltgruppen mangelt es noch an einigem - so gibt es bisher nur die sternförmige Informationsverteilung von der Anschaltgruppe an alle anderen Gruppen sowie (stark eingeschränkt) von den Gruppen zur Anschaltgruppe. Ebenso wird man für mechanische/elektromechanische und diverse Relaisstellwerke einen bedienbaren Verschlussplaneditor brauchen, der bisher noch nicht existiert. Die Fehlersuche fand bisher ebenfalls nur sehr rudimentär statt.
Momentan ist die Entwicklung auch wieder gebremst - ich bin mitten im Semester, da bleibt nur noch relativ wenig Zeit zum weiterprogrammieren. Daher gibt es momentan nur kleinere Fortschritte zu vermelden - in der Geschwindigkeit wie bisher wird die Entwicklung definitiv nicht weiterlaufen. In den nächsten Monaten wird es dann eine öffentliche Demo geben, die noch nicht als Alpha- oder Betatest gedacht ist, sondern als Möglichkeit grundlegende Verbesserungsvorschläge anzubringen. Gleichzeitig werde ich für Interessierte Möglichkeiten schaffen sich mit der Entwicklung von Tischfeldern und Relaisgruppen auseinanderzusetzen - hier hoffe ich auf Mithilfe, da ich mich vorerst auf die Entwicklung des Programms konzentrieren möchte.
Zum Programm selber: Das Programm selber wird defintiv Closed Source. Ob es Geld kosten wird oder nicht ist noch nicht entschieden, es wird allerdings wenn dann ein realistischer Preis sein. Hier werde ich mich wenn dann an Zusi orientieren - und an Zusi orientieren heißt in dem Fall, dass ein Programm in dem deutlich weniger Aufwand als in Zusi steckt auch deutlich weniger kosten sollte.
Eine Anbindung an Zusi ist angedacht, allerdings kann ich solange es keine Dokumentation über die Stellwerksschnittstelle gibt auch nicht sagen ob die Anbindung an Zusi mit vertretbarem Aufwand möglich sein wird. Entwickelt wird das Programm daher momentan als eigenständige Stellwerkssimulation, alles weitere muss man sehen.
Und jetzt noch eine Bitte um Mithilfe: Ich brauche noch einen Namen für das Programm. Dabei ist wichtig dass keine Verwechslungsgefahr mit existierenden Programmen besteht. Problematisch ist in der Hinsicht vorallem STS/StellwerkSim von js-home.org. Hier ist jetzt also Kreativität gefragt - wer eine Idee hat, bitte schreibt mir eine persönliche Nachricht (persönliche Nachricht deswegen, damit mir nicht jemand die Domain vor der Nase wegschnappt

(und ich fürchte auch hier Zusi als Vorbild zu nehmen ist keine gute Idee - "StSi" klingt doof :-) )