Erbauer bearbeiten also Zugtemplates, aus denen dann Züge erzeugt werden. Aber wie funktioniert diese Erzeugung eigentlich?
Dafür gibt es eine eigene Sprache, das Zugscript. Darüber teilt man dem Server mit, wie und welche Züge er erzeugen soll. Die Erzeugung findet dann im Zugscriptlauf statt. Dort schaut sich der Server die Zugscript von allen vorgemerkten Zugtemplates an und erzeugt anhand dessen Züge, die anschließend in den Stellwerken fahren können.
Im Folgenden soll das anhand einer Strecke von A-Dorf nach B-Hausen erklärt werden.
Wir wollen also einen Zug von A-Dorf nach B-Hausen fahren lassen. Er soll um 5:30 Uhr in A-Dorf abfahren und um 6:00 Uhr in B-Hausen ankommen. Unser Fahrplan sieht daher wie folgt aus:
5:30 A-Dorf 6:00 B-Hausen
Da der Zug später alle Stunde fahren soll, bedienen wir uns einer Vereinfachung: Wir merken uns neben dem Fahrplan nur die Stunde, in der er fährt - die Minute bleibt ja immer gleich. Die Aufgabe würde also lauten:
Fahre in A-Dorf zur Stunde 5 ab.
Dies wollen wir nun möglichst direkt auch dem Server sagen. Das passende Zugscript sieht wie folgt aus:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5);
GLEIS und STUNDE erkennt man relativ leicht wieder. Die ID bezeichnet die Anlage (das Stellwerk), in dem sich das Gleis A-Dorf befindet. Alle Anlagen haben eine eindeutige Anlagen-ID (AID). Als Beispiel wurde hier 123 genommen. Die Zahl hinter der öffnenden Klammer ist der einzige Wert im Zugscript ohne Name und gibt an, in welchem Takt das Zugtemplate fährt (hier 60 Minute = alle Stunde). Dieser Wert muss immer ganz vorne stehen und immer angegeben werden, auch wenn wie hier nur ein Zug erzeugt werden soll. Bei Einzelzügen ist der Wert natürlich unwichtig und kann prinzipiell frei gewählt werden, typischerweise wird hier aber auf 60 Minuten zurückgegriffen.
takt(<Takt in Minuten>,ID=<AnlagenID>,GLEIS=<Gleisname>,STUNDE=<Abfahrtsstunde>);
ID und GLEIS werden zusammen als Referenzgleis des Zugscript bezeichnet.
Die Stunde könnte übrigens auch mit früher 0 geschrieben werden - das macht keinen Unterschied.
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=05);
Das Zugscript kann natürlich noch viel mehr, für diese Beispiele soll es aber erstmal reichen.
Im Zugscriptlauf legt der Server nun Fahrplan und Zugscript nebeneinander und sucht das Gleis, das im Zugscript steht, im Fahrplan. Anschließend vergleicht er die Zeiten: 5:30 Uhr im Fahrplan und 5:xx Uhr im Zugscript (die Minuten sind ja unerheblich). Da die Zeiten übereinstimmen, braucht er nicht mehr zu machen, als einen Zug mit den Fahrplan des Zugtemplates zu erzeugen.
Nun soll ein weiterer Zug fahren, eine Stunde später (um 6:30 Uhr). Wir belassen den Fahrplan und formulieren nur den Auftrag neu:
Fahre in A-Dorf zur Stunde 6 ab.
unser Zugscript passen wir entsprechend an:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=6);
Wir haben also nur das Zugscript angepasst, nicht den Fahrplan des Zugtemplates.
Im Zugscriptlauf vergleicht der Server wieder die Zeiten im Fahrplan (5:30) und im Zugscript (6:xx) und bemerkt eine Differenz von 1 Stunde (+1:00, da er ja nur auf die Stunde schaut und die Minuten ignoriert). Daher rechnet er diese Stunde beim Erstellen des Zuges auf den Zugtemplate-Fahrplan auf:
5:30 + 1:00 = 6:30 A-Dorf 6:00 + 1:00 = 7:00 B-Hausen
Damit fährt der Zug um eine Stunde versetzt zum ersten Zug, aber unabhängig von dessen Zugscript. Außerdem ist es für die erzeugten Züge egal, wann der Zugtemplate-Fahrplan liegt - entscheidend ist das Zugscript! Wenn der Zugtemplate-Fahrplan mit einem der erzeugten Zug-Fahrpläne übereinstimmt, ist das aber überichtlicher und vermeidet Fehler.
Nach diesem Muster könnten wir nun weitermachen, bis wir für jeden Zug ein Zugscript erstellt haben. Allerdings wäre das ein großer Aufwand und ist sehr unübersichtlich. Kein Mensch würde alle Züge eines Tages aufzählen, wenn sie alle Stunde fahren.
Fahre in A-Dorf zwischen 5 und 21 Uhr alle 60 Minuten ab.
Daher gibt es auch im Zugscript eine zusammenfassende Schreibweise, um in einem Zeitraum Züge zu erzeugen:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5..21);
Dabei gibt es 2 Dinge zu beachten:
Es werden also 16 Züge erzeugt:
5:30, 6:30, ..., 19:30, 20:30
Im Zweifelsfall ist es immer sinnvoll, die erzeugten Züge nachzuzählen.
Folgende Zugscripte würden also nur einen Zug erzeugen:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5..6); takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5);
Nun soll zur Mittagszeit ein Zug weniger fahren, weil die erforderliche Nachfrage nicht vorhanden ist. Die können wir einfach mit zwei Zugscripten abbilden:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5..12); takt(60,ID=123,GLEIS=A-Dorf,STUNDE=13..21);
Einfacher ist es aber, diese beiden Zeiträume in einem Zugscript darzustellen:
takt(60,ID=123,GLEIS=A-Dorf,STUNDE=5..12,STUNDE=13..21);
In einem Zugscript dürfen beliebig viele STUNDE-Parameter in beliebiger Reihenfolge vorkommen. Apropos Reihenfolge: Auch die anderen Parameter mit Ausnahme des Taktes können nach Wunsch vertauscht werden. ID und GLEIS müssen aber auf jeden Fall vorhanden sein.
takt(60,STUNDE=13..21,GLEIS=A-Dorf,STUNDE=5..12,ID=123);
Der Übersichtlichkeit halber sollte man allerdings einheitlich bleiben.
… geht es mit weiteren Parametern für das Zugscript weiter.