Automatisierung mit Lua Skript

Erstmal großes Lob an die Entwickler von Traintastic. Ich beobachte das schon ein paar Jahre und staune über die Fortschritte. Ich hoffe das es in Ordnung ist wenn ich in deutsch schreibe. Ich bin kein Programmierer und versuche mich mit dem Lua Skript. Leider habe ich bis jetzt noch nicht viel zu Laufen gebracht. Für mich wäre es sehr gut wenn es ein paar mehr Beispiele gäbe. So etwas wie schaltet man eine Weiche, wie bringe ich einen Zug zum fahren, wie besetzte ich einen Block oder wie kann ich durch einen Rückmelder eine Aktion auslösen. Vieleicht hat mal jemand Zeit da etwas zu machen.

Besten Gruß

EdDie

Hallo @EdDie,

Willkommen im Forum, Deutsch schreiben ist kein Problem. Es freut mich zu hören, dass Sie das Projekt schon seit einigen Jahren verfolgen.

Ich arbeite derzeit intensiv am Handbuch, daher bin ich für das Feedback zu den fehlenden Beispielen sehr dankbar.

Welche Version von Traintastic verwenden Sie? Am besten ist die neueste Entwicklungsversion.

Weiche mit Lua schalten

-- Weichenobjekt abrufen
turnout = world.get_object("turnout_1") -- "turnout_1" ist die ID der Weiche

-- Position auf gerade ändern:
result = turnout.set_position(enum.turnout_position.STRAIGHT)

-- Protokollieren Sie das Ergebnis
log.debug(‚turnout set_position returned‘, result) -- Dies wird in der Konsole angezeigt.

Die möglichen Positionswerte hängen vom Typ der Weiche ab. Eine Liste der möglichen Werte finden Sie hier:

Informationen zu set_position finden Sie hier:

Dies ist die Weiche links 45°, aber es gilt für alle Weichen, da sie alle die gleiche Funktion set_position haben.

Einen Zug mit Lua fahren

Um einen Zug mit Lua zu fahren, benötigen Sie einen Regler. In Traintastic kann nur ein Regler die Steuerung eines Zuges übernehmen.

-- Erstellen Sie ein Reglerobjekt:
throttle = class.create_throttle("test") -- "test" ist der Name des Reglers

-- Zug abrufen
train = world.get_object("train_1") -- ID des Zuges in Traintastic

-- Kontrolle über den Zug übernehmen (erwerben)
throttle.acquire(train, true) -- true bedeutet, die Kontrolle zu übernehmen, auch wenn jemand anderes die Kontrolle hat (steal)

-- Geschwindigkeit einstellen:
throttle.set_speed(40, enum.speed_unit.KMPH)

-- Richtung einstellen:
-- Hinweis: Eine Richtungsänderung ist nur zulässig, wenn der Zug steht.
throttle.set_direction(enum.direction.FORWARD)

-- Zug notbremsen:
throttle.emergency_stop()

Eine Aktion mit einem Feedback-Modul auslösen

Zuerst müssen Sie ein Eingabeobjekt für die Feedback-Adresse erstellen, dann können Sie im Skript den Lua-Code ausführen:

-- Fügen Sie hier den Code zum Erstellen und Abrufen des Throttles ein.

-- "input_1" ist die ID der Eingabeobjekt
world.get_object("input_1").on_value_changed(
  function (value)
    if value then -- belegt
      throttle.emergency_stop() -- sicherstellen, dass der Zug vor dem Richtungswechsel angehalten hat
      throttle.set_direction(enum.direction.FORWARD)
      throttle.set_target_speed(40, enum.speed_unit.KMPH)   
    end
  end)

Wenn Sie den Wert einer Variablen sehen möchten, ist log.debug() Ihr Freund. Die Konsole zeigt den Wert der Variablen an.

Ich hoffe, das hilft Ihnen für den Anfang. Zögern Sie nicht, Fragen zu stellen :slight_smile:

Mit freundlichen Grüßen,
Reinder

Hallo Reinder,

danke für die schnelle Antwort. Das hilft mir enorm mich in Lua einzuarbeiten. Seit heute habe ich ein ganz anderes Problem. Wenn ich meine Welt geladen habe kann ich den Lua-Editor nicht mehr öffnen. Egal ob im Bearbeitungs oder Betriebsmodus ich kann machen was ich will er öffnet sich nicht mehr. Ich habe Traintastic und auch den PC schon mehrfach neu gestartet aber es geht nicht mehr. Ich verwende Win 10 und die neuste Entwicklerversion von Traintastic. Wenn ich eine neue Welt erstelle funktioniert es . Was kann ich machen?

Gruß EdDie

Es tut mir leid zu hören, dass Lua in Ihrer Welt nicht verfügbar ist. Ich glaube, dass etwas mit der Welt-Datei nicht stimmt.
Wenn Sie die Welt geladen haben, öffnen Sie die Welteigenschaften. Dort wird eine UUID angezeigt, die etwa so aussieht: 7cb74911-c21d-4e63-a24e-a65da7b47a55 (sie ist für jede Welt unterschiedlich).

