RailScript
Volledige 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.
Ondersteunde statements
| Statement | Wat het doet |
|---|---|
TRIGGER event [, event …] | Definieer één of meer namespace-events die een gewapend script kunnen starten. |
LISTEN boolean-expression | Definieer één booleaanse namespace-expressie die een gewapend script kan starten. |
PARAMS TYPE naam [, TYPE naam …] | Declareert de invoerparameters van het script; dit staat vóór de uitvoerbare statements. |
RETURNS TYPE | Declareert welk type waarde dit script met RETURN teruggeeft. |
INT naam = expressie | Declareert een lokale variabele voor gehele getallen. STRING en BOOLEAN werken hetzelfde. |
OBJECTTYPE naam = domein["object"] | Declareert een sterk getypeerde lokale verwijzing naar één bestaand namespaceobject. |
naam = expressie | Geeft een reeds gedeclareerde lokale variabele een nieuwe waarde. |
ZET object.property = expressie | Schrijft een schrijfbaar namespace-attribuut. |
LOG expressie | Schrijft een waarde naar de RailScript-logging. |
ALS conditie DAN … ANDERS … EINDE | Voert één van twee takken uit; ANDERS is optioneel. |
WANNEER conditie TOTDAT conditie DOE … ANDERS … EINDE | Wacht op een eventconditie; TOTDAT en ANDERS zijn optioneel. |
ZOLANG conditie DOE … EINDE | Herhaalt statements zolang een conditie waar blijft. |
VOOR ELK item IN object[] DOE … EINDE | Doorloopt een momentopname van een objectcollectie. |
WACHT milliseconden | Pauzeert alleen dit script gedurende de opgegeven tijd. |
SPEEL sound | Speelt een geluid uit de Sound Manager af; het argument mag een SOUND-object zijn of een expressie die er een oplevert. |
PROMPT tekst | Pauzeert dit script en vraagt de gebruiker om bevestiging. |
PROMPT tekst, variabele | Vraagt de gebruiker om een waarde en bewaart deze in een bestaande variabele. |
RIJD trein VIA route [WACHTRIJ] | Start een opgeslagen route direct of plaatst hem in de wachtrij. |
RIJD trein NAAR blok [OPSLAANALS naam] | Genereert een route naar een bestemmingsblok en slaat hem desgewenst op. |
RUN "script" [WITH argumenten] | Start een ander ingeschakeld projectscript met optionele parameters en gaat zelf meteen verder. |
RUN THIS | Herstart dit script en voltooit de huidige uitvoering onmiddellijk. |
CALL "script" [WITH argumenten] | Start een script en wacht asynchroon op de voltooiing; een eventuele returnwaarde wordt hier genegeerd. |
TYPE resultaat = CALL "script" [WITH argumenten] | Wacht op een script en bewaart de met RETURN teruggegeven waarde. |
RETURN expressie | Beëindigt het huidige gecallde script en geeft zijn gedeclareerde waarde terug. |
RESERVE doelen VOOR trein | Reserveert blokken, accessoires of routes atomair voor een geplaatste trein. |
RELEASE doelen VOOR trein | Geeft reserveringen van een trein atomair vrij. |
SWITCH [commandStation] [PROTOCOL p] ADDRESS expressie POSITION positie | Schakelt rechtstreeks één decoderadres; standaard worden DCC en de enige aangesloten centrale gebruikt. |
TRIGGER en LISTEN
TRIGGER event [, event …] | LISTEN boolean-expression
Voorbeelden
TRIGGER feedback["K31"].onOccupied, block["Station"].onTrainEntered
LISTEN block["Station"].occupied AND train["Intercity"].speed = 0
LOG "The armed script was activated"TRIGGER accepteert een kommagescheiden lijst met events. LISTEN accepteert precies één booleaanse expressie met namespace-properties, constante waarden en logische operatoren. Beide declaraties zijn alleen toegestaan op het hoogste niveau van een script.
Als een gewapend script een passend event ontvangt, vraagt TRIGGER een uitvoering aan. LISTEN legt bij het bewapenen de actuele uitkomst als beginwaarde vast en vraagt alleen na een latere overgang van ONWAAR → WAAR een uitvoering aan. Na WAAR → ONWAAR is LISTEN opnieuw gereed.
Een normale handmatige uitvoering slaat deze declaraties over en voert de scriptbody eenmaal uit. De huidige taalimplementatie leest, valideert, formatteert en bewaart ze; automatisch bewapenen en uitvoeren via listeners wordt door de afzonderlijke activatieservice aangesloten.
Commentaar
-- commentaar | // commentaar | # commentaar
Voorbeelden
-- commentaar
// commentaar
# commentaarLokale variabelen
INT naam = expressie | STRING naam = expressie | BOOLEAN naam = expressie | naam = expressie
Voorbeelden
INT aantal = 0
STRING bericht = "Gereed"
BOOLEAN toegestaan = WAAR
aantal = aantal + 1De gebruiker om invoer vragen
PROMPT tekst [, variabele]
Voorbeelden
-- Alleen bevestiging
PROMPT "Zet de trein op het programmeerspoor"
-- Invoer opslaan in een bestaande lokale variabele
INT snelheid = 40
PROMPT "Gewenste snelheid?", snelheid
-- Of in een bestaande schrijfbare projectvariabele
PROMPT "Naam machinist?", variable["machinist"].valueOp een gebeurtenis wachten, eventueel met een grens
WANNEER conditie [TOTDAT conditie] DOE statements [ANDERS statements] EINDE
Voorbeelden
WANNEER feedback["K31"].occupied
TOTDAT timer["limiet"].expired
DOE
LOG "K31 is bezet geworden"
ANDERS
LOG "Tijdslimiet verstreken"
EINDEEenvoudige wachttijd
WACHT milliseconden
Voorbeelden
WACHT 1500
WACHT timer["vertraging"].durationMillisEen decoderadres rechtstreeks schakelen
RESERVE doelen VOOR trein | RELEASE doelen VOOR trein
Voorbeelden
-- DCC op de enige aangesloten centrale
SWITCH ADDRESS accessory["Stationssein"].address5 POSITION GREEN
-- Volledig gespecificeerde vorm
SWITCH commandStation["YaMoRC"] PROTOCOL MM ADDRESS 17 POSITION REDSterk getypeerde objectvariabelen
OBJECTTYPE naam = domein["naam of GUID"]
Voorbeelden
BLOCK station = block["Perron 1"]
TRAIN intercity = train["IC 123"]
ROUTE rit = route["Stationsronde"]
ACCESSORY wissel = accessory["W12"]
ZET station.maximumSpeed = 60
RESERVE station VOOR intercity
RIJD intercity VIA ritEen objectvariabele verwijst gedurende deze scriptuitvoering naar precies één bestaand object. De validator controleert zowel het gedeclareerde type als het type rechts van het =-teken. Beschikbare types zijn COMMANDSTATION, FEEDBACK, ACCESSORY, SIGNAL, SWITCH, BLOCK, TRAIN, WAGONGROUP, TRAINTYPE, LOCOMOTIVE, VARIABLE, ROUTE, SCRIPT, COUNTER en TIMER. De vormen COMMAND_STATION, WAGON_GROUP en TRAIN_TYPE worden eveneens geaccepteerd.
Namespacewaarden lezen en schrijven
object.property | ZET object.property = expressie
Open de RailScript-namespacereferentie
Voorbeelden
LOG feedback["K31"].occupied
ZET counter["vertrekken"].value = 1
ZET accessory["A.1"].position = STRAIGHT
ZET locomotive["Class 66"].speed = 64Voorwaarden en expressies
ALS conditie DAN statements [ANDERS statements] EINDE
Voorbeelden
ALS feedback["K31"].occupied EN NIET block["Station"].reserved
DAN
LOG "De route mag worden voorbereid"
ANDERS
LOG "Wachten"
EINDE
-- Operatoren: + - * / = != < <= > >= EN OF NIET ( )NULL en ontbrekende runtimewaarden
expressie = NULL | expressie != NULL
Voorbeelden
ALS train["Intercity"].currentRoute != NULL
DAN
LOG "De trein heeft een actieve route"
EINDEParameters en returnwaarden
PARAMS TYPE naam [, TYPE naam …] | RETURNS TYPE | RETURN expressie
Voorbeelden
-- Dit is het afzonderlijke script 'Kies stationsblok'
PARAMS BLOCK huidigBlok, TRAIN trein
RETURNS BLOCK
ZET huidigBlok.maximumSpeed = 50
RETURN huidigBlokPARAMS staat, indien gebruikt, bovenaan; RETURNS staat eveneens in de scriptkop, direct na PARAMS of anders als eerste declaratie. Beschikbare types zijn INT, STRING, BOOLEAN, EVENT en alle RailScript-objecttypes. Primitieve waarden worden gekopieerd. Objecten worden als live referentie op GUID doorgegeven en teruggegeven: een wijziging via een parameter wijzigt dus het echte projectobject. Iedere uitvoeringsroute van een script met RETURNS moet een passende RETURN bereiken.
Scripts starten met RUN en CALL
domein["naam of GUID"].property
Voorbeelden
-- RUN start het script en gaat meteen verder
RUN "Meld vertrek" WITH train["Intercity"]
-- CALL wacht en bewaart hier de BLOCK-returnwaarde
BLOCK gekozen = CALL "Kies stationsblok" WITH block["Perron 1"], train["Intercity"]
LOG gekozen.name
-- Een losse CALL mag de returnwaarde negeren
CALL "Controleer station" WITH gekozen
-- Na RUN THIS wordt niets meer uitgevoerd
RUN THISRUN is fire-and-forget: het aangeroepen script start met de meegegeven parameters en de aanroeper gaat verder. CALL wacht op RETURN zonder de gebruikersinterface te blokkeren; WAIT, WHEN en PROMPT blijven dus ook in een gecalld script asynchroon werken. CALL-ketens zijn begrensd op 32 niveaus. Lopende en wachtende scripts zijn zichtbaar in de Script Monitor en hun uitvoering staat in Script Logging; schakel daar Debug in voor logging per statement.
Waarschuwing: scripts kunnen andere scripts starten en zichzelf opnieuw starten. Onbeheerst of zeer vaak starten kan zoveel gelijktijdige uitvoeringen veroorzaken dat RailKernel of zelfs het hele systeem vastloopt. Het begrenzen en beheersbaar houden van zulke constructies is de verantwoordelijkheid van de gebruiker.
Een geluid afspelen
RUN "script" [WITH argumenten] | TYPE resultaat = CALL "script" [WITH argumenten] | CALL "script" [WITH argumenten]
Voorbeelden
-- Definieer het geluid eerst via Definiëren → Sound Manager
SPEEL sound["Stationsomroep"]SPEEL accepteert een SOUND-object of iedere expressie die een SOUND-object oplevert. RailKernel start het gekozen geluidsbestand en het script gaat meteen verder.
Op iedere treinfeedback reageren
WANNEER conditie DOE statements EINDE
Voorbeelden
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
ZOLANG conditie DOE statements EINDE
Voorbeelden
INT stap = 0
ZOLANG stap < 10
DOE
stap = stap + 1
EINDECollecties en VOOR ELK
VOOR ELK item IN object[] DOE statements EINDE
Voorbeelden
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: " + bezetScriptlogging
LOG expressie
Voorbeelden
LOG "Treinsnelheid: " + locomotive["Class 66"].speedEen opgeslagen route starten of in de wachtrij zetten
SPEEL sound["naam of GUID"]
Voorbeelden
RIJD "Intercity" VIA "Stationsronde"
RIJD "Intercity" VIA "Stationsronde" WACHTRIJEen route naar een bestemmingsblok genereren
RIJD trein VIA route [WACHTRIJ]
Voorbeelden
-- Genereer en voer een tijdelijke route uit
RIJD train["Intercity"] NAAR block["Perron 4"]
-- Sla de gegenereerde route ook op
RIJD "Intercity" NAAR "Perron 4" OPSLAANALS "Intercity naar perron 4"
-- Namen zonder spaties mogen zonder aanhalingstekens
RIJD Intercity NAAR Perron4Baanonderdelen reserveren en vrijgeven
RIJD trein NAAR blok [OPSLAANALS "routenaam"]
Voorbeelden
-- Reserveer één of meer onderdelen atomair voor een geplaatste trein
RESERVE block["Perron 1"], accessory["A.1"] VOOR train["Intercity"]
-- Een blok, accessory of complete route kan worden gereserveerd
BOOLEAN gelukt = RESERVE route["Stationsronde"] VOOR train["Intercity"]
ALS gelukt
DAN
LOG "Route gereserveerd"
EINDE
-- Geef dezelfde onderdelen vrij; RELEASE retourneert ook BOOLEAN
BOOLEAN vrijgegeven = RELEASE route["Stationsronde"] VOOR train["Intercity"]Objectselectoren
SWITCH [commandStation] [PROTOCOL protocol] ADDRESS expressie POSITION positie
Voorbeelden
feedback["K31"].occupied
feedback["object-guid"].occupied
locomotive["Class 66"].function[0].nameDe eventparameter
PARAMS EVENT event
Voorbeelden
-- In een door een objectevent gestart script vult RailKernel dit automatisch
PARAMS EVENT event
LOG event.type + " van " + event.objectType + " " + event.objectName
ALS event.trainName != NULL
DAN
LOG "Trein: " + event.trainName
EINDEDe naam van de parameter is vrij te kiezen. Met PARAMS EVENT trigger gebruikt hetzelfde script bijvoorbeeld trigger.type en trigger.objectName. De bestaande impliciete event.*-waarden blijven beschikbaar voor oudere scripts.
Regels 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.
- PROMPT accepteert BOOLEAN-, STRING- en INT-variabelen. BOOLEAN gebruikt een WAAR/ONWAAR-keuzelijst; INT accepteert alleen gehele getallen. Annuleren van de dialoog annuleert het wachtende script.