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
ENDEVollstä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
# KommentarLokale Variablen
INT anzahl = 0
STRING meldung = "Bereit"
BOOLEAN erlaubt = WAHR
anzahl = anzahl + 1Benutzereingabe 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"].valueNamensraumwerte lesen und schreiben
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 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"
ENDENULL und fehlende Laufzeitwerte
WENN train["Intercity"].currentRoute != NULL
DANN
LOG "Der Zug hat eine aktive Route"
ENDEScripts 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 THISAuf 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
ENDESchleife
INT schritt = 0
SOLANGE schritt < 10
TUE
schritt = schritt + 1
ENDESammlungen 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: " + belegtEinfache Wartezeit
WARTE 1500
WARTE timer["Verzögerung"].durationMillisScriptprotokollierung
LOG "Zuggeschwindigkeit: " + locomotive["Class 66"].speedGespeicherte Route starten oder einreihen
FAHRE "Intercity" MIT "Bahnhofsrunde"
FAHRE "Intercity" MIT "Bahnhofsrunde" EINREIHENObjektselektoren
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.