Automatisierung mit Lua Skript

Hallo EdDie,

Das Installationsprogramm aktualisiert normalerweise beides. Sie könnten versuchen, Traintastic zuerst zu deinstallieren und dann neu zu installieren. (Alle Weltdaten bleiben erhalten.)

Ja, ich habe einige Änderungen vorgenommen, die den Fehler verursacht haben. Anstelle des Eingabeereignisses sollten Sie nun eine Verbindung zum Sensorereignis herstellen.

Sie müssen mindestens Build 1719 oder neuer verwenden, da die vorherige Version einen Fehler enthielt.

Ändern Sie hier die Eingangs-IDs in die IDs der Sensoren auf der Schalttafel:

local start_sensor = world.get_object("input_837")
local end_sensor = world.get_object("input_832")

Ändern Sie den Ereignishandler zu:

end_sensor.on_state_changed(function(value)

if value == enum.sensor_state.OCCUPIED then

Gruß Reinder

P.S.: Wenn Sie Lua-Code posten, setzen Sie vor den Code ```lua und hinter den Code ``` ein, dann wird er schön als Code dargestellt.

Hallo Reinder,

ich brauche nochmal eine Hilfestellung. Bei folgendem Skript soll eine Lok zwischen zwei Blöcken plendeln sowie aber ein Sensor ausgelöst wird stürzt Traintastic ab. Wo liegt der Fehler, was mache ich falsch?

-- Initialisierung

local throttle = class.create_throttle("throttle_1")

local train = world.get_object("train_1")

throttle.acquire(train, true)

-- Sensoren

local sensor1 = world.get_object("input_833") -- Block 1

local sensor2 = world.get_object("input_837") -- Block 2

-- Blöcke

local block1 = world.get_object("block_1")

local block2 = world.get_object("block_2")

-- Startzustand

local state = "to_block2"

local wait = 0 -- Wartezeit in Ticks

-- Hilfsfunktionen

local function stop()

throttle.set_speed(0, enum.speed_unit.KMPH)

end

local function drive(speed)

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

end

local function set_direction(dir)

throttle.set_direction(dir)

end

local function block_free(block)

return block and block.is_occupied \~= nil and not block.is_occupied

end

-- Sensor: Zug erreicht Block 2

sensor2.on_state_changed(function(value)

if value == enum.sensor_state.OCCUPIED and state == "to_block2" then

stop()

set_direction(enum.direction.REVERSE)

wait = 1 -- z. B. 1 Minuten warten

state = "waiting_to_block1"

end

end)

-- Sensor: Zug erreicht Block 1

sensor1.on_state_changed(function(value)

if value == enum.sensor_state.OCCUPIED and state == "to_block1" then

stop()

set_direction(enum.direction.FORWARD)

wait = 1

state = "waiting_to_block2"

end

end)

-- Uhr-Tick: alle 60 Sekunden

world.clock.on_tick(function(time)

if wait > 0 then

wait = wait - 1

if wait == 0 then

if state == "waiting_to_block1" and block_free(block1) then

drive(10)

state = "to_block1"

elseif state == "waiting_to_block2" and block_free(block2) then

drive(10)

state = "to_block2"

end

end

end

end)

-- Startfahrt

set_direction(enum.direction.FORWARD)

drive(10)

Ich glaube, der Absturz wird durch einen Fehler verursacht, den ich kürzlich behoben habe. Welche Version von Traintastic verwenden Sie? Sie sollten mindestens Build 1719 oder neuer verwenden: Traintastic development builds

Tolle Skriptarbeit, ich finde es toll, dass Lua verwendet wird.

Hallo Reinder,

der Absturz lag daran das Build 1719 noch nicht vollständig installiert war. Jetzt funktioniert es wieder.

Ich versuche, in einem Lua-Skript zu prüfen, ob ein Block belegt ist, indem ich block. is_oppupied verwende. Die Blöcke sind korrekt im Editor angelegt, mit Sensoren verknüpft und die Lok fährt auch wie erwartet. Aber block.is_oppupied liefert immer nil. Ist diese Funktion in der Version 1719 schon funktionsfähig oder muß man die Blockbelegung noch manuell verwalten? Ziel ist es, einen Pendelzug zu steuern, der nur losfährt, wenn der Zielblock frei ist – später auch mit mehreren Zügen. Hier noch der Testskript.

local block2 = world.get_object("block_2")

world.clock.on_tick(function(time)
  log.debug("Block 2 belegt: " .. tostring(block2 and block2.is_occupied))
end)

Gut zu hören, dass der Absturz behoben ist.

Das Blockobjekt hat keine Eigenschaft „is_occupied“, daher ist es „nil“. Siehe: Block rail tile - Traintastic manual (Das Blockobjekt unterstützt auch verschiedene Ereignisse, die Sie verwenden können.)

Um zu überprüfen, ob ein Block frei/belegt ist, müssen Sie die Eigenschaft „trains“ lesen. Wenn der Block frei ist, ist die Tabelle leer, wenn er reserviert oder belegt ist, enthält sie ein Element.

local block2_free = (#block2.trains == 0)

if #block2.trains > 0 then
  log.debug(block2.trains[1].train)
  log.debug(block2.trains[1].block)
  log.debug(block2.trains[1].direction)
end

Wenn der Block mindestens einen Sensor in den Blockeinstellungen konfiguriert hat, markiert Traintastic den Block als belegt/rot, wenn der Sensor aktiviert ist.

Traintastic kann auch Zugbewegungen verfolgen. Wenn Sie einem Block einen Zug zuweisen und ihn manuell oder per Skript zu einem anderen Block fahren, bewegt er sich ebenfalls dorthin. (Wenn sich dazwischen Weichen befinden, stellen Sie sicher, dass die Position übereinstimmt, da Traintastic sonst den Zug verliert.)

@EdDie

Ich habe den Block state in Lua verfügbar gemacht, siehe Block rail tile - Traintastic manual

P.S.: Du musst auf die neueste Entwicklungsversion aktualisieren :slight_smile:

Hallo Reinder,

ich habe die neuste Entwicklerversion 1726 installiert. Jetzt habe ich auch unter Linux das Problem das sich der Luaeditor und auch das Anlagenfenster nicht mehr öffnen lässt. Ich kann praktisch nichts mehr machen. Auch mehrfache Versuche mit deinstallieren und neu laden oder Laptop neu starten hat nichts gebracht.

Gruß EdDie

Hallo Reinder,

die Sache mit dem Luaeditior der sich nicht öffnet hat sich erledigt. Das war mein Fehler. Enschuldigung.

Gruß EdDie

Kein Problem, danke für die Nachricht.

Hallo Reinder,

ich möchte mit Lua einige Ausgänge schalten was mir nicht gelingen will. Ich habe im Anlagenplan testweise zwei Schalter angelegt damit kann ich die Ausgänge schalten. Wie geht das mit Lua?

Gruß EdDie

Hallo Eddie,

In Lua können Sie die Ausgänge mithilfe der Schnittstellenfunktion get_output umschalten. Siehe: DCC-EX interface - Traintastic manual

Diese Funktion gibt ein Ausgangsobjekt zurück, mit dem der Ausgang gesteuert werden kann.

Ein Beispiel: Control output on world run/stop - Traintastic manual