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.
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.
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)
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.)
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.
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?