RailScript

Vollständige aktuelle Syntax

Die Schlüsselwörter werden auf Deutsch gezeigt. Der Editor kann sie ins Englische oder Niederländische übersetzen. Anweisungen dürfen in einer Zeile oder, sofern die Grammatik eindeutig bleibt, über mehrere Zeilen geschrieben werden.

Unterstützte Anweisungen

AnweisungFunktion
PARAMS TYP name [, TYP name …]Deklariert die Eingabeparameter des Scripts vor den ausführbaren Anweisungen.
RETURNS TYPDeklariert den Typ des Wertes, den dieses Script mit RETURN zurückgibt.
INT name = ausdruckDeklariert eine lokale Ganzzahlvariable. STRING und BOOLEAN funktionieren ebenso.
OBJEKTTYP name = domäne["Objekt"]Deklariert einen stark typisierten lokalen Verweis auf ein vorhandenes Namensraumobjekt.
name = ausdruckWeist einer bereits deklarierten lokalen Variable einen neuen Wert zu.
SETZE objekt.eigenschaft = ausdruckSchreibt eine beschreibbare Namensraumeigenschaft.
LOG ausdruckSchreibt einen Wert in das RailScript-Protokoll.
WENN bedingung DANN … SONST … ENDEFührt einen von zwei Zweigen aus; SONST ist optional.
SOBALD bedingung BIS bedingung TUE … SONST … ENDEWartet auf eine Ereignisbedingung; BIS und SONST sind optional.
SOLANGE bedingung TUE … ENDEWiederholt Anweisungen, solange eine Bedingung wahr bleibt.
FÜR JEDEN item IN objekt[] TUE … ENDEDurchläuft eine Momentaufnahme einer Objektsammlung.
WARTE millisekundenPausiert nur dieses Script für die angegebene Dauer.
PROMPT textPausiert dieses Script und bittet den Benutzer um Bestätigung.
PROMPT text, variableFragt einen Wert ab und speichert ihn in einer vorhandenen Variable.
FAHRE zug MIT route [EINREIHEN]Startet eine gespeicherte Route sofort oder reiht sie ein.
FAHRE zug NACH block [SPEICHEREALS name]Erzeugt eine Route zu einem Zielblock und speichert sie optional.
RUN "script" [WITH argumente]Startet ein anderes aktiviertes Projektscript mit optionalen Parametern und läuft sofort weiter.
RUN THISStartet dieses Script neu und beendet die aktuelle Ausführung sofort.
CALL "script" [WITH argumente]Startet ein Script und wartet asynchron auf dessen Abschluss; ein Rückgabewert wird hier ignoriert.
TYP ergebnis = CALL "script" [WITH argumente]Wartet auf ein Script und speichert den mit RETURN gelieferten Wert.
RETURN ausdruckBeendet das aktuell aufgerufene Script und gibt seinen deklarierten Wert zurück.
RESERVE ziele FÜR zugReserviert Blöcke, Magnetartikel oder Routen atomar für einen platzierten Zug.
RELEASE ziele FÜR zugGibt die Reservierungen eines Zuges atomar frei.
SWITCH [commandStation] [PROTOCOL p] ADDRESS ausdruck POSITION positionSchaltet direkt eine Decoderadresse; standardmäßig gelten DCC und die einzige verbundene Zentrale.

Kommentare

-- Kommentar | // Kommentar | # Kommentar

Beispiele

-- Kommentar
// Kommentar
# Kommentar

Lokale Variablen

INT name = ausdruck | STRING name = ausdruck | BOOLEAN name = ausdruck | name = ausdruck

Beispiele

INT anzahl = 0
STRING meldung = "Bereit"
BOOLEAN erlaubt = WAHR
anzahl = anzahl + 1

Benutzereingabe anfordern

PROMPT text [, variable]

Beispiele

-- Nur Bestätigung
PROMPT "Stellen Sie den Zug auf das Programmiergleis"

-- Eingabe in einer vorhandenen lokalen Variable speichern
INT geschwindigkeit = 40
PROMPT "Gewünschte Geschwindigkeit?", geschwindigkeit

-- Oder in einer vorhandenen schreibbaren Projektvariable
PROMPT "Name des Lokführers?", variable["Lokführer"].value

Auf ein Ereignis warten, optional mit Begrenzung

SOBALD bedingung [BIS bedingung] TUE anweisungen [SONST anweisungen] ENDE

Beispiele

SOBALD feedback["K31"].occupied
BIS timer["Grenze"].expired
TUE
    LOG "K31 wurde belegt"
SONST
    LOG "Zeitgrenze abgelaufen"
ENDE

Einfache Wartezeit

WARTE millisekunden

Beispiele

WARTE 1500
WARTE timer["Verzögerung"].durationMillis

Eine Decoderadresse direkt schalten

SWITCH [commandStation] [PROTOCOL protokoll] ADDRESS ausdruck POSITION position

