Über Variable abfragen, ob Zug im Bahnhof oder auf Strecke steht - ab TrainController Version 9 Gold
Jede Lokomotive soll eine Lokfunktion bekommen (quasi eine F-Funktion), die aussagt, ob ein Zug gerade in einem Bahnhof steht oder nicht. Darüber soll gesteuert werden, ob beim Abfahren die Sounds (Tür zu, Lokpfiff, Lautsprecheransage, …) ausgelöst werden soll, wenn es eine Soundlok ist. Natürlich darf dann aber auch ein ICE nicht an einem Bahnsteig für eine S-Bahn diese Prozedur beginnen, es muss also feingliedrig unterschieden werden.
Seite ist im Aufbau
Hier beschreiben wir unsere Überlegungen dazu:
Variable anlegen
Zuerst legen wir eine Variable vom Typ „Zug“ an, d.h. jeder Zug/Lok kann seine eigene Variable mit unterschiedlichen Werten füllen.
Der Name ist dabei Geschmacksache. Auch, wie die Variable zu füllen ist. Dies kann durch eine Zahl oder auch durch Wörter sein. So könnten Haltepunkte und Bahnhöfe unterscheiden werden, aber dazu später mehr…
Variable in Lokfunktion einbinden
Damit nun die Variable ausgewertet werden kann, müssen wir diese als Lokfunktion hinterlegen:
Dabei ist wichtig, dass man nicht „Decoder“ sondern „Liste“ wählt, dadurch erhält man quasi eine virtuelle F-Funktion, die es im Decoder natürlich nicht gibt. Als Symbol und Name für die Funktion kann man sich etwas Passendes aussuchen - wir wählen nun erstmal „Sonstige 1“ zum Anlagen.
In der Funktion müssen wir hinterlegen, was wann wie passieren soll.
Wird die Funktion gewählt, erhält die Lok/der Zug eine „1“ in die Variable
Wird die Funktion deaktiviert, dann wird die Variable wieder auf „0“ gesetzt. Mehr soll an dieser Stelle erstmal nicht passieren.
Lok vorbereiten
Wir haben nun die Grundlagen geschaffen, dass, wie auch immer, eine Lokfunktion ausgelöst werden kann (dazu später) und diese in der Lok/dem Zug eine Variable gesetzt wird. Diese muss jetzt auch ausgewertet werden.
Sagen wir, unsere Lokomotive hat eine Funktion zur Bahnhofsdurchsage vor der Abfahrt am Bahnhof („Bitte Vorsicht an Gleis 1, Zug fährt ab…“ etc.), dann darf diese Funktion natürlich auch nur an einem passenden Bahnhof ertönen.
Wen ich vorher die Bedingung abfrage, dann kann ich die Durchsage beim „Losfahren“ nur dann starten lassen, wenn auch der Zug wirklich in einem Bahnhof losfährt, denn nur dann ist die Bedingung wahr (= 1). Wenn diese Bedingung nicht erfüllt ist, dann startet beim Losfahren keine Durchsage. Das ist aber erstmal die einfachste Art der Umsetzung. Übrigens wird tatsächlich NUR der direkte Befehl direkt nach der Voraussetzung ausgelassen, wenn die Bedingung nicht wahr ist. Schritt 2 (Wartezeit) und Schritt 3 (Funktion ausschalten) werden gnadenlos ausgeführt, auch wenn sie im Ablauf nicht spürbar wären.
Will man nun mehrere Schritte hintereinander ausführen, sobald die Bedingung wahr ist, dann könnte man den ganzen nachfolgenden Ablauf in ein Macro packen und nur das Macro starten ODER z.B. eine Sprungmaske definieren, ohne die das Programm nicht dahin abbiegen kann, wie also z.B. so:
xxxxxxxxxxxxxxxxxxxxxxxxxx
Die Zugfahrt startet
Woher weiß ein Zug, dass er am Bahnhof/Block stehenbleiben muss?
–> Aufenthaltsdauer im Block –> Definition durch „Züge“
Woher wird die Aufenthaltsdauer gezogen? Ein ICE steht ggf. länger als eine S-Bahn
Zuerst muss eine Variable erstellt werden. Diese Variable muss vom Typ Block sein, weil diese ja in jedem Block neu eingetragen werden muss:
Wo tragen wir die Startverzögerung ein, die der Zug zur Abfertigung benötigt (bei jedem Zug/jeder Lok anders)
–> Variable