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 deel aan Vrij Rijden. Een blok zonder feedback wordt automatisch niet-bruikbaar gemaakt. Voor de Triplet-generator is zo’n blok een harde fysieke grens: het verschijnt niet als A, B of C, krijgt geen eigen Triplets en wordt behandeld alsof op de ingang een bufferstop staat. De generator zoekt dus nooit door een niet-bruikbaar blok heen naar een volgend blok. Een werkelijk 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.
- Een niet-bruikbaar blok beëindigt ieder generatiepad als een bufferstop.
- Er worden geen Triplets door het blok heen gegenereerd.
- 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. Geometrisch scherp vrijgeven
Tijdens Check Layout maakt RailKernel voor iedere Triplet vooraf een vrijgavematrix. Voor iedere feedback in B en C wordt geometrisch berekend hoeveel millimeter deze feedback voorbij het einde van blok A en voorbij het einde van iedere accessory in A → B en B → C ligt. Tijdens het rijden wordt die afstand vergeleken met de werkelijke treinlengte achter de voorste detectie-as. Zodra een blok of accessory aantoonbaar volledig achter de trein ligt, wordt alleen dat onderdeel onmiddellijk vrijgegeven. Een volgende trein kan de vrijgekomen infrastructuur daardoor zo vroeg mogelijk veilig gebruiken.
De laatste feedback in C is bovendien een harde opruimgrens: daar worden blok A en alle accessories vóór B altijd vrijgegeven. Dit voorkomt dat een reservering door afronding, een afwijkende detectielengte of ontbrekende tussenmelding blijft hangen. De infrastructuur tussen B en C blijft beschermd zolang die nog onder de trein kan liggen. De volledige berekening is per Triplet te controleren op het tabblad Release matrix.
Check Layout bepaalt tevens welk paar aaneenliggende bruikbare blokken samen de kleinste lengte heeft. Het rapport noemt beide blokken, hun afzonderlijke lengtes en de som als maximaal veilige treinlengte voor Vrij Rijden. Dit is precies waar een geometrisch baanplan zijn waarde bewijst: RailKernel kent niet alleen de volgorde van symbolen, maar ook de werkelijke afstanden ertussen. Schematische software kan dit kunstje alleen nadoen wanneer de gebruiker ieder traject fysiek opmeet en een stapel handmatige vrijgavetabellen blijft onderhouden—een wisselsymbool weet nu eenmaal niet waar de achterkant van uw trein staat.
- Iedere feedback in B en C heeft vooraf berekende afstanden tot blok A en de accessories in A → B en B → C.
- Vrijgave gebeurt afzonderlijk zodra de volledige trein het betreffende onderdeel heeft verlaten.
- De laatste feedback in C geeft blok A en alle accessories vóór B altijd vrij.
- De Release matrix in de Triplet Editor maakt iedere beslissing controleerbaar.
- Het kortste paar aaneenliggende blokken bepaalt de gerapporteerde maximaal veilige treinlengte.
- Zonder werkelijke geometrie zijn deze afstanden alleen door handmatig meten en invoeren te verkrijgen.
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.
Wanneer een trein vanuit B naar C wil rijden en op dat moment geen veilige vervolg-Triplet B → C → D beschikbaar is, anticipeert RailKernel al vóór vertrek uit B op een mogelijke stop in C. Vanaf de eerste betrouwbare feedback in C wordt de resterende afstand tot het einde van C berekend. Met het remmodel wordt vervolgens de hoogste snelheid gekozen waarvan de remweg volledig in die afstand past; hierdoor kan de trein dus al in B langzamer gaan rijden. Past zelfs de remweg bij de laagste praktische snelheid niet, dan begint de beweging naar C niet.
Bij het raken van de ingangsfeedback van C wordt de vervolgkeuze opnieuw gecontroleerd. Is D nog steeds niet veilig beschikbaar, dan geeft RailKernel onmiddellijk een stopcommando. De baan moet technisch zo zijn ontworpen en ingesteld dat de trein vanaf die feedback binnen C tot stilstand kan komen. Zonder bruikbare remkalibratie kan RailKernel geen betrouwbaar snelheidsplafond berekenen en blijft de ingestelde bloksnelheid leidend. De verantwoordelijkheid voor een correct remmodel en voldoende fysieke remruimte blijft bij de gebruiker.
- De trein stopt op een toegestane stopplaats wanneer dat nodig is.
- Een geblokkeerd D kan de snelheid al tijdens het vertrek uit B beperken.
- De beschikbare bloklengte na de ingangsfeedback van C moet groter zijn dan de werkelijke remweg.
- Bij een nog steeds geblokkeerd vervolg begint de trein onmiddellijk bij de ingangsfeedback van C te stoppen.
- 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.