Hilfe

RailScript (as of 12.01)

RailScript ist die integrierte Automatisierungssprache von RailKernel. Sie liest den aktuellen Anlagenzustand, ändert unterstützte Werte, wartet auf Ereignisse und startet oder reiht gespeicherte Routen ein, ohne die Routing- und Sicherheitsregeln von RailKernel zu umgehen.

Was RailScript kann

Ein RailScript kann Digitalzentralen, Rückmelder, Magnetartikel, Signale, Blöcke, Züge, Lokomotiven, Zugtypen, Routen, Variablen, Zähler, Timer und den Systemzustand auswerten. Scripts können Entscheidungen treffen, auf Bedingungen warten, Abläufe wiederholen, in das Scriptprotokoll schreiben, schreibbare Attribute bedienen und einen vorhandenen Route Move starten. Projektscripts und ihre Sprache werden mit dem Projekt gespeichert.

Der Scripteditor

Jedes Script besitzt einen Namen, einen Aktiviert-Schalter, eine Sprache und Quelltext. Validate prüft das vollständige Programm, ohne es auszuführen. Run startet die aktuelle Quelle, Stop bricht die Ausführung ab. Beim Wechsel zwischen Englisch, Niederländisch und Deutsch werden RailScript-Schlüsselwörter übersetzt; Objektnamen, Texte und Kommentare bleiben erhalten. Tab oder Strg+Leertaste öffnet die kontextsensitive Vervollständigung für Schlüsselwörter, Objekte und Attribute.

Ausführung und Sicherheit

WENN und SOLANGE werden sofort ausgewertet. FÜR JEDEN durchläuft eine Momentaufnahme aller Objekte einer Sammlung wie block[] oder feedback[]. Die Schleifenvariable stellt die normalen Namensraumattributen dieses Objekts bereit. SOBALD wartet, ohne RailKernel zu blockieren, und setzt die Ausführung fort, sobald die Bedingung wahr wird oder die optionale BIS-Bedingung gewinnt. PROMPT pausiert nur das aktuelle Script, während der Benutzer um Bestätigung oder einen eingegebenen Wert gebeten wird; RailKernel und andere Scripts laufen weiter. Das newFeedback-Ereignis eines Zuges wird von der erfolgreichen SOBALD-Anweisung verbraucht und danach wieder FALSCH. FAHRE verwendet die normale Route-Move-Engine und behält deren Sicherheitsregeln bei. RUN startet ein anderes Projektscript; RUN THIS startet das aktuelle Script neu, schließt die alte Ausführung sofort ab und ignoriert alle nachfolgenden Anweisungen.

Beispiel: Abfahrt aus einem Bahnhof

Dieses ausführliche Beispiel zeigt einen vollständigen Abfahrtsablauf: einen Zug am Bahnsteig erkennen, anhalten, die Aufenthaltszeit abwarten, den Schaffnerpfiff auslösen und eine gespeicherte Abfahrtsroute starten. Ersetzen Sie Objektnamen und Funktionsnummer durch Werte aus Ihrem Projekt.

-- Abfahrt aus dem Bahnhof mit Schaffnerpfiff

SOBALD train["Intercity 1200"].currentBlock = "Bahnsteig 1"
       UND train["Intercity 1200"].placed
TUE
    LOG "Intercity 1200 ist an Bahnsteig 1 angekommen"

    SETZE locomotive["NS 1200"].speed = 0

    SETZE timer["Bahnhofsaufenthalt"].durationMillis = 30000
    SETZE timer["Bahnhofsaufenthalt"].running = WAHR

    SOBALD timer["Bahnhofsaufenthalt"].expired
    TUE
        -- Funktion 3 enthält in diesem Beispiel den Schaffnerpfiff.
        SETZE locomotive["NS 1200"].function[3].active = WAHR

        SETZE timer["Pfiff"].durationMillis = 1500
        SETZE timer["Pfiff"].running = WAHR

        SOBALD timer["Pfiff"].expired
        TUE
            SETZE locomotive["NS 1200"].function[3].active = FALSCH

            LOG "Abfahrsignal gegeben"
            FAHRE "Intercity 1200" MIT "Abfahrt Bahnsteig 1"
        ENDE
    ENDE
ENDE

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.

Kommentare

-- Kommentar
// Kommentar
# Kommentar

Lokale Variablen

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

Benutzereingabe anfordern

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

Namensraumwerte lesen und schreiben

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 feedback["K31"].occupied UND NICHT block["Bahnhof"].reserved
DANN
    LOG "Die Route darf vorbereitet werden"
SONST
    LOG "Warten"
ENDE

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

Auf ein Ereignis warten, optional mit Begrenzung

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

NULL und fehlende Laufzeitwerte

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

Scripts starten und synchronisieren

RUN "Geräusche Bahnhofsrunde"

SOBALD !script["Geräusche Bahnhofsrunde"].isRunning
TUE
    LOG "Das Geräuschscript ist abgeschlossen"
ENDE

-- Dieses Script neu starten; nach RUN THIS wird nichts mehr ausgeführt.
RUN THIS

Auf jeden Zugrückmelder reagieren

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

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

Sammlungen und FÜR JEDEN

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

Einfache Wartezeit

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

Scriptprotokollierung

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

Gespeicherte Route starten oder einreihen

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

Objektselektoren

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.