Help
Principles of Free Driving
Dit is de RailKernel-implementatie van Koplopers methode van Vrij Rijden. Vrij Rijden laat een groep geplaatste treinen dynamisch over de baan rijden. Triplets beschrijven de fysiek geldige bewegingen; een centrale dispatcher kiest steeds welke trein aan de beurt is en gebruikt de bestaande RailKernel-routing en veiligheidscontrole.
1. Triplets als bouwstenen
Een Triplet beschrijft één geldige beweging: vorig blok → huidig blok → volgend blok. De drie blokken leggen de rijrichting door het middelste blok ondubbelzinnig vast. Triplets worden pas gegenereerd via Vrij rijden → Check Layout, zodat het openen van een project niet vertraagt.
- Volgt alle fysiek mogelijke sporen tussen blokken.
- Respecteert wissels, kruisingen en blokrichtingen.
- Behandelt een draaischijf voorlopig als een einde.
- Voorkomt omkeren binnen het middelste blok.
- Genereert uitsluitend fysiek geldige Triplets.
2. Bruikbare en genegeerde blokken
Alleen blokken met Usable ingeschakeld nemen als blok deel aan Vrij Rijden. Een blok zonder feedback wordt automatisch niet-bruikbaar gemaakt. De Triplet-generator negeert zo’n blok volledig: het verschijnt niet als A, B of C en krijgt geen eigen Triplets. De rails blijven wel onderdeel van de fysieke passage naar het volgende bruikbare blok, alsof daar geen blok was gedefinieerd. Een doodlopend blok kan een begin- of eindpunt zijn, maar nooit het middelste blok B van een Triplet. Check Layout rapporteert hoeveel niet-bruikbare en doodlopende middenblokken zijn overgeslagen.
- Usable uit: geen A, B of C.
- De rails blijven gewoon berijdbaar als tussenliggende corridor.
- Een doodlopend spoor wordt nooit als B gebruikt.
- De gebruiker ziet de aantallen in het generatierapport.
3. Eigenschappen van een Triplet
De standaardwaarden worden afgeleid van de drie betrokken blokken. Alleen expliciete aanpassingen door de gebruiker worden in het project opgeslagen.
- Enabled.
- Prioriteit.
- Gewicht of kans.
- Maximumsnelheid.
- Minimale en maximale treinlengte.
- Toegestane treintypes.
- Commentaar.
4. Opslag, regeneratie en verouderde instellingen
Triplets zelf zijn afgeleide runtime-objecten en worden niet als volledige objecten in het project opgeslagen. Alleen door de gebruiker gewijzigde Tripletproperties worden bewaard, gekoppeld aan een stable key met de GUIDs en bereden zijden van A, B en C. Bij het openen van een project worden deze instellingen geladen maar nog niet beoordeeld, omdat de actuele Triplets dan bewust nog niet zijn gegenereerd. Vrij rijden → Check Layout genereert eerst alle Triplets opnieuw en past daarna de opgeslagen instellingen toe op exact overeenkomende stable keys.
- Geldige opgeslagen instellingen blijven behouden en worden toegepast.
- Niet-passende instellingen worden als orphaned gerapporteerd met A–B–C, zijden en key.
- Na de melding worden orphaned instellingen uit het projectmodel verwijderd.
- Het project wordt als gewijzigd gemarkeerd; bij de volgende save verdwijnen deze gegevens uit de XML.
- De actuele geometrie en blokrichtingen zijn altijd leidend.
5. Wanneer gebeurt dit?
Een opgeslagen Tripletinstelling wordt orphaned wanneer de beweging waarvoor zij gold na regeneratie niet meer met exact dezelfde stable key bestaat. De properties kunnen dan niet veilig worden teruggezet: ze beschreven een specifieke fysieke beweging en rijrichting, niet alleen drie bloknamen. RailKernel koppelt ze daarom nooit bij benadering aan een andere Triplet.
- De geometrische richting van A, B of C is omgedraaid, waardoor de gebruikte ingang of uitgang verandert.
- De richtingsmodus BOTH/FORWARD_ONLY is gewijzigd, waardoor een rijrichting vervalt of ontstaat.
- Een betrokken blok is detached of verwijderd.
- Usable is uitgeschakeld, bijvoorbeeld omdat een blok geen feedback meer bevat; het blok wordt dan door Vrij Rijden genegeerd.
- Rails, wissels, kruisingen of verbindingen zijn gewijzigd, waardoor de fysieke corridor of bereikbaarheid verandert.
- Een blok is opnieuw attached of gegenereerd met een andere GUID of andere grensconnectoren.
- Door deze wijzigingen bestaat geen exacte match meer voor A, B, C en hun bereden zijden; automatisch overzetten zou properties aan de verkeerde beweging kunnen koppelen.
6. Treinen die aan Vrij Rijden deelnemen
De gebruiker kiest een verzameling geplaatste treinen die aan Vrij Rijden mogen deelnemen.
- De trein is correct op de baan geplaatst.
- De trein rijdt nog niet.
- De trein is niet defect, geblokkeerd of deadlocked.
- Er bestaat in de actuele rijrichting een geldige Triplet.
- De trein voldoet aan de beperkingen van de betrokken blokken en Triplet.
7. De Free Driving Dispatcher
Eén centrale Free Driving Dispatcher bepaalt steeds welke trein een rijbeurt krijgt.
- Beschikbare Triplets en blokrichtingen.
- Trein- en blokbeperkingen, treinlengte en treintype.
- Elektrificatie.
- Triplet-prioriteit en -gewicht.
- Bestaande reserveringen.
- Wachttijd sinds de vorige rit.
- Mogelijke conflicten en deadlocks.
8. Het estafetteprincipe
Vrij Rijden betekent niet dat een vaste groep treinen voortdurend tegelijk rijdt. Er is een pool met wachtende treinen en een instelbaar maximumaantal gelijktijdig rijdende treinen.
- Na aankomst worden achterliggende reserveringen vrijgegeven.
- De trein komt achteraan in de wachtende pool.
- Een andere geschikte trein krijgt de vrijgekomen rijbeurt.
- Treinen wisselen elkaar af en dezelfde trein krijgt niet voortdurend voorrang.
9. Keuze van de volgende beweging
De dispatcher zoekt alle geldige Triplets vanuit de actuele positie en rijrichting en verwijdert alles wat niet uitvoerbaar is. Uit de resterende Triplets wordt een keuze gemaakt. Een geplande beweging mag alleen eindigen in een blok waar de trein volgens de blokinstellingen mag stoppen. Stationsblokken zijn normale stopplaatsen; andere blokken moeten daarvoor uitdrukkelijk zijn gemarkeerd. Een nood- of veiligheidsstop blijft in ieder blok mogelijk.
- Een benodigd blok of een accessory is niet beschikbaar.
- Een blokrichting, treinlengte, treintype of elektrificatieregel verbiedt de beweging.
- Het bestemmingsblok is geen toegestane stopplaats voor deze trein.
- De beweging veroorzaakt een reserveringsconflict of bekende deadlock.
- De keuze gebruikt prioriteit, wachttijd, gewicht of willekeur en voorkeur voor variatie.
- Recent gebruikte blokken en voortdurend heen-en-weer rijden kunnen worden vermeden.
10. Reserveren en uitvoeren
De gekozen beweging wordt atomair gereserveerd: óf alle benodigde onderdelen worden gereserveerd, óf helemaal niets. Als één onderdeel niet kan worden gereserveerd, wordt de poging teruggedraaid en probeert de dispatcher een andere Triplet of trein. Bij het genereren worden de corridors A → B en B → C inclusief hun rails en accessories vastgelegd. Voor iedere wissel wordt uit de werkelijk bereden connectoren de vereiste stand bepaald, ook wanneer de trein de wissel vanaf een takspoor nadert. De wissel wordt dus altijd vooraf geschakeld en nooit door de trein opengereden.
- Blok A, B en C volgens de fase van de beweging.
- Alle benodigde tussenliggende rails.
- Accessories in de blokken en in de corridors A → B en B → C.
- De vereiste stand van iedere normale, gebogen, drieweg- en kruiswissel.
- Eventueel het daaropvolgende veiligheidsdeel.
- De bestaande route-, feedback-, snelheids-, rem-, stop- en veiligheidslogica voert de beweging uit.
11. Scherp vrijgeven
Vrij Rijden gebruikt standaard scherp vrijgeven. Blok A, de accessories in A en de corridor A → B worden niet langer vastgehouden dan noodzakelijk. Zodra een feedback in B en de bekende treinpositie aantonen dat de volledige trein, inclusief de achterzijde, in B staat, worden deze achterliggende reserveringen atomair vrijgegeven. B en de corridor B → C blijven gereserveerd. Daardoor kan een volgende trein de vrijgekomen wisselstraat snel maar veilig gebruiken. Als treinlengte of positie niet betrouwbaar kan worden bepaald, geeft RailKernel conservatief nog niets vrij.
- Niet alleen de voorkant, maar de volledige trein moet in B staan.
- Treinlengte, rijrichting en geometrische positie bepalen het vrijgavemoment.
- A en A → B worden samen vrijgegeven.
- B en B → C blijven beschermd.
- Bij twijfel prevaleert veiligheid boven doorstroming.
12. Aankomst in het volgende blok
Voor de eerste implementatie wordt na iedere Triplet opnieuw beslist. Dit is eenvoudig, veilig en dynamisch. De trein rijdt door wanneer het blok geen toegestane stopplaats is en een volgende veilige Triplet beschikbaar is. Gepland stoppen en wachten gebeurt in stationsblokken en in andere blokken die uitdrukkelijk als stopplaats zijn gemarkeerd. Later kan een beweging eventueel uit meerdere gekoppelde Triplets bestaan.
- De trein stopt op een toegestane stopplaats wanneer dat nodig is.
- Een veiligheids- of noodstop mag ongeacht de markering altijd worden uitgevoerd.
- Achterliggende reserveringen worden vrijgegeven.
- Positie en rijrichting worden bijgewerkt.
- Relevante events en RailScripts worden uitgevoerd.
- Na een eventuele wachttijd komt de trein opnieuw beschikbaar.
13. Wachten en deadlocks
Als een trein geen geldige Triplet heeft, blijft hij wachten en probeert de dispatcher een andere trein. Bij een wijziging in blokken of accessories wordt opnieuw gekeken. Als geen enkele deelnemende trein nog kan bewegen, meldt de Train Monitor DEADLOCKED.
- De gebruiker kan de situatie bekijken.
- Een trein handmatig verplaatsen of een reservering vrijgeven.
- Een alternatieve route zoeken of een Triplet uitschakelen.
- De Vrij Rijden-sessie stoppen.
14. Rol van RailScript
RailScript is aanvullend; de gebruiker hoeft geen script te schrijven om Vrij Rijden te gebruiken. Scripts kunnen wel reageren op gebeurtenissen.
- Vertrek, aankomst en verlaten van een blok.
- Starten, voltooien of afbreken van een beweging.
- Stoppen, deadlock of noodstop.
- Geluid en verlichting bedienen, meldingen tonen, variabelen wijzigen of andere scripts starten.
15. Samenvatting
Triplets beschrijven wat fysiek mogelijk is. De dispatcher bepaalt welke wachtende trein aan de beurt is. De bestaande RailKernel-routing reserveert en rijdt de beweging veilig uit. Zo ontstaat Koploper-achtig Vrij Rijden op basis van expliciete geometrie, zichtbare Triplets, controleerbare beperkingen, dynamische reserveringen en RailScript-events.
- Triplets beschrijven geldige bewegingen.
- De dispatcher en het estafetteprincipe zorgen voor een eerlijke afwisseling.
- Reserveringen voorkomen conflicten.
- Feedbacks bepalen de werkelijke treinpositie.
- Na iedere beweging wordt opnieuw beslist.
- De Train Monitor toont wachten, rijden en deadlocks.