Hilfe
Principles of Free Driving
Dies ist die RailKernel-Implementierung der Koploper-Methode Freies Fahren. Freies Fahren lässt eine Gruppe platzierter Züge dynamisch über die Anlage fahren. Triplets beschreiben physisch gültige Bewegungen; ein zentraler Dispatcher wählt den nächsten Zug und nutzt die vorhandene Routing- und Sicherheitslogik von RailKernel.
1. Triplets als Bausteine
Ein Triplet beschreibt eine gültige Bewegung: vorheriger Block → aktueller Block → nächster Block. Drei Blöcke legen die Richtung durch den mittleren Block eindeutig fest. Triplets werden erst über Freies Fahren → Anlage prüfen erzeugt, damit Projekte schnell geöffnet werden.
- Folgt allen physisch möglichen Wegen zwischen Blöcken.
- Beachtet Weichen, Kreuzungen und Blockrichtungen.
- Behandelt eine Drehscheibe vorläufig als Endpunkt.
- Verhindert eine Richtungsumkehr im mittleren Block.
- Erzeugt ausschließlich physisch gültige Triplets.
2. Nutzbare und ignorierte Blöcke
Nur Blöcke mit aktivierter Option Usable nehmen als Blöcke am freien Fahren teil. Ein Block ohne Rückmelder wird automatisch als nicht nutzbar markiert. Der Triplet-Generator ignoriert einen solchen Block vollständig: Er erscheint weder als A, B noch als C und erhält keine eigenen Triplets. Seine Gleise bleiben jedoch Teil des physischen Korridors zum nächsten nutzbaren Block, als wäre dort kein Block definiert. Ein Stumpfblock darf Start oder Ziel sein, jedoch niemals der mittlere Block B eines Triplets. Anlage prüfen meldet die Anzahl der ignorierten nicht nutzbaren Blöcke und der übersprungenen Stumpfblöcke.
- Usable aus: niemals A, B oder C.
- Die Gleise bleiben als Zwischenkorridor befahrbar.
- Ein Stumpfgleis wird niemals als B verwendet.
- Der Generierungsbericht zeigt die übersprungenen Anzahlen.
3. Eigenschaften eines Triplets
Standardwerte werden aus den drei beteiligten Blöcken abgeleitet. Nur ausdrückliche Änderungen des Benutzers werden im Projekt gespeichert.
- Aktiviert.
- Priorität.
- Gewicht oder Wahrscheinlichkeit.
- Höchstgeschwindigkeit.
- Minimale und maximale Zuglänge.
- Zulässige Zugtypen.
- Kommentar.
4. Speicherung, Regenerierung und veraltete Einstellungen
Triplets selbst sind abgeleitete Laufzeitobjekte und werden nicht als vollständige Objekte im Projekt gespeichert. Nur ausdrücklich vom Benutzer geänderte Triplet-Eigenschaften bleiben erhalten. Sie sind mit einem Stable Key verknüpft, der die GUIDs und befahrenen Seiten von A, B und C enthält. Beim Öffnen eines Projekts werden diese Einstellungen geladen, jedoch noch nicht geprüft, weil die aktuellen Triplets zu diesem Zeitpunkt bewusst noch nicht erzeugt wurden. Freies Fahren → Anlage prüfen erzeugt zunächst sämtliche Triplets neu und wendet anschließend gespeicherte Einstellungen auf exakt übereinstimmende Stable Keys an.
- Gültige gespeicherte Einstellungen bleiben erhalten und werden angewendet.
- Einstellungen ohne Übereinstimmung werden mit A–B–C, Seiten und Key als verwaist gemeldet.
- Nach der Meldung werden verwaiste Einstellungen aus dem Projektmodell entfernt.
- Das Projekt wird als geändert markiert; beim nächsten Speichern verschwinden die Daten aus der XML-Datei.
- Die aktuelle Geometrie und die Blockrichtungen haben immer Vorrang.
5. Wann geschieht das?
Eine gespeicherte Triplet-Einstellung wird verwaist, wenn die Bewegung, für die sie definiert wurde, nach der Regenerierung nicht mehr mit exakt demselben Stable Key existiert. Ihre Eigenschaften können dann nicht sicher wiederhergestellt werden: Sie beschrieben eine bestimmte physische Bewegung und Fahrtrichtung, nicht lediglich drei Blocknamen. RailKernel überträgt sie deshalb niemals näherungsweise auf ein anderes Triplet.
- Die geometrische Richtung von A, B oder C wurde umgekehrt, wodurch sich Einfahrt oder Ausfahrt ändert.
- Der Richtungsmodus BOTH/FORWARD_ONLY wurde geändert, wodurch eine Fahrtrichtung entfällt oder neu entsteht.
- Ein beteiligter Block wurde getrennt oder gelöscht.
- Usable wurde deaktiviert, beispielsweise weil ein Block keinen Rückmelder mehr enthält; Freies Fahren ignoriert diesen Block dann.
- Gleise, Weichen, Kreuzungen oder Verbindungen wurden geändert, wodurch sich der physische Korridor oder die Erreichbarkeit ändert.
- Ein Block wurde mit einer anderen GUID oder anderen Grenzanschlüssen neu verbunden oder erzeugt.
- Danach existiert keine exakte Übereinstimmung für A, B, C und ihre befahrenen Seiten mehr; eine automatische Übertragung könnte Eigenschaften der falschen Bewegung zuordnen.
6. Teilnehmende Züge
Der Benutzer wählt platzierte Züge aus, die am freien Fahren teilnehmen dürfen.
- Der Zug ist korrekt platziert.
- Er fährt noch nicht.
- Er ist nicht defekt, blockiert oder deadlocked.
- In der aktuellen Richtung existiert ein gültiges Triplet.
- Er erfüllt die Beschränkungen der beteiligten Blöcke und des Triplets.
7. Der Free Driving Dispatcher
Ein zentraler Dispatcher bestimmt, welcher Zug den nächsten Fahrauftrag erhält.
- Verfügbare Triplets und Blockrichtungen.
- Zug- und Blockbeschränkungen, Zuglänge und Zugtyp.
- Elektrifizierung.
- Priorität und Gewicht des Triplets.
- Vorhandene Reservierungen.
- Wartezeit seit der letzten Fahrt.
- Mögliche Konflikte und Deadlocks.
8. Das Staffelprinzip
Freies Fahren bedeutet nicht, dass eine feste Zuggruppe ununterbrochen fährt. Ein Pool enthält wartende Züge; eine einstellbare Grenze bestimmt die Zahl gleichzeitig fahrender Züge.
- Nach der Ankunft werden rückwärtige Reservierungen freigegeben.
- Der Zug kehrt ans Ende des Wartepools zurück.
- Ein anderer geeigneter Zug erhält den freien Fahrauftrag.
- Die Züge wechseln sich ab und derselbe Zug wird nicht ständig bevorzugt.
9. Auswahl der nächsten Bewegung
Der Dispatcher sucht alle gültigen Triplets ab aktueller Position und Richtung, entfernt nicht ausführbare Möglichkeiten und wählt aus dem Rest. Eine geplante Bewegung darf nur in einem Block enden, in dem der Zug laut Blockeinstellungen halten darf. Bahnhofsblöcke sind normale Halteplätze; andere Blöcke müssen ausdrücklich als Halteplatz markiert sein. Ein Not- oder Sicherheitshalt bleibt in jedem Block möglich.
- Ein benötigter Block oder Magnetartikel ist nicht verfügbar.
- Blockrichtung, Zuglänge, Zugtyp oder Elektrifizierung verbietet die Bewegung.
- Der Zielblock ist kein zulässiger Halteplatz für diesen Zug.
- Die Bewegung verursacht einen Reservierungskonflikt oder bekannten Deadlock.
- Die Auswahl berücksichtigt Priorität, Wartezeit, Gewicht oder Zufall und Abwechslung.
- Zuletzt verwendete Blöcke und ständiges Pendeln können vermieden werden.
10. Reservieren und ausführen
Die Bewegung wird atomar reserviert: Entweder werden alle benötigten Teile reserviert oder gar keiner. Scheitert ein Teil, wird der Versuch zurückgenommen und ein anderes Triplet oder ein anderer Zug versucht. Bei der Generierung werden die Korridore A → B und B → C einschließlich Gleisen und Magnetartikeln festgelegt. Die erforderliche Stellung jeder Weiche wird aus den tatsächlich befahrenen Anschlüssen ermittelt, auch wenn sich der Zug von einem Zweig nähert. Die Weiche wird deshalb immer vorher gestellt und niemals vom Zug aufgefahren.
- Blöcke A, B und C entsprechend der Bewegungsphase.
- Alle benötigten Zwischengleise.
- Magnetartikel in den Blöcken und in den Korridoren A → B und B → C.
- Die erforderliche Stellung jeder normalen, Bogen-, Dreiweg- und Doppelkreuzungsweiche.
- Optional ein nachfolgender Sicherheitsabschnitt.
- Die vorhandene Routen-, Rückmelde-, Geschwindigkeits-, Brems-, Halte- und Sicherheitslogik führt die Bewegung aus.
11. Scharfes Freigeben
Freies Fahren verwendet standardmäßig scharfes Freigeben. Block A, die Magnetartikel in A und der Korridor A → B bleiben nicht länger als nötig reserviert. Sobald ein Rückmelder in B und die bekannte Zugposition nachweisen, dass sich der vollständige Zug einschließlich seines Endes in B befindet, werden diese rückwärtigen Reservierungen atomar freigegeben. B und der Korridor B → C bleiben reserviert. Ein nachfolgender Zug kann die freigegebene Weichenstraße dadurch schnell und sicher nutzen. Können Zuglänge oder Position nicht zuverlässig bestimmt werden, gibt RailKernel vorsichtshalber noch nichts frei.
- Nicht nur die Zugspitze, sondern der vollständige Zug muss sich in B befinden.
- Zuglänge, Fahrtrichtung und geometrische Position bestimmen den Freigabezeitpunkt.
- A und A → B werden gemeinsam freigegeben.
- B und B → C bleiben geschützt.
- Im Zweifel hat Sicherheit Vorrang vor Durchsatz.
12. Ankunft im nächsten Block
Die erste Implementierung entscheidet nach jedem Triplet neu. Das ist einfach, sicher und dynamisch. Der Zug fährt weiter, wenn der Block kein zulässiger Halteplatz ist und ein weiteres sicheres Triplet verfügbar ist. Geplantes Halten und Warten findet in Bahnhofsblöcken und anderen ausdrücklich als Halteplatz markierten Blöcken statt. Später kann eine Bewegung optional mehrere Triplets verbinden.
- Der Zug hält bei Bedarf an einem zulässigen Halteplatz.
- Ein Sicherheits- oder Nothalt darf unabhängig von der Markierung immer ausgeführt werden.
- Rückwärtige Reservierungen werden freigegeben.
- Position und Richtung werden aktualisiert.
- Relevante Events und RailScripts werden ausgeführt.
- Nach einer möglichen Wartezeit ist der Zug wieder verfügbar.
13. Warten und Deadlocks
Hat ein Zug kein gültiges Triplet, wartet er und der Dispatcher versucht einen anderen Zug. Bei Änderungen an Blöcken oder Magnetartikeln wird erneut geprüft. Kann kein Teilnehmer mehr fahren, meldet der Zugmonitor DEADLOCKED.
- Die Situation prüfen.
- Einen Zug manuell bewegen oder eine Reservierung freigeben.
- Eine alternative Route suchen oder ein Triplet deaktivieren.
- Die Sitzung Freies Fahren beenden.
14. Die Rolle von RailScript
RailScript ist optional; für freies Fahren ist kein Script erforderlich. Scripts können jedoch auf Ereignisse reagieren.
- Abfahrt, Blockeinfahrt und Blockausfahrt.
- Start, Abschluss oder Abbruch einer Bewegung.
- Zughalt, Deadlock oder Not-Aus.
- Geräusche und Beleuchtung schalten, Meldungen anzeigen, Variablen ändern oder andere Scripts starten.
15. Zusammenfassung
Triplets beschreiben, was physisch möglich ist. Der Dispatcher bestimmt, welcher wartende Zug als Nächstes fährt. Das vorhandene RailKernel-Routing reserviert und fährt die Bewegung sicher aus. So entsteht Koploper-artiges freies Fahren auf Basis expliziter Geometrie, sichtbarer Triplets, prüfbarer Beschränkungen, dynamischer Reservierungen und RailScript-Events.
- Triplets beschreiben gültige Bewegungen.
- Dispatcher und Staffelprinzip sorgen für faire Abwechslung.
- Reservierungen verhindern Konflikte.
- Rückmelder bestimmen die tatsächliche Zugposition.
- Nach jeder Bewegung wird neu entschieden.
- Der Zugmonitor zeigt Warten, Fahren und Deadlocks.