Beispiele

-- DCC an der einzigen verbundenen Zentrale
SWITCH ADDRESS accessory["Bahnhofssignal"].address5 POSITION GREEN

-- Vollständig angegebene Form
SWITCH commandStation["YaMoRC"] PROTOCOL MM ADDRESS 17 POSITION RED

Stark typisierte Objektvariablen

OBJEKTTYP name = domäne["Name oder GUID"]

Beispiele

BLOCK bahnhof = block["Bahnsteig 1"]
TRAIN intercity = train["IC 123"]
ROUTE fahrt = route["Bahnhofsrunde"]
ACCESSORY weiche = accessory["W12"]

SETZE bahnhof.maximumSpeed = 60
RESERVE bahnhof FÜR intercity
FAHRE intercity MIT fahrt

Eine Objektvariable verweist während dieser Scriptausführung auf genau ein vorhandenes Objekt. Die Validierung prüft sowohl den deklarierten Typ als auch den Typ rechts vom Gleichheitszeichen. Verfügbare Typen sind COMMANDSTATION, FEEDBACK, ACCESSORY, SIGNAL, SWITCH, BLOCK, TRAIN, WAGONGROUP, TRAINTYPE, LOCOMOTIVE, VARIABLE, ROUTE, SCRIPT, COUNTER und TIMER. COMMAND_STATION, WAGON_GROUP und TRAIN_TYPE werden ebenfalls akzeptiert.

Namensraumwerte lesen und schreiben

objekt.eigenschaft | SETZE objekt.eigenschaft = ausdruck

RailScript-Namensraumreferenz öffnen

Beispiele

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

Bedingungen und Ausdrücke

WENN bedingung DANN anweisungen [SONST anweisungen] ENDE

Beispiele

WENN feedback["K31"].occupied UND NICHT block["Bahnhof"].reserved
DANN
    LOG "Die Route darf vorbereitet werden"
SONST
    LOG "Warten"
ENDE

-- Operatoren: + - * / = != < <= > >= UND ODER NICHT ( )

NULL und fehlende Laufzeitwerte

ausdruck = NULL | ausdruck != NULL

Beispiele

WENN train["Intercity"].currentRoute != NULL
DANN
    LOG "Der Zug hat eine aktive Route"
ENDE

Parameter und Rückgabewerte

PARAMS TYP name [, TYP name …] | RETURNS TYP | RETURN ausdruck

Beispiele

-- Dies ist das separate Script 'Bahnhofsblock wählen'
PARAMS BLOCK aktuellerBlock, TRAIN zug
RETURNS BLOCK
SETZE aktuellerBlock.maximumSpeed = 50
RETURN aktuellerBlock

Wenn PARAMS verwendet wird, steht es am Anfang; RETURNS gehört ebenfalls in den Scriptkopf, direkt nach PARAMS oder sonst als erste Deklaration. Verfügbare Typen sind INT, STRING, BOOLEAN, EVENT und alle RailScript-Objekttypen. Primitive Werte werden kopiert. Objekte werden als lebende GUID-Referenzen übergeben und zurückgegeben; Änderungen über einen Parameter ändern daher das echte Projektobjekt. Jeder Ausführungspfad eines Scripts mit RETURNS muss ein passendes RETURN erreichen.

Scripts mit RUN und CALL starten

RUN "script" [WITH argumente] | TYP ergebnis = CALL "script" [WITH argumente] | CALL "script" [WITH argumente]

Beispiele

-- RUN startet das Script und läuft sofort weiter
RUN "Abfahrt melden" WITH train["Intercity"]

-- CALL wartet und speichert hier den BLOCK-Rückgabewert
BLOCK gewählt = CALL "Bahnhofsblock wählen" WITH block["Bahnsteig 1"], train["Intercity"]
LOG gewählt.name

-- Ein einzelnes CALL darf den Rückgabewert ignorieren
CALL "Bahnhof prüfen" WITH gewählt

-- Nach RUN THIS wird nichts mehr ausgeführt
RUN THIS

RUN arbeitet nach dem Fire-and-forget-Prinzip: Das aufgerufene Script startet mit den übergebenen Parametern, während der Aufrufer weiterläuft. CALL wartet auf RETURN, ohne die Benutzeroberfläche zu blockieren; WAIT, WHEN und PROMPT bleiben daher auch in einem aufgerufenen Script asynchron. CALL-Ketten sind auf 32 Ebenen begrenzt. Laufende und wartende Scripts sind im Script Monitor sichtbar und ihre Ausführung steht in Script Logging; aktivieren Sie dort Debug für die Protokollierung jeder Anweisung.

Warnung: Scripts können andere Scripts und sich selbst erneut starten. Unkontrolliertes oder sehr häufiges Starten kann so viele gleichzeitige Ausführungen erzeugen, dass RailKernel oder sogar das gesamte System nicht mehr reagiert. Solche Konstruktionen zu begrenzen und beherrschbar zu halten, liegt in der Verantwortung des Benutzers.

