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 am freien Fahren teil. Ein Block ohne Rückmelder wird automatisch als nicht nutzbar markiert. Für den Triplet-Generator ist ein solcher Block eine feste physische Grenze: Er erscheint weder als A, B noch als C, erhält keine eigenen Triplets und wird so behandelt, als stünde an seiner Einfahrt ein Prellbock. Der Generator sucht deshalb niemals durch einen nicht nutzbaren Block hindurch nach einem späteren Block. Ein echtes Stumpfgleis 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.
  • Ein nicht nutzbarer Block beendet jeden Generierungspfad wie ein Prellbock.
  • Durch diesen Block werden keine Triplets erzeugt.
  • 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. Geometrisch scharfes Freigeben

Während Anlage prüfen erzeugt RailKernel für jedes Triplet im Voraus eine Freigabematrix. Für jeden Rückmelder in B und C wird geometrisch berechnet, wie viele Millimeter er hinter dem Ende von Block A sowie hinter dem Ende jedes Magnetartikels in A → B und B → C liegt. Während der Fahrt wird dieser Abstand mit der tatsächlichen Zuglänge hinter der führenden Meldeachse verglichen. Sobald ein Block oder Magnetartikel nachweislich vollständig hinter dem Zug liegt, wird genau diese Ressource sofort freigegeben. Nachfolgende Züge können die geräumte Infrastruktur dadurch zum frühestmöglichen sicheren Zeitpunkt nutzen.

Der letzte Rückmelder in C ist zusätzlich eine feste Aufräumgrenze: Dort werden Block A und alle Magnetartikel vor B immer freigegeben. Damit kann keine Reservierung wegen Rundung, ungewöhnlicher Meldelänge oder eines fehlenden Zwischenereignisses hängen bleiben. Die Infrastruktur zwischen B und C bleibt geschützt, solange sie noch unter dem Zug liegen könnte. Die vollständige Berechnung ist für jedes Triplet im Register Release matrix einsehbar.

Anlage prüfen ermittelt außerdem das benachbarte Paar nutzbarer Blöcke mit der kleinsten Gesamtlänge. Der Bericht nennt beide Blöcke, zeigt ihre Einzellängen und weist ihre Summe als maximal sichere Zuglänge für Freies Fahren aus. Hier zeigt ein geometrischer Gleisplan seinen Wert: RailKernel kennt nicht nur die Reihenfolge von Symbolen, sondern die wirklichen Abstände dazwischen. Schematische Software kann dies nur nachahmen, wenn der Benutzer jede Strecke physisch vermisst und Stapel manueller Freigabetabellen pflegt—ein Weichensymbol weiß nun einmal nicht, wo sich das Zugende befindet.

  • Für jeden Rückmelder in B und C sind Abstände zu Block A und den Magnetartikeln in A → B und B → C vorberechnet.
  • Jede Ressource wird einzeln freigegeben, sobald der vollständige Zug sie verlassen hat.
  • Der letzte Rückmelder in C gibt Block A und alle Magnetartikel vor B immer frei.
  • Die Release matrix im Triplet-Editor macht jede Entscheidung prüfbar.
  • Das kürzeste benachbarte Blockpaar bestimmt die gemeldete maximal sichere Zuglänge.
  • Ohne echte Geometrie müssen diese Abstände manuell gemessen und eingegeben werden.

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.

Wenn ein Zug von B nach C fahren soll und zu diesem Zeitpunkt kein sicheres Anschluss-Triplet B → C → D verfügbar ist, berücksichtigt RailKernel bereits vor der Abfahrt aus B einen möglichen Halt in C. Es berechnet die verbleibende Strecke vom ersten zuverlässigen Rückmelder in C bis zum Ende von C. Das Bremsmodell wählt anschließend die höchste Geschwindigkeit, deren vollständiger Bremsweg in diese Strecke passt; der Zug kann daher bereits in B langsamer fahren. Passt selbst der Bremsweg bei der niedrigsten praktikablen Geschwindigkeit nicht, wird die Fahrt nach C nicht begonnen.

Beim Erreichen des Einfahrmelders in C wird die Weiterfahrt erneut geprüft. Ist D weiterhin nicht sicher verfügbar, sendet RailKernel sofort einen Stoppbefehl. Die Anlage muss technisch so aufgebaut und eingestellt sein, dass der Zug ab diesem Rückmelder vollständig innerhalb von C anhalten kann. Ohne brauchbare Bremskalibrierung kann RailKernel keine verlässliche Geschwindigkeitsgrenze berechnen; dann bleibt die eingestellte Blockgeschwindigkeit maßgeblich. Für ein korrektes Bremsmodell und ausreichenden physischen Bremsweg bleibt der Benutzer verantwortlich.

  • Der Zug hält bei Bedarf an einem zulässigen Halteplatz.
  • Ein blockiertes D kann die Geschwindigkeit bereits bei der Abfahrt aus B begrenzen.
  • Die verfügbare Blocklänge hinter dem Einfahrmelder in C muss größer als der tatsächliche Bremsweg sein.
  • Bleibt die Weiterfahrt blockiert, beginnt der Zug sofort am Einfahrmelder in C anzuhalten.
  • 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.