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
EINDE

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.

Commentaar

-- commentaar
// commentaar
# commentaar

Lokale variabelen

INT aantal = 0
STRING bericht = "Gereed"
BOOLEAN toegestaan = WAAR
aantal = aantal + 1

Namespacewaarden lezen en schrijven

LOG feedback["K31"].occupied
ZET counter["vertrekken"].value = 1
ZET accessory["A.1"].position = STRAIGHT
ZET locomotive["Class 66"].speed = 64

Voorwaarden 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"
EINDE

NULL en ontbrekende runtimewaarden

ALS train["Intercity"].currentRoute != NULL
DAN
    LOG "De trein heeft een actieve route"
EINDE

Scripts 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 THIS

Op 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
EINDE

Herhaling

INT stap = 0
ZOLANG stap < 10
DOE
    stap = stap + 1
EINDE

Collecties 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: " + bezet

Eenvoudige wachttijd

WACHT 1500
WACHT timer["vertraging"].durationMillis

Scriptlogging

LOG "Treinsnelheid: " + locomotive["Class 66"].speed

Een opgeslagen route starten of in de wachtrij zetten

RIJD "Intercity" VIA "Stationsronde"
RIJD "Intercity" VIA "Stationsronde" WACHTRIJ

Objectselectoren

feedback["K31"].occupied
feedback["object-guid"].occupied
locomotive["Class 66"].function[0].name

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.