Wenn Sie mit der rechten Maustaste auf das Traintastic-Symbol neben der Uhr klicken, öffnet sich ein Popup-Menü. Wählen Sie “Advanced”“Open data directory” oder öffnen Sie den Dateimanager und fügen Sie %localappdata%\traintastic\server in die Adressleiste ein.

Suchen Sie im “world” ordner nach der Datei mit dem gleichen Namen wie die UUID, die Erweiterung lautet .ctw. Laden Sie diese bitte hier hoch. Dann werde ich untersuchen, warum sie nicht richtig geladen wird.

Gruß Reinder

6947c707-6bd8-4365-950f-5062a94053c9.ctw (4.3 KB)

Danke für die Datei, ich habe deine Welt in Traintastic importiert. Siehe Bild unten:

Wenn ich den Bearbeitungsmodus aktiviere (Bleistift oben rechts), kann ich die Skripte bearbeiten. (Der Bearbeitungsmodus muss aktiviert sein und das Skript muss zum Bearbeiten angehalten werden.)

Können Sie einen Screenshot Ihres posten?


Für das Layout habe ich ein paar Tipps:
– Die Größe der Blöcke lässt sich mithilfe des diagonalen Pfeils in der Symbolleiste ändern.
– Einige Blöcke sind horizontal ausgerichtet, sie müssen jedoch vertikal ausgerichtet sein, da die Schiene vertikal verläuft.

Ein Beispiel (aus dem Handbuch):

Siehe: Drawing basics - Traintastic manual (Englisch)

Hallo Reinder,

das Problem das sich der Luaeditor nicht mehr öffnet besteht immer noch. Das es nur im Bearbeitungsmodus geht hatte ich schon im Handbuch gelesen und auch so gemacht. Jetzt habe ich versucht eine neue Welt anzulegen. Am Anfang ließ sich der Editor öffnen. Nun habe ich alles gemacht und gespeichert und habe dasselbe Problem der Luaeditor öffnet sich nicht mehr. Im Anhang ist ein Foto und die CTW Datei.

Gruß EdDie

80f92692-38f3-45ed-b721-ac93f874f65c.ctw (1.7 KB)

Hallo EdDie,

Die CTW-Daten sind korrekt. Wenn ich die Welt importiere, kann ich die Skriptliste über ObjekteLua-Skripte öffnen. Durch Umschalten in den Bearbeitungsmodus kann ich ein neues Skript erstellen und bearbeiten.

Ich möchte gerne bei der Lösung des Problems helfen, verstehe aber noch nicht, was genau schief läuft.

Gruß Reinder

P.S.: Die deutsche Übersetzung wurde mit einem automatisierten Übersetzungstool erstellt. Wenn Sie Fehler oder Verbesserungsmöglichkeiten in der Übersetzung entdecken, lassen Sie es mich bitte wissen. Siehe: Help translate Traintastic - make it available in your language

Hallo Reinder,

ich weiß nicht ob das Problem mein PC sein könnte. Ich habe Traintastic jetzt auch auf einem Laptop wo Linux läuft installiert da funktioniert alles wunderbar. Die Übersetzung im Handbuch ist in Ordnung und verständlich. Ich habe nun meine ersten Erfahrungen mit Lua gemacht und jetzt kommen auch Fragen auf. Wie macht man z.B. eine Pause. Man muss ja einen Zug auch mal im Bahnhof warten lassen.

Gruß EdDie

Gut zu hören, dass es unter Linux funktioniert. Ich frage mich immer noch, was unter Windows schief läuft. Wenn Sie auf den Menüpunkt „Lua-Skript“ klicken, erscheint das Dialogfeld nicht?

Derzeit unterstützt Traintastic keine Bahnhöfe/Wartezeiten. Diese Funktion wird in Zukunft hinzugefügt. Mit ein wenig Skripting könnte dies jedoch bereits möglich sein.

Traintastic hat eine (schnelle) Uhr. In Lua können Sie das Skript so einstellen, dass es jede Minute etwas ausführt.

world.clock.on_tick(
  function (time)
    log.debug(time)
  end)

Wenn der Zug im Bahnhof steht, können Sie eine Variable auf z. B. zehn setzen und dann in der Funktion „on_tick“ bei jedem Tick um eins verringern. Wenn sie Null erreicht, starten Sie den Zug.

world.clock.on_tick(
  function (time)
    if wait > 0 then
       wait = wait - 1
       if wait == 0 then
          -- set train speed
       end
    end
  end)

Siehe: Clock - Traintastic manual

Hallo Reinder,

ja so ist es wenn unter Windows auf Lua Skripte klicke erscheint kein Dialogfeld. Das ist aber nur so wenn schon ein Skript geschrieben wurde. Ich hatte ja nochmal versucht unter Windows eine neue Welt anzulegen. Beim ersten öffnen des Dialogfeldes hat es funktioniert und als ich dann einen Skript geschrieben hatte und das Dialogfeld wieder öffnen wollte ging es nicht mehr.
Die Sache mit der Wartezeit im Bahnhof so wie Sie es beschrieben haben geht bei mir nur teilweise. Ich müsste das in Millisekunden einstellen können um z.B. einen Entkuppler richtig zu überfahren. Was mir auch noch nicht gelungen ist das langsame Anhalten eines Zuges. Dann hätte ich noch eine Frage. Ist es zur Zeit schon möglich mit Traintastic und Lua einen Blockbetrieb mit mehreren Zügen hinzubekommen?

