Konfiguration

Hier geht es um die Entwicklung eines zukünftigen Stellwerks mit Zusi-Anschluss.
Antworten
Nachricht
Autor
Benutzeravatar
Roland Ziegler
Beiträge: 5508
Registriert: 04.11.2001 22:09:26
Wohnort: 32U 0294406 5629020
Kontaktdaten:

Konfiguration

#1 Beitrag von Roland Ziegler »

(weiterhin im Bsp beschränkt auf mech. Stellwerk, allerdings ohne die anderen Bauarten außer Betracht zu lassen)

Was ist überhaupt Konfiguration?

Das Stellwerk, so wie es konzipiert ist, wird ein Baukasten. Es enthält Stellwerkselemente, wie Weichen(hebel), Signale(hebel), Fahrstaßen(hebel) oder Blockfelder.

Die Konfiguration sagt aus, welche dieser Stellwerkselemente in einem konkreten Stellwerk vorkommen und auch wo, d.h. in welcher Beziehung ein Stellwerkselement zu anderen steht. Weiterhin sagt die Konfiguration, welchen Elemente im Stellwerk zu welchen Elementen in einer Zusi-Strecke in Beziehung stehen.

Die Stellwerkselemente sind nicht alle gleich. So ist eine Weiche durchaus auch vom stellwerksinternen Verhalten etwas anderes als ein Blockfeld, selbst wenn beide einen binären Zustand repräsentieren. Aus Sicht der Konfiguration aber sind beide Elemente zumindest in Teilen gleich (bzw polymorph). Ein solches für diesen Zweck gleiches Verhalten erreicht man in der OO-Welt durch Vererbung. Alle Stellwerkselemente werden also "Konfigurationsobjekte".

Jedes Konfigurationsobjekt erhält eine automatisch vergebene eindeutige ID.

Wie soll die Konfiguration geschehen?

Dies soll über den Stellwerkseditor erfolgen. Im Stellwerkseditor werden die benötigten Elemente ausgewählt, gesetzt, und verknüpft.

Es gibt hierbei dann Funktionen zum Setzen und Löschen dieser Elemente, und zum Setzen. Löschen und Ändern von Verknüpfungen. Verknüpfungen könnten zumindest teilweise "generisch" verarbeitet werden, also ohne Berücksichtigung konkreter Eigenschaften eines Elementtyps. Das mag sinnvoll sein, wenn es die Bedienung vereinheitlicht, aber soll nicht zum Selbstzweck werden.

(Ob und wie weit ein solcher Konfigurationsvorgang automatisierbar ist, sei dahingestellt. Auch ein (teil-)automatisierter Vorgang änderte nichts am Prinzip der Konfiguration.)

Das Ergebnis der Konfiguration wird in einer Datei gesichert. Überraschenderweise wird es sich wohl um eine XML-Datei handeln werden.

Wie entsteht aus einer Konfiguration ein lauffähiges Stellwerk?

Wenn das Stellwerk hochgefahren wird, muss es sich automatisch konfigrieren, d.h. eine vorgebene Konfiguration umsetzen, mit Leben erfüllen.

Dieses soll in drei Phasen geschehen:
  1. Der XML-File wird gelesen und verarbeitet. Da wird vermutlich ein SAX-Parser zum Einsatz kommen.
    Jedes erkannte Element wird instantiert. Der gängigste Weg der Instantiierung wird über das Factory-Pattern oder velleicht noch einfacher über Reflection (Typbearbeitung zur Laufzeit) sein. Die Verknüpfungen der Objekte sind in dieser Phase nur soweit bekannt, dass Quell- und Zielelemente identifiziert sind, so wie es auch im XML-Files abgelegt ist.
  2. Nachdem alle Objekte erzeugt wurden, aber sich noch freischwebend im Raum befinden, werden nun die Verknüpfungen aufgelöst (missverständlich, besser: Mit Leben gefüllt). Jedes Objekt erhält nun direkte Referenzen auf alle zu ihm verknüpften Objekte.

    Die Objekte werden dazu der Reihe nach aufgerufen und suchen sich aus einer zentralen Objekttabelle die Objektreferenzen ihrer eigenen Verknüpfungen. (polymorphes Verhalten).

    Die im UML-Modell gezeigten Methodenaufrufe zu verknüpften Objekten sind danach möglich. Im Sinne der OO ist jedes Objekt so autonom wie möglich, ein permanentes "Lookup" zur Laufzeit wird vermieden.
  3. In der dritten Phase wird der Anfangszustand für jedes Objekt gesetzt. Nach der Instantiierung der Objekte befindet sich das Stellwerk zunächst im Grundzustand. Das muss aber aufgrund des aktuellen Geschehens bei Zusi nicht den Tatsachen entsprechen. Deswegen werden jetzt sämtliche tatsächlichen Zustände bei Zusi abgerufen. Danach ist das Stellwerk bedienbar.

Benutzeravatar
Roland Ziegler
Beiträge: 5508
Registriert: 04.11.2001 22:09:26
Wohnort: 32U 0294406 5629020
Kontaktdaten:

#2 Beitrag von Roland Ziegler »

Neulich schrieb ich hier etwas zur Speicherung der Konfiguration als XML-File.

Zur Laufzeit des Stellwerks stellt die Konfiguration eine Sammlung von Objekten dar, mit diversen inneren Beziehungen, aber nach außen hin als klar hierarchisch gegliederte Struktur, mit einem Top-Level-Root-Objekt.

Im Idealfall entspricht die Objektstruktur zur Laufzeit im Aufbau genau der im XML-File.

Nun haben wir bei Stellwerk den Vorteil, von "Scratch" entwerfen zu können, d.h. so ziemlich alles frei zu definieren, wie es sich am einfachsten umsetzen lässt. Hier könnten wir nun postulieren, dass die Objektstruktur der Konfiguration und XML-Files direkt aufeinander abbildbar sein sollen.

Setzt man nun .Net ein - wie Ihr sicher schon gemerkt habt, mein klarer Favorit - so könnte man mit XML-Serialization arbeiten. XML-Serialization ist in der Lage, Objektstrukturen vollautomatisch zu serialisieren (Objekte in XML zu überführen) und zu deserialisieren (aus XML Objekte zu erzeugen).

XML-Serialization funktioniert nämlich auch für zwei wesentliche Assoziationen zwischen Klassen, nämlich Komposition/Aggregation und Vererbung.
Ohne auf diese Features im Detail einzugehen: Die Gestaltung der für so etwas notwendigen Serialisierungs-Klassen, wenn man sie denn zu Fuß implementieren würde, ist eine nicht ganz triviale Angelegenheit.

Mit Komposition und Vererbung aber kann man praktisch all die Hierarchien aufbauen, die mir nach bisheriger Analyse für unser Stellwerk so eingefallen sind, einschließlich der bisher noch nicht betrachteten Benutzeroberfläche.

Ich schätze mal, man könnte hier mit XML-Serialization weit über 1000 Zeilen Code und 'ne Menge Gehirnschmalz sparen, verglichen mit einem konventionellen Ansatz aus push (SAX-Parser) oder pull (.Net-XMLReader) und entsprechenden Writern.

Antworten