kskit/README.md

120 lines
6.4 KiB
Markdown
Raw Normal View History

2022-04-07 19:46:11 +02:00
---
author: Nero
title: KsKit für Eisenbahn.exe
---
2022-04-07 18:39:46 +02:00
# KsKit für Eisenbahn.exe
KsKit ist eine Sammlung von Lua-Funktionalität, welche ich auf meinen Anlagen für eine vorbildgerechte Signalisierung einsetze.
2022-04-07 19:46:11 +02:00
Die hier geschilderten Anwendungsfälle und Programmschnipsel stellen kein Komplettpacket dar, sondern sind eher wie ein Kuchen anzusehen, aus denen man sich ein paar Rosinen herauspicken darf.
2022-04-07 18:39:46 +02:00
Aus dem Basisscript dürfen Teile entnommen werden und anderswo verwendet werden, dabei ist die Herkunft und Versionsnummer zu nennen, z.B. als Quellcode-Kommentar.
Die Versionsnummer befindet sich am Anfang des Basisscripts und kann über die Variable `KsKitVer` abgefragt werden.
## Einrichtung
Das KsKit-Verzeichnis wird im EEP-Stammverzeichnis, dort im LUA/ Unterverzeichnis als ganzes hin entpackt.
![So sieht das KsKit-Verzeichnis im Windows Explorer aus](img/einrichtung.png)
Die Einbindung vom Anlagenscript aus erfolgt mittels `require("kskit")`.
**Wichtig**: Wenn KsKit verwendet wird, darf keine EEPMain definiert sein.
Findet EEP die Dateien von Lua nicht, wird im Ereignisfenster eine Liste von Orten ausgegeben, an denen die Dateien gesucht wurden.
Die Orte sind in diesem Fall mit dem Installationsort abzugleichen.
2022-04-08 21:49:24 +02:00
## Allgemeine Hauptsignale
Damit KsKit ein Modell als Hauptsignal ansteuern kann, muss das Signalmodell über eine funktionierende Haltstellung verfügen.
Trotz "Ks" im Namen ist KsKit in der Lage, Signalmodelle unabhängig vom Signalsystem anzusteuern.
Um ein Signal ohne besondere Funktion in KsKit einzutragen, wird die Funktion `Basissignal` verwendet:
```
Basissignal(39, 1)
```
Der erste Parameter ist die ID-Nummer des Signals, der zweite Parameter ist die Haltstellung.
Als Haltstellung verwenden die meisten Signalmodelle die 1, es gibt allerdings Ausnahmen.
Das Aufrufen dieser Funktion legt die notwendigen Callbacks und Funktionen für das Signal an.
Daher darf die Funktion nur einmal während der Initialisierung des Lua-Scriptes aufgerufen werden, nicht aus der EEPMain, MainFunktionen oder vergleichbaren heraus.
![Basissignal mit Anmeldekontakt (gelb) und Signalzugschlussstelle (rot)](img/basissignal.png)
2022-04-08 23:09:29 +02:00
### Signalzugschlussstelle
2022-04-08 21:49:24 +02:00
Für jedes Hauptsignal muss eine Signalzugschlussstelle existieren.
Als Signalzugschlussstelle dient ein Signalkontakt (rot), welcher nach der Überfahrt eines Signals dieses wieder auf den Haltbegriff zurücksetzt.
Dieser Kontaktpunkt befindet nach dem Signal am Ende des Durchrutschweges.
2022-04-08 23:09:29 +02:00
Die Bezeichnung als Zugschlussstelle ist historisch gewachsen, in Epoche V und VI löst die erste Achse des Zuges durch Befahren eines Gleisfreimeldeabschnittes die Haltschaltung aus.
2022-04-08 21:49:24 +02:00
Das Einstellen auf 'Zugschluss' ist daher nicht notwendig.
An dem Signalkontakt muss keine Lua-Funktion eingetragen werden.
Auch die Wirkrichtung muss nicht beschränkt werden, dies bietet sich aber an, damit man über das Kontakt-Symbol leichter erkennen kann, in welcher Richtung das dazugehörige Signal steht.
### Anmelde-Kontakt
Optional zu einem jeden Hauptsignal kann ein Anmeldekontakt verwendet werden.
Ein Anmeldekontakt kann ein Kontakt jeglicher Art sein, an dem die Lua-Funktion "Anmeldung_X" eingetragen wird.
Anstelle "X" wird die ID-Nummer des folgenden Signales eingetragen.
EEP überprüft bei dem Eintragen der Lua-Funktion, ob diese auch existiert, daher kann dieser Kontakt erst korrekt eingerichtet werden, nachdem EEP die `Basissignal`-Funktion ausgeführt hat, z.B. durch Wechsel in den 3D-Modus.
Der Anmelde-Kontakt sollte eingerichtet werden, wenn das vorherige Signal keine automatische Anmeldung durch Weiterschaltung des Zugnamens durchgeführt hat.
Dies trifft auch zu, wenn es kein vorheriges Signal gibt, weil es sich um eine Aufgleisstrecke, eine Ausfahrt eines virtuelles Depots oder um einen ungesicherten Anlagenbereich handelt.
Wird keine Anmeldung durchgeführt und fährt ein Zug unangemeldet an einem logischen Vorsignal vorbei, wird die Anmeldung am jeweiligen Hauptsignal nachgeholt.
Wer sich nicht daran stört, das Signale erst nach Überfahrt des Vorsignales auf Fahrt schalten, kann auf Anmeldungen generell verzichten.
## Lua-Kniffe
2022-04-07 18:39:46 +02:00
Bei der Entwicklung des Basisscriptes haben sich einige Mechanismen als sehr praktisch erwiesen, um die Komplexität des Codes im Zaum zu halten.
2022-04-07 19:46:11 +02:00
Wer auf das KsKit aufbauend noch weitere Funktionalität scripten möchte, sollte sich die folgenden Sektionen zu Rate ziehen.
2022-04-07 18:39:46 +02:00
### Mainfunktionen
Das Basisscript bringt eine eigene EEPMain mit, daher darf von Seiten des Anlagen-Scriptes keine weitere EEPMain definiert werden.
Soll Lua-Code im Rahmen der EEPMain ausgeführt werden, wird mittels MainFunktion() eine Lambda-Funktion registriert.
Als Argument wird eine Funktion übergeben, welche keine Argumente nimmt.
Diese Funktion wird dann in jedem Zyklus einmal aufgerufen.
2022-04-07 19:46:11 +02:00
Dies entspricht dem Beobachter-Muster in der professionellen Softwareentwicklung.
Anstatt in einer zentralen Stelle alle zu informierenden Ziele aufzulisten, kann die EEPMain von verschiedenen Stellen im Quellcode aus "abonniert" werden.
2022-04-07 18:39:46 +02:00
```
MainFunktion(function()
if EEPGetSignalTrainsCount(1) > 0 then
EEPSetSignal(1, 1, 1)
end
end)
```
Dieser Programmcode bindet eine Funktion an die EEPMain.
Die Funktion fragt ab, ob vor einem Signal ein Zug steht und schaltet in diesem Falle das Signal auf Fahrt.
### Signalfunktionen
Analog zu den Mainfunktionen ergibt sich ein ähnliches Problem mit den Signal-Callbacks.
Ein herkömmlicher Signal-Callback kann nur an einer einzigen Stelle definiert werden.
An einigen Stellen ist es jedoch notwendig, das mehrere Stellen über ein Umschalten eines Signals informiert werden wollen.
Mittels der SignalFunktion kann eine Funktion an ein Signal angebunden werden.
2022-04-07 19:46:11 +02:00
Als erstes Argument bei der Anbindung wird die ID des Signales angegeben.
Dabei kann es sich auch um ein Fahrstraßen-Signal handeln.
Als zweites Argument wird eine Funktion eingetragen, welche als erstes Argument die neue Stellung übergeben bekommt.
2022-04-07 18:39:46 +02:00
2022-04-07 19:46:11 +02:00
Der Mehrwert ist schnell ersichtlich: Waren bisher alle zu informierenden Vorsignale, Bahnschranken und dergleichen. in der EEPOnSignal_X() einzutragen, können sich die für die Vorsignale oder Bahnübergänge verantwortlichen Code-stellen nun selbstständig als "Abonnenten" der Signalstellung eintragen.
2022-04-07 18:39:46 +02:00
Als Beispiel wird eine Signalfunktion definiert, welche lediglich die neue Stellung eines Signals ausgibt:
```
SignalFunktion(1, function(Stellung)
print("Signal auf ", Stellung, " umgestellt")
end)
```