Gruß EdDie

Wenn Sie mindestens ein Lua-Skript erstellt haben, sollte sich auf der rechten Seite der unteren Statusleiste ein Lua-Symbol befinden. Durch Klicken auf das Logo sollte sich auch die Skriptliste öffnen, funktioniert das?

Welche Art von Bewegung am Entkoppler? Etwas wie „vorwärts/rückwärts mit Geschwindigkeit X für Y ms fahren”?

Der Skript-Throttle hat zwei Funktionen zur Geschwindigkeitssteuerung:

  • set_speed – Ändert die Geschwindigkeit sofort
  • set_target_speed – Beschleunigt/bremst langsam

Traintastic kann Züge verfolgen, die sich von Block zu Block bewegen, es gibt noch keine Unterstützung für das automatische Fahren von einem Block zu einem anderen Block, dies wird natürlich in Zukunft unterstützt werden

Hallo Reinder,

ich habe heute nochmal Traintastic mit Windows getestet. Das der Lua Editor nicht mehr geöffnet wird könnte am speichern liegen. Ich habe wieder eine neue Testwelt angelegt und darauf geachtet das ich vor dem Programm beenden auf Welt speichern klicke. Das funktioniert. Wenn man Trantastic wieder startet ist auch alles wieder da.

Die Sache mit dem Warten bzw. Pause meine ich so das es gut wäre wenn man das Auslösen eines Rückmelders verzögern könnte und das möglichst in Millisekunden.

Aha, das leuchtet ein, das Speichern ist erforderlich, es wird nicht automatisch gespeichert, das sollte man hinzufügen.

Ja, das fehlt derzeit noch. Ich habe gerade einige Änderungen an der Eingabe vorgenommen, es ist nicht mehr erforderlich, Eingabeobjekte zu erstellen, man kann jetzt die Schnittstelle und die Adresse am Objekt auswählen. Ich werde mich jetzt daran machen, das Auslösen eines Rückmelders zu verzögern.

Hallo EdDie,

Gestern habe ich Verzögerungseinstellungen zum Filtern der Eingangssignale hinzugefügt. Ein Beispiel:

Die Verzögerung kann in Schritten von 50 ms eingestellt werden.

In Lua können Sie den gefilterten Eingangswert über das Ereignis on_state_changed des Sensors verwenden.

Hallo Reinder,

ich habe heute die neuste Trantastic Version installiert. Unter Linux zeigt mir mein System das alles aktuell ist wenn ich Traintastic öffne zeigt es mir ganz oben links im Fenster aber immer noch die alte Version an und es hat sich auch nichts verändert. Was mache ich da falsch?

Gruß EdDie

Hallo,

Haben Sie neue Versionen aller drei (traintastic-data, traintastic-server, traintastic-client) Pakete installiert und die Client- und Serverprogramme neu gestartet?

Ja, ich habe all drei Pakete installiert. Wie muß ich das mit dem neu starten der Client-und Serverprogramme machen. Ich starte das ganz normal über mein Programmverzeichnis.

Sie führen traintastic-server nicht als systemd-Dienst aus?

Können Sie einen Screenshot der Info-Dialoge posten?

  • Hilfe → Über
  • Werkzeuge → Server → Über den Server

Hallo Reinder,

ich habe das alles nochmal neu installiert. Jetzt sollte es gehen nur die aktuelle Version wird oben links im Traintasticfenster nicht angezeigt. Der Server zeigt aber die neuste Version.

Dann habe ich mal noch eine andere Frage. Ich habe ein Luaskript gemacht bei dem eine Lok einfach nur hin und her fährt. Das hat auch funktioniert.

local throttle = class.create_throttle("auto_throttle")

local train = world.get_object("train_1")

throttle.acquire(train, true)

local start_sensor = world.get_object("input_837")

local end_sensor = world.get_object("input_832")

\-- Funktion: Zug sicher anhalten

local function safe_stop()

throttle.emergency_stop()

end

\-- Funktion: Richtung sicher ändern

local function set_direction(dir)

throttle.set_direction(dir)

end

\-- Funktion: Geschwindigkeit setzen

local function set_speed(kmph)

throttle.set_target_speed(kmph, enum.speed_unit.KMPH)

end

\-- Ziel erreicht → Rückfahrt

end_sensor.on_value_changed(function(value)

if value then

safe_stop()

change_direction(enum.direction.REVERSE)

set_speed(10)

end

end)

\-- Start erreicht → Hinweg

start_sensor.on_value_changed(function(value)

if value then

safe_stop()

change_direction(enum.direction.FORWARD)

set_speed(10)

end

end)

\-- Startfahrt

change_direction(enum.direction.FORWARD)

set_speed(10)

Jetzt tritt bei end_sensor.on_value_changed(function(value) ein Fehler auf. Hat sich da etwas geändert?

Gruß EdDie