Help
RailScript (as of 12.01)
RailScript is de ingebouwde automatiseringstaal van RailKernel. De taal leest de actuele toestand van de modelbaan, wijzigt ondersteunde waarden, wacht op gebeurtenissen en start of queue opgeslagen routes zonder de routerings- en veiligheidsregels van RailKernel te omzeilen.
Wat RailScript kan
Een RailScript kan centrales, terugmelders, accessoires, seinen, blokken, treinen, locomotieven, treintypen, routes, variabelen, tellers, timers en de systeemtoestand bekijken. Scripts kunnen beslissingen nemen, op een voorwaarde wachten, handelingen herhalen, naar de scriptlog schrijven, schrijfbare attributen bedienen en een bestaande Route Move starten. Projectscripts en hun taal worden in het project opgeslagen.
De scripteditor
Elk script heeft een naam, een enabled-vlag, een taal en brontekst. Validate controleert het volledige programma zonder het uit te voeren. Run start de huidige bron en Stop annuleert de uitvoering. Wisselen tussen Engels, Nederlands en Duits vertaalt de RailScript-keywords maar behoudt objectnamen, teksten en commentaar. Tab of Ctrl+Spatie opent contextgevoelige aanvulling voor keywords, objecten en attributen.
Uitvoering en veiligheid
ALS en ZOLANG worden direct geëvalueerd. VOOR ELK doorloopt een momentopname van alle objecten in een collectie, zoals block[] of feedback[]. De lusvariabele biedt de normale namespace-attributen van dat object. WANNEER wacht zonder RailKernel te blokkeren en gaat verder zodra de voorwaarde waar wordt of de optionele TOTDAT-voorwaarde wint. De newFeedback-gebeurtenis van een trein wordt geconsumeerd door de succesvolle WANNEER die haar leest en wordt daarna weer ONWAAR. RIJD gebruikt de normale Route Move-engine en behoudt de veiligheidsregels. RUN start een ander projectscript; RUN THIS herstart het huidige script, voltooit de oude uitvoering onmiddellijk en negeert alle volgende opdrachten.
Voorbeeld: vertrek uit een station
Dit uitgebreide voorbeeld toont een volledige vertrekprocedure: een trein op het perron herkennen, stoppen, de stationstimer afwachten, de conducteursfluit laten klinken en een opgeslagen vertrekroute starten. Vervang de objectnamen en het functienummer door waarden uit uw eigen project.
-- Vertrek uit het station met een conducteursfluit
WANNEER train["Intercity 1200"].currentBlock = "Perron 1"
EN train["Intercity 1200"].placed
DOE
LOG "Intercity 1200 is aangekomen op perron 1"
ZET locomotive["NS 1200"].speed = 0
ZET timer["stationsstop"].durationMillis = 30000
ZET timer["stationsstop"].running = WAAR
WANNEER timer["stationsstop"].expired
DOE
-- Functie 3 bevat in dit voorbeeld de conducteursfluit.
ZET locomotive["NS 1200"].function[3].active = WAAR
ZET timer["fluit"].durationMillis = 1500
ZET timer["fluit"].running = WAAR
WANNEER timer["fluit"].expired
DOE
ZET locomotive["NS 1200"].function[3].active = ONWAAR
LOG "Vertreksein gegeven"
RIJD "Intercity 1200" VIA "Vertrek perron 1"
EINDE
EINDE
EINDEVolledige huidige syntax
De keywords hieronder zijn Nederlands. De editor kan ze naar Engels of Duits vertalen. Opdrachten mogen op één regel of, waar de grammatica eenduidig blijft, over meerdere regels worden verdeeld.
Commentaar
-- commentaar
// commentaar
# commentaarLokale variabelen
INT aantal = 0
STRING bericht = "Gereed"
BOOLEAN toegestaan = WAAR
aantal = aantal + 1Namespacewaarden lezen en schrijven
LOG feedback["K31"].occupied
ZET counter["vertrekken"].value = 1
ZET accessory["A.1"].position = STRAIGHT
ZET locomotive["Class 66"].speed = 64Voorwaarden en expressies
ALS feedback["K31"].occupied EN NIET block["Station"].reserved
DAN
LOG "De route mag worden voorbereid"
ANDERS
LOG "Wachten"
EINDE
-- Operatoren: + - * / = != < <= > >= EN OF NIET ( )Op een gebeurtenis wachten, eventueel met een grens
WANNEER feedback["K31"].occupied
TOTDAT timer["limiet"].expired
DOE
LOG "K31 is bezet geworden"
ANDERS
LOG "Tijdslimiet verstreken"
EINDENULL en ontbrekende runtimewaarden
ALS train["Intercity"].currentRoute != NULL
DAN
LOG "De trein heeft een actieve route"
EINDEScripts starten en synchroniseren
RUN "Geluiden stationsronde"
WANNEER !script["Geluiden stationsronde"].isRunning
DOE
LOG "Het geluidsscript is voltooid"
EINDE
-- Herstart dit script; na RUN THIS wordt niets meer uitgevoerd.
RUN THISOp iedere treinfeedback reageren
ZOLANG train["Intercity"].currentRoute != NULL
DOE
WANNEER train["Intercity"].newFeedback
DOE
ZET train["Intercity"].function[3].active = WAAR
WACHT 500
ZET train["Intercity"].function[3].active = ONWAAR
EINDE
EINDEHerhaling
INT stap = 0
ZOLANG stap < 10
DOE
stap = stap + 1
EINDECollecties en VOOR ELK
INT bezet = 0
VOOR ELK item IN block[]
DOE
ALS item.occupied
DAN
bezet = bezet + 1
LOG item.name + " is bezet"
EINDE
EINDE
LOG "Bezette blokken: " + bezetEenvoudige wachttijd
WACHT 1500
WACHT timer["vertraging"].durationMillisScriptlogging
LOG "Treinsnelheid: " + locomotive["Class 66"].speedEen opgeslagen route starten of in de wachtrij zetten
RIJD "Intercity" VIA "Stationsronde"
RIJD "Intercity" VIA "Stationsronde" WACHTRIJObjectselectoren
feedback["K31"].occupied
feedback["object-guid"].occupied
locomotive["Class 66"].function[0].nameRegels voor waarden
- Objectnamen en GUIDs worden beide als selector geaccepteerd.
- Tekst staat tussen dubbele aanhalingstekens; ondersteunde escapes zijn onder andere \n, \r, \t, \" en \\.
- Getallen mogen geheel of decimaal zijn. Lokale INT-variabelen vereisen gehele waarden.
- Booleans zijn WAAR en ONWAAR. Enumwaarden zoals STRAIGHT staan zonder aanhalingstekens.
- ZET is verplicht voor namespace-attributen; lokale variabelen worden zonder ZET toegewezen.
- Een scriptfout wordt vastgelegd in RailScript-logging en de Script Monitor.
- NULL staat voor een waarde die momenteel ontbreekt, zoals currentRoute wanneer een trein geen actieve route heeft.
- De operator ! is een compacte vorm van NIET.