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
| Anweisung | Funktion |
|---|---|
PARAMS TYP name [, TYP name …] | Deklariert die Eingabeparameter des Scripts vor den ausführbaren Anweisungen. |
RETURNS TYP | Deklariert den Typ des Wertes, den dieses Script mit RETURN zurückgibt. |
INT name = ausdruck | Deklariert eine lokale Ganzzahlvariable. STRING und BOOLEAN funktionieren ebenso. |
OBJEKTTYP name = domäne["Objekt"] | Deklariert einen stark typisierten lokalen Verweis auf ein vorhandenes Namensraumobjekt. |
name = ausdruck | Weist einer bereits deklarierten lokalen Variable einen neuen Wert zu. |
SETZE objekt.eigenschaft = ausdruck | Schreibt eine beschreibbare Namensraumeigenschaft. |
LOG ausdruck | Schreibt einen Wert in das RailScript-Protokoll. |
WENN bedingung DANN … SONST … ENDE | Führt einen von zwei Zweigen aus; SONST ist optional. |
SOBALD bedingung BIS bedingung TUE … SONST … ENDE | Wartet auf eine Ereignisbedingung; BIS und SONST sind optional. |
SOLANGE bedingung TUE … ENDE | Wiederholt Anweisungen, solange eine Bedingung wahr bleibt. |
FÜR JEDEN item IN objekt[] TUE … ENDE | Durchläuft eine Momentaufnahme einer Objektsammlung. |
WARTE millisekunden | Pausiert nur dieses Script für die angegebene Dauer. |
PROMPT text | Pausiert dieses Script und bittet den Benutzer um Bestätigung. |
PROMPT text, variable | Fragt 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 THIS | Startet 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 ausdruck | Beendet das aktuell aufgerufene Script und gibt seinen deklarierten Wert zurück. |
RESERVE ziele FÜR zug | Reserviert Blöcke, Magnetartikel oder Routen atomar für einen platzierten Zug. |
RELEASE ziele FÜR zug | Gibt die Reservierungen eines Zuges atomar frei. |
SWITCH [commandStation] [PROTOCOL p] ADDRESS ausdruck POSITION position | Schaltet direkt eine Decoderadresse; standardmäßig gelten DCC und die einzige verbundene Zentrale. |
Kommentare
-- Kommentar | // Kommentar | # Kommentar
Beispiele
-- Kommentar
// Kommentar
# KommentarLokale Variablen
INT name = ausdruck | STRING name = ausdruck | BOOLEAN name = ausdruck | name = ausdruck
Beispiele
INT anzahl = 0
STRING meldung = "Bereit"
BOOLEAN erlaubt = WAHR
anzahl = anzahl + 1Benutzereingabe 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"].valueAuf 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"
ENDEEinfache Wartezeit
WARTE millisekunden
Beispiele
WARTE 1500
WARTE timer["Verzögerung"].durationMillisEine 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 REDStark 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 fahrtEine 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 = 64Bedingungen 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"
ENDEParameter 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 aktuellerBlockWenn 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 THISRUN 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
ENDEDer 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
ENDESchleife
SOLANGE bedingung TUE anweisungen ENDE
Beispiele
INT schritt = 0
SOLANGE schritt < 10
TUE
schritt = schritt + 1
ENDESammlungen 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: " + belegtScriptprotokollierung
LOG ausdruck
Beispiele
LOG "Zuggeschwindigkeit: " + locomotive["Class 66"].speedGespeicherte Route starten oder einreihen
FAHRE zug MIT route [EINREIHEN]
Beispiele
FAHRE "Intercity" MIT "Bahnhofsrunde"
FAHRE "Intercity" MIT "Bahnhofsrunde" EINREIHENRoute 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 Bahnsteig4Anlagenressourcen 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].nameWertregeln
- 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.