Table of Contents
Benutzer-Variable
Beschreibung
Benutzer-Variable können in Kombination mit Aktionen und Bedingungen verwendet werden.
Siehe dazu für mehr Informationen:
In diesem Kapitel werden vom Anwender zu definierende Variable beschrieben.
Zusätzlich bietet Rocrail noch über 30 "eingebaute" Variable, deren Werte durch den Betriebs-Ablauf bestimmt werden.
Siehe hierzu: Text-Variable
Übersicht
In Rocrail unter dem Menüpunkt Tabellen - Variablen Tabelle wird das Tabellenfenster "Variable" aufgerufen.
Hier können Variablen erstellt werden.
Die Tabelle kann durch Klicken auf die Spaltenüberschriften sortiert werden.
Durch Klick auf NEU wird eine neue Variable erstellt.
Neu
Erzeugt eine neue Variable "New". Diese Kennung muss auf der Registerkarte 'Allgemein' geändert werden.
Löschen
Löscht den markierten Eintrag aus der Liste.
Dokumentation
Siehe: Berichte
Suchen
Filtert mit "Übernehmen" die Übersicht nach Kennungen, die die eingebenen Zeichen enthalten.
Gemeinsame Dialog-Schaltflächen
Allgemein
Kennung
Die Kennung wird überall im Rocrail-Programm als eindeutiger Schlüssel für die Referenzierung dieser Variablen verwendet.
Gruppe
Es kann eine Gruppe angegeben werden. Dies dient der Übersichtlichkeit, da im Tabellen Fenster nach Gruppen sortiert werden kann.
Beschreibung
Es kann eine Beschreibung angegeben werden. Dient nur zur Info, damit man später weiß, für was man diese Variable angelegt hat.
Min/Max
Der Bereich zur Erzeugung einer Zufallszahl.
Max. muss größer als Min. sein.
Bei Variablen, die keine Zufallszahl sein sollen, die Werte auf 0 belassen.
Text
Ein Text der Variablen, mit dem später in Aktionen Stringoperationen (Textvergleiche) durchgeführt werden können.
Der Text kann auch eine Zahl sein.
Text-Werte werden zu Ganzzahlen konvertiert und sind standardmäßig Null, wenn sie nur Text enthalten, um auch mit ihnen rechnen zu können (siehe Parametersyntax unten).
Das Feld kann auch leer gelassen werden.
Wert
Der Wert einer Variablen, eine Zahl
Aktionen-Button
Hier können Aktionen ausgeführt werden, die gestartet werden, wenn die Variable einen bestimmten Wert hat.
Zusatzinfo:
Variablen können nicht nur über das Tabellen-Menü erstellt werden, sondern auch zur Laufzeit mittels Aktionen. Sobald eine Variablen Aktion zum ersten mal aufgerufen wird, wird die Variable automatisch erstellt (falls nicht schon vorhanden) und ist dann automatisch in der Tabellen-Übersicht vorhanden!
Aktionen
Siehe Aktionen für weitere Einzelheiten.
- Nur der nummerische Wert kann als Aktions-Status verwendet werden.
- Aktionen werden geprüft, nachdem ein Befehl ausgegeben wurde.
- Zeitgeber-Variable werden nur geprüft, falls sie durch einen Start-Befehl in den aktiven Zeitgeber-Modus versetzt wurden.
Aktions-Befehle
Befehl | Beschreibung | Bemerkung |
---|---|---|
value | Setzt einen neuen Zahlen-Wert. | |
random | Erzeugt eine Zufallszahl im Bereich von min./max. | |
add | Addiert einen Wert zum Zahlen-Wert. | |
subtract | Subtrahiert einen Wert vom Zahlen-Wert. | |
text | Setzt einen neuen Text. | |
reset | Setzt eine Timer Variable auf 0 zurück | |
start | Startet den Zeitgeber; Der Wert wird bei jedem Takt erhöht. Der Start-Wert muss im Parameter-Feld eingestellt werden. | Der Zeitgeber-Takt-Intervall ist abhängig von der Option Aktion Zeiteinheit 60 Sek.. |
stop | Stoppt den Zeitgeber. | |
min | Setzt den min.-Wert. | |
max | Setzt den max.-Wert. |
Aktions-Status und -Bedingungen
Bedingung | Beschreibung | Beispiel |
---|---|---|
=value | Vergleicht den Variablen-Wert mit dem gegebenen Wert. | =1030 |
>value | Prüft, ob der Variablen-Wert größer ist, als der gegebene Wert. | >4711 |
<value | Prüft, ob der Variablen-Wert kleiner ist, als der gegebene Wert. | <23 |
!value | Vergleicht den Variablen-Wert mit dem gegebenen Wert, ob sie ungleich sind. | !47 |
#text | Vergleicht den Variablen-Text mit dem gegebenen Text. | #nogo |
?text | Vergleicht den Variablen-Text mit dem gegebenen Text, ob sie ungleich sind. | ?gogo |
text nicht gesetzt | Prüft, ob eine Text-Variable "nicht gesetzt" ist. | @var - NULL |
Status- und Parameter-Syntax
Prefix | Referenz |
---|---|
# | Variablen-Kennung |
$ | Text-Kennung |
Operatoren | |
---|---|
+ | Addieren |
- | Subtrahieren |
/ | Dividieren |
* | Multiplizieren |
! | Modulo |
Die Operationen werden von links nach rechts ohne Berücksichtigung mathematischer Regeln ausgeführt.
Werte, Variablen und Operatoren müssen durch ein Leerzeichen separiert werden.
Beispiel:
#Var1 + 67 - $Txt2 #Var1%lcid% + 67 - $Txt2
Text-Werte werden zu Ganzzahlen konvertiert und sind standardmäßig Null, wenn sie nur Text enthalten.
Aktions-Sub-Kennung
Die Befehls- u. Bedingungs-Sub-Kennung ist optional und kann für folgende Text-Variablen verwendet werden:
Lok | |
---|---|
%lcid% | Lok-Kennung |
%bkid% | Block-Kennung |
Dies wirkt nur im Automatik-Modus.
Die Variable wird automatisch erzeugt, wenn sie nicht bereits existiert.
Automatisch erzeugte Variablen
Wenn ein Zug / eine Locomotive kein neues Ziel findet, werden die folgenden Variablen automatisch erzeugt:
- lc4112 → Lok-Kennung
- bk4112 → Aktueller Block der Lokomotive
Anwendungsbeispiele
Normale Variable
Eine normale Variable kann z. B. als Zähler fungieren (Rundenzähler, Streckenabschnittszähler).
Sobald eine Lok in einen Abschnitt fährt, wird mittels einer Aktion add 1 der Variablenwert um eins erhöht, verlässt eine Lok den Abschnitt wieder, wird mittels einer subtract 1 Aktion der Variablenwert wieder um eins vermindert. Wenn man dann jeweils mit einer weiteren Aktion den Variablenwert in einem Textfeld im Gleisbild updated, hat man einen optischen Zähler, wieviele Loks sich in einem Streckenabschnitt befinden.
Der Variablenwert kann auch zur Steuerung hergenommen werden, z. B. kann ab einem bestimmten Wert >x eine Class Aktion ausgeführt werden, die einen Block dann für bestimmte Classes sperrt oder freigibt. So können mit einem Zähler z. B. auch Steuerungsaufgaben übernommen werden.
Timer Variable
Mittels einer Timer Variablen können Aktionen nach einer gewissen Zeit (Timer Wert) ausgeführt werden.
Man kann eine Timer Variable zum Beispiel auch für Messstrecken benutzen. Eine Lok startet den Timer an einem Melder, und später an einem weiteren stoppt sie den Timer wieder und gibt den Wert in ein Textfeld aus.
Eine weitere Lok resettet den Timer am Startmelder wieder, startet ihn wieder und gibt am Ende wieder den Wert aus.
So kann zum Beispiel gemessen werden, wie lange eine Lok von A nach B braucht. (Dafür gibt es in RR auch die Geschwindigkeitsmessstrecke, aber es soll nur ein Beispiel sein.)
Oder man misst mit einer Timer Variablen wie lange ein Verbraucher läuft (zum Beispiel Rauchgenerator).
Immer wenn der Verbraucher eingeschaltet wird, wird mittels Aktion der Timer gestartet, beim Abschalten des Verbrauchers wird der Timer wieder gestoppt.
Bei einem bestimmten Timer-Wert kann eine Warnung in ein Textfeld geschrieben werden, z. B. "Öl nachzufüllen".
Nachdem dies gemacht ist, wird mittels eines Tasters "Öl nachgefüllt" per Aktion der Timer resettet, also auf 0 gestellt.
Zufallszahl
Zufallszahlen sind nützlich, wenn Aktionen zufällig ausgeführt werden sollen. Wenn z. B. min 0 ist und max 20, kann man die Aktion ausführen lassen, wenn der Wert z. B. 17 ist. In durchschnittlich einem von 20 Fällen wird die Aktion dann ausgeführt (nämlich dann, wenn die Zufallszahl 17 ist).
Oder man lässt die Aktion ausführen, wenn der Wert >17 ist, d. h. die Aktion wird dann bei den Werten 18, 19 und 20 ausgeführt, also in 3 von 20 Fällen.
Damit auch zu jeder Zeiteinheit eine neue Zufallszahl bestimmt wird, muss natürlich eine Aktion random der Zufallszahl ausgeführt werden.
Zeiteinheit ist die je nach Einstellung in den RocRail Eigenschaften gewählte.
Die min und max Werte können auch zur Laufzeit mittels Aktionen geändert werden. Man kann z. B. 2 Textfelder ins Gleisbild setzen und dort jeweils einen Wert eingeben. Beim Ändern im Textfeld wird eine Textfeld Aktion ausgelöst, die den Textfeldinhalt als min Wert oder max Wert einer Variablen setzt.
Kombinationen von Variablen
Durch Kombination von Timern, Zufallszahlen und normalen Variablen können umfangreiche Dinge umgesetzt werden. Zum Beispiel einen Timer starten, der bei einem bestimmten Wert eine Zufallszahl erzeugt, diese wird zum Wert einer anderen normalen Variablen addiert usw.
Beispiel
Ein Beispielgleisplan enthält:
Einen Block mit der Kennung 'block1', die Rückmelder auf der Plus Seite 'block1+' und auf der Minusseite 'block1-', sowie einen Schalter mit der Kennung 'schalter1'
Variable anlegen:
Unter dem Menüpunkt: Tabelle-Variablentabelle eine Variable anlegen mit der Kennung 'counter', alle anderen Werte belassen.
Aktionen anlegen:
Unter dem Menüpunkt: Tabelle-Aktionen 2 Aktionen anlegen
Die erste Aktion bekommt die Kennung 'Schalter flip' und soll den Schalter umschalten (flip):
Die zweite Aktion mit der Kennung 'counter erhöhen' erhöht den Wert der Variablen 'counter' um 1:
Die 2 angelegten Aktionen:
Bei dem Rückmelder 'block1-' führen wir die Aktion 'counter erhöhen' aus, sobald der Rückmelder den Status 'on' hat:
Wir klicken nun mit der Maus einmal auf den Rückmelder 'block1-'
Jetzt öffnen wir unter dem Menüpunkt: Tabelle-Variablentabelle die Variablenansicht und sehen, daß der Wert der Variablen 'counter' von 0 auf 1 erhöht wurde.
Wir markieren die Variable 'counter' und wechseln zur Tabansicht 'Allgemein'
Dort gibt es einen Button 'Aktionen', hier werden alle Aktionen angelegt, die sich auf diese Variable beziehen.
Dort legen wir fest, daß die Aktion 'Schalter flip' ausgeführt werden soll, wenn der Status (und damit der Wert der Variablen) =5 ist:
(Man könnte hier beim Status zb auch angeben: =#var2 + $var3, dann würde die Aktion ausgeführt, wenn der Wert der Variablen 'counter' gleich wäre wie die Summe aus dem Wert der Variablen' var2' und dem Text der Variablen ' var3'. Dazu müsste im Text der Variablen 'var3' eine Zahl stehen, ansonsten wär $var3=0. Dieses Beispiel wäre also ein Variablenvergleich.)
Wenn wir jetzt im Gleisbild auf den Rückmelder 'block1-' klicken (oder später eine Lok ihn auslöst), wird jedesmal der Wert der Variablen 'counter' um eins erhöht.
Wenn die Variable den Wert 5 hat wird der Schalter umgeschalten.
Der Wert würde nun jedoch bei jedem Auslösen des Rückmelders weiter um eins erhöht (6…7…8) und die Aktion 'Schalter flip' würde nie mehr ausgeführt werden, da der Wert nie mehr =5 sein würde.
Deshalb legen wir nun eine weitere Aktion an:
Diese Aktion bekommt die Kennung 'counter nullen' und setzt den Wert der Variablen 'counter' auf 0
Nun müssen wir diese Aktion ebenfalls ausführen, wenn der Wert der Variablen 'counter' 5 ist.
Also wieder zurück ins Menü: Tabelle/Variablen-Tabelle, die 'Variable' counter wieder markieren, auf den Tab 'Allgemein' wechseln, und dort die Aktion hinzufügen:
Ergebnis:
Jedes mal, wenn der Rückmelder 'block1-' ausgelöst wird, wird der Wert der Variablen 'counter' um eins erhöht.
Wenn der Wert der Variablen 'counter' 5 ist (Rückmelder wurde 5 mal ausgelöst), wird die Aktion 'Schalter flip' ausgeführt (Schalter wird umgeschalten) und der Wert der Variablen 'counter' wird wieder auf 0 gesetzt.
Das bedeutet, jedesmal nach 5 Auslösungen des Rückmelders 'block1-' wird der Schalter 'schalter1' umgestellt.
Wenn man nun will, daß nur bestimmte Loks den Wert der 'counter' Variable erhöhen, wird einfach bei der Aktion 'counter erhöhen' die entsprechende Bedingung mit der Lokkennung eingetragen.
Dies soll nur mal ein kleines, einfaches Beispiel sein, wie man mit Variablen arbeiten kann.
Mit Timer- und Zufallszahlenvariablen funktioniert es genauso, diese haben halt noch weitere Status, die per Aktion geändert werden können.
Beim Timer zum Beispiel 'start' und 'stop', um den Timer zu starten und zu stoppen, außerdem 'reset' um ihn auf 0 zurückzusetzen.
Bei den Zufallszahlen noch 'min' und 'max' um die Unter- und Obergrenze der Zufallszahlenbestimmung festzulegen.
Eine neue Zufallszahl wird dann immer mit der Aktion 'random' erzeugt.
Mit diesem Beispiel und der Syntaxbeschreibung oben, müsste es nun gelingen, eigene Variablenaktionen (auch in Kombination) zu benützen.
Die Aktions Sub-Kennung
Wir legen nun noch eine Aktion an mit der Kennung 'counter pro lok' - Typ: Variable - Kennung: counter - Sub-Kennung: %lcid% - Befehl: add - Parameter: 1
Jetzt klicken wir mit der rechten Maustaste auf den 'block1' und wählen Eigenschaften aus.
Auf dem Tab Allgemein der Blockeigenschaften klicken wir auf den Button Aktionen und wählen die eben angelegte Aktion 'counter pro lok' beim Status 'occupied' aus:
Jetzt ziehen wir vom Lokbedienfeld zum Beispiel die Lok mit der Kennung 'lok1' in den Block 'block'.
Damit hat die lok1 den Status 'occupied' des Blockes 'block' ausgelöst und die eben angelegte Aktion wird ausgeführt.
Wenn wir jetzt in die Variablen-Tabelle schauen sehen wir folgendes:
Ergebnis:
Wir haben zur Laufzeit eine Variable für diese Lok angelegt mit der Kennung counter%lcid%, da es lok1 war, hat die Variable die Kennung 'counterlok1'.
Der Wert ist 1, da wir bei der zuvor angelegten Aktion ja den Befehl add 1 angelegt hatten.
Wir setzen nun noch lok3 in den Block 'block':
Ergebnis:
Wir haben nun für lok1 und für lok3 zur Laufzeit automatisiert eine Variable angelegt und mussten dies nicht erst manuell in der Variablentabelle tun.
Mit diesen sozusagen lokspezifischen Variablen hat nun jede Lok ihre eigene mit der wieder weitergearbeitet werden kann.
Dazu genügt es dann in zukünftigen Aktionen einfach die Variable 'counter' mit der Sub-Kennung '%lcid% zu benutzen um lokspezifische Variablenänderungen mit ein und derselben Aktion zu machen!
ACHTUNG: Aktionen mit der Sub-Kennung %lcid% funktionieren nur bei Objekten, die die lcid auch kennen, wie zb Blöcke, Rückmelder die Blöcken zugeordnet sind etc.
Kooperation Variablen und Textfelder
Wir legen im Gleisbild jetzt noch ein Textfeld an - Kennung:txt1 - Text: Text
Dieses plazieren wir mal unter dem Block 'block1'
Außerdem legen wir noch folgende Aktion an mit der Bezeichnung txt update (Weitere Einstellungen siehe Bild):
Mit dieser Aktion soll also der Text des Textfeldes 'txt1' aktualisiert werden mit dem Wert der Variablen 'counter%lcid%'
Jetzt gehen wir in die Blockeigenschaften des Blocks 'block1' und fügen dort diese Aktion ebenfalls beim Status occupied hinzu:
Wir öffnen nun die Variablentabelle und schauen uns mal die derzeitigen Werte der Variablen an:
Jetzt setzen wir lok3 in den Block 'block1' und sehen, es wird uns im Textfeld der Wert der Variablen 'counter%lcid%', in diesem Fall also 'counterlok3' angezeigt.
Dadurch, daß beim Status 'occupied' des Blocks 'block1' auch noch die Aktion 'counter pro lok' ausgeführt wurde, ist der Wert jetzt gleich noch um eins höher, als er vorher war.
Gleichzeitig wurde durch den 'occupied' des Blockes auch der Wert der 'normalen' Variable 'counter' auf 5 erhöht und sofort wieder auf 0 gesetzt (wir erinnern uns an die weiter oben beschriebenen Aktionen).
Wenn man dies nicht wollen würde, müsste man in dem Beispiel weiter oben eine andere Variablenbezeichnung nehmen oder eben für die %lcid% Variablen eine andere Bezeichnung (zb. 'counterallg' für die normale Variable und counter%lcid% für die %lcid% Variable).
Wenn wir jetzt die Lok wieder aus dem Block entfernen, zeigt uns das Textfeld den Wert der Variablen 'counter%lcid%' aktualisiert wieder an.
Da jetzt aber keine Lok im Block ist, ist die Sub-Kennung '%lcid%' unbekannt. Deswegen wird jetzt der Wert der Variablen 'counter' angezeigt
So kann man Variableninhalte in einem Textfeld ausgeben.
Es geht aber auch andersrum. Dazu muß man eine Aktion anlegen, die den Text eines Textfeldes in einen Variablenwert (- oder Variablentext) schreibt.
Das sollte man jetzt mit etwas Übung und Ausprobieren auch hinbekommen.
Viel Spass beim Testen und Umsetzen der eigenen Ideen mittels Variablen.