Der Event-Parameter

PARAMS EVENT event

Beispiele

-- RailKernel übergibt ihn automatisch, wenn ein Objekt-Event das Script startet
PARAMS EVENT event
LOG event.type + " von " + event.objectType + " " + event.objectName
WENN event.trainName != NULL
DANN
    LOG "Zug: " + event.trainName
ENDE

Der Parametername ist frei wählbar. Mit PARAMS EVENT auslöser verwendet dasselbe Script beispielsweise auslöser.type und auslöser.objectName. Die bisherigen impliziten event.*-Werte bleiben für ältere Scripts verfügbar.

Auf jeden Zugrückmelder reagieren

SOBALD bedingung TUE anweisungen ENDE

Beispiele

SOLANGE train["Intercity"].currentRoute != NULL
TUE
    SOBALD train["Intercity"].newFeedback
    TUE
        SETZE train["Intercity"].function[3].active = WAHR
        WARTE 500
        SETZE train["Intercity"].function[3].active = FALSCH
    ENDE
ENDE

Schleife

SOLANGE bedingung TUE anweisungen ENDE

Beispiele

INT schritt = 0
SOLANGE schritt < 10
TUE
    schritt = schritt + 1
ENDE

Sammlungen und FÜR JEDEN

FÜR JEDEN item IN objekt[] TUE anweisungen ENDE

Beispiele

INT belegt = 0
FÜR JEDEN item IN block[]
TUE
    WENN item.occupied
    DANN
        belegt = belegt + 1
        LOG item.name + " ist belegt"
    ENDE
ENDE
LOG "Belegte Blöcke: " + belegt

Scriptprotokollierung

LOG ausdruck

Beispiele

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

Gespeicherte Route starten oder einreihen

FAHRE zug MIT route [EINREIHEN]

Beispiele

FAHRE "Intercity" MIT "Bahnhofsrunde"
FAHRE "Intercity" MIT "Bahnhofsrunde" EINREIHEN

Route zu einem Zielblock erzeugen

FAHRE zug NACH block [SPEICHEREALS "Routenname"]

Beispiele

-- Eine temporäre Route erzeugen und ausführen
FAHRE train["Intercity"] NACH block["Bahnsteig 4"]

-- Die erzeugte Route zusätzlich speichern
FAHRE "Intercity" NACH "Bahnsteig 4" SPEICHEREALS "Intercity zu Bahnsteig 4"

-- Namen ohne Leerzeichen dürfen ohne Anführungszeichen geschrieben werden
FAHRE Intercity NACH Bahnsteig4

Anlagenressourcen reservieren und freigeben

RESERVE ziele FÜR zug | RELEASE ziele FÜR zug

Beispiele

-- Eine oder mehrere Ressourcen atomar für einen platzierten Zug reservieren
RESERVE block["Bahnsteig 1"], accessory["A.1"] FÜR train["Intercity"]

-- Ein Block, Magnetartikel oder eine vollständige Route kann reserviert werden
BOOLEAN erhalten = RESERVE route["Bahnhofsrunde"] FÜR train["Intercity"]
WENN erhalten
DANN
    LOG "Route reserviert"
ENDE

-- Dieselben Ressourcen freigeben; RELEASE liefert ebenfalls BOOLEAN
BOOLEAN freigegeben = RELEASE route["Bahnhofsrunde"] FÜR train["Intercity"]

Objektselektoren

domäne["Name oder GUID"].eigenschaft

Beispiele

feedback["K31"].occupied
feedback["Objekt-GUID"].occupied
locomotive["Class 66"].function[0].name

Wertregeln

  • Objektnamen und GUIDs werden beide als Selektoren akzeptiert.
  • Text steht in doppelten Anführungszeichen; unterstützte Escape-Sequenzen sind unter anderem \n, \r, \t, \" und \\.
  • Zahlen dürfen ganzzahlig oder dezimal sein. Lokale INT-Variablen benötigen ganzzahlige Werte.
  • Boolesche Literale sind WAHR und FALSCH. Enumwerte wie STRAIGHT stehen ohne Anführungszeichen.
  • SETZE ist für Namensraumattributen erforderlich; lokale Variablen werden ohne SETZE zugewiesen.
  • Ein Scriptfehler wird in der RailScript-Protokollierung und im Scriptmonitor aufgezeichnet.
  • NULL steht für einen Wert, der momentan fehlt, etwa currentRoute, wenn ein Zug keine aktive Route hat.
  • Der Operator ! ist die kompakte Schreibweise von NICHT.
  • PROMPT akzeptiert BOOLEAN-, STRING- und INT-Variablen. BOOLEAN verwendet eine WAHR/FALSCH-Auswahlliste; INT akzeptiert nur ganze Zahlen. Das Abbrechen des Dialogs bricht das wartende Script ab.