jloos Geschrieben 18. September 2023 Geschrieben 18. September 2023 --[[ Auswahl einer Lok im Lokschuppen --]] local AuswahlListe = {} local GKTListe = {$("GKT Lokschuppen Gl 01"), $("GKT Lokschuppen Gl 02"), $("GKT Lokschuppen Gl 03"), $("GKT Lokschuppen Gl 04"), $("GKT Lokschuppen Gl 05"), $("GKT Lokschuppen Gl 06")} for i, GKT in ipairs(GKTListe) do if #layout:getVehiclesOn(GKT) > 0 then table.insert(AuswahlListe, GKT) end end local Anzahl = #AuswahlListe if Anzahl > 0 then local Zufall = math.random(1, Anzahl) local GKT = AuswahlListe[Zufall] --[[ Öffnen der Tore --]] GKT.variables["LokschuppenObjekt"].animations["Tore"]:play(-1, 1) --[[ Wartezeit bis zum Starten der Lok --]] if not deferredCall then defer(3, "Verzögerung") elseif deferredCall == "Verzögerung" then end --[[ ausgewählte Lok starten --]] if GKT.variables["Zug"]:hasEngine() then GKT.variables["Zug"].engine.active = true GKT.variables["Zug"].targetSpeed = 7 end --[[ Wartezeit bis Schließen der Tore --]] if not deferredCall then defer(10, "Verzögerung") elseif deferredCall == "Verzögerung" then end --[[ Schließen der Tore --]] GKT.variables["LokschuppenObjekt"].animations["Tore"]:play(-1, -1) end das Problem: Die Lok wird ausgewählt und auch gestartet. Aber die Torsteuerung geht nicht. danke für Eure Hilfe, Gruß Jürgen
Goetz Geschrieben 18. September 2023 Geschrieben 18. September 2023 Hallo Jürgen, hast du im Protokoll eine Fehlermeldung, die du mit uns teilen möchtest? Vermutlich steckt das Problem in deinen Variablen im jeweiligen Schuppen. Aber die sehe ich hier nicht und kann daher auch nichts genaues dazu sagen. Die Fehlermeldung könnte eventuell Aufschluss darüber geben.
Hawkeye Geschrieben 18. September 2023 Geschrieben 18. September 2023 Hallo @jloos, Welchen Lokschuppen verwendest du denn? vor 56 Minuten schrieb jloos: --[[ Öffnen der Tore --]] GKT.variables["LokschuppenObjekt"].animations["Tore"]:play(-1, 1) Der Lokschuppen mit 6 Türen hat für jedes Tor einen eigenen Animationsnamen. z.B. ["Tor 3"] und nicht ["Tore"] Vielleicht liegt es daran. vor 59 Minuten schrieb jloos: das Problem: Die Lok wird ausgewählt und auch gestartet. Aber die Torsteuerung geht nicht. VG, Hawkeye
jloos Geschrieben 18. September 2023 Autor Geschrieben 18. September 2023 (bearbeitet) Hallo @Goetz und @Hawkeye, ich dachte an einen generellen Fehler in dem script. Es kommt im Ereignisprotokoll keinerlei Fehlermeldung. In jedem Gleiskontakt im Lokschuppen ist die Variable für das Objekt des einzelnen Lokschuppen hinterlegt. Übrigens habe ich eben noch festgestellt, dass die Drehscheibe noch nicht angesteuert wird. Ich hänge die Anlage an. Gruß Jürgen 230918_Lockschuppen.mbp Bearbeitet 18. September 2023 von jloos Rechtschreibung
Hawkeye Geschrieben 18. September 2023 Geschrieben 18. September 2023 vor 1 Stunde schrieb jloos: ich dachte an einen generellen Fehler in dem script. Ja, deine beiden deferredCall -Anweisungen sind falsch. Das entsprechende Tor wird schon geöffnet, aber auch sofort wieder (ohne Verzögerung!) geschlossen. VG, Hawkeye
Goetz Geschrieben 18. September 2023 Geschrieben 18. September 2023 (bearbeitet) vor 2 Stunden schrieb jloos: Es kommt im Ereignisprotokoll keinerlei Fehlermeldung. Eine Fehlermeldung findet man darin nicht, stimmt. Aber einen nützlichen Hinweis: Die Animation startet und sie stoppt anschließend sofort wieder. (Siehe @Hawkeyes Antwort über meiner) Weil die Tore den Befehl zum Öffnen und gleich danach den Befehl zum Schließen bekommen. Der Schließbefehl steht außerhalb deiner Verzögerungen und wird sofort ausgeführt Deine "deferred calls" werden alle ignoriert, denn die Bedingung für "if not deferred call" ist schon "false". Du hast ja vor dem Skript eine Verzögerung stehen und damit ist alles danach schon der Fall "deferred call" Des weiteren haben die Fälle alle denselben Namen "Verzögerung" und können daher nicht unterschieden werden. (Siehe @Hawkeyes Hinweis auf die Hilfe zu defer) Du hattest insofern recht, als du schriebst: vor 2 Stunden schrieb jloos: ich dachte an einen generellen Fehler in dem script. Aber das konnte ich erst erkennen, nachdem ich anhand des Protokolls erkannt habe, was genau falsch läuft. Hier ist ein funktionierendes Skript (einschließlich Drehscheibe): Bitte beachte, dass die Variable GKT nicht local definiert ist. Sie ginge sonst beim wiederholten Aufruf verloren, weil sie innerhalb der if-Verzweigung deklariert wird und somit local nur innerhalb des einen Zweiges Gültigkeit hätte if not deferredCall then --[[ Auswahl einer Lok im Lokschuppen --]] local AuswahlListe = {} local GKTListe = {$("GKT Lokschuppen Gl 01"), $("GKT Lokschuppen Gl 02"), $("GKT Lokschuppen Gl 03"), $("GKT Lokschuppen Gl 04"), $("GKT Lokschuppen Gl 05"), $("GKT Lokschuppen Gl 06")} for i, GKT in ipairs(GKTListe) do if #layout:getVehiclesOn(GKT) > 0 then table.insert(AuswahlListe, GKT) end end local Anzahl = #AuswahlListe if Anzahl == 0 then return end -- wenn es nichts zu tun gibt, beende die Nummer hier! local Zufall = math.random(1, Anzahl) GKT = AuswahlListe[Zufall] $("Drehscheibe 7186").state = GKT.variables["Drehscheibenstellung"] defer(3, "Verzögerung (1)") elseif deferredCall == "Verzögerung (1)" then --[[ Öffnen der Tore --]] GKT.variables["LokschuppenObjekt"].animations["Tore"]:play(-1, 1) --[[ Wartezeit bis zum Starten der Lok --]] defer(3, "Verzögerung (2)") elseif deferredCall == "Verzögerung (2)" then --[[ ausgewählte Lok starten --]] if GKT.variables["Zug"]:hasEngine() then GKT.variables["Zug"].engine.active = true GKT.variables["Zug"].targetSpeed = 7 end --[[ Wartezeit bis Schließen der Tore --]] defer(15, "Verzögerung (3)") elseif deferredCall == "Verzögerung (3)" then --[[ Schließen der Tore --]] GKT.variables["LokschuppenObjekt"].animations["Tore"]:play(-1, -1) end Du musst die 3 Sekunden Verzögerung über dem Skript (in der grafischen EV) bitte löschen! Die ist jetzt in dieses Skript integriert, damit die einzelnen Verzögerungen unterschieden werden können. Viele Grüße Götz Bearbeitet 18. September 2023 von Goetz Ergänzungen
jloos Geschrieben 19. September 2023 Autor Geschrieben 19. September 2023 Hallo, soweit geht alles. Ich habe es aber nur mit einer Variablen unter Ereignisse hinbekommen. Ich würde gerne die Variable $("Ereignisse").variables["gefundener GKT im LK"] durch eine lokale Variable ersetzen. Das habe ich nicht geschafft. Bitte um Hilfe, Gruß Jürgen if not deferredCall then defer(3, "Verzögerung") elseif deferredCall == "Verzögerung" then --[[ Auswahl einer Lok im Lokschuppen --]] local AuswahlListe = {} local GKTListe = {$("GKT Lokschuppen Gl 01"), $("GKT Lokschuppen Gl 02"), $("GKT Lokschuppen Gl 03"), $("GKT Lokschuppen Gl 04"), $("GKT Lokschuppen Gl 05"), $("GKT Lokschuppen Gl 06")} for i, GKT in ipairs(GKTListe) do if #layout:getVehiclesOn(GKT) > 0 then table.insert(AuswahlListe, GKT) end end local Anzahl = #AuswahlListe if Anzahl > 0 then local Zufall = math.random(1, Anzahl) $("Ereignisse").variables["gefundener GKT im LK"] = AuswahlListe[Zufall] end $("Drehscheibe 7186").state = $("Ereignisse").variables["gefundener GKT im LK"].variables["Drehscheibenstellung"] $("Ereignisse").variables["gefundener GKT im LK"].variables["LokschuppenObjekt"].animations["Tore"]:play(-1, 1) defer(5, "Verzögerung (2)") elseif deferredCall == "Verzögerung (2)" then local v = $("Ereignisse").variables["gefundener GKT im LK"].variables["Zug"] if v:hasEngine() then v.engine.active = true v.targetSpeed = 10 end defer(10, "Verzögerung (3)") elseif deferredCall == "Verzögerung (3)" then $("Ereignisse").variables["gefundener GKT im LK"].variables["LokschuppenObjekt"].animations["Tore"]:play(-1, -1) end
Goetz Geschrieben 19. September 2023 Geschrieben 19. September 2023 vor einer Stunde schrieb jloos: Ich würde gerne die Variable $("Ereignisse").variables["gefundener GKT im LK"] durch eine lokale Variable ersetzen. Hast du überlesen, was ich dir dazu geschrieben habe?
Goetz Geschrieben 19. September 2023 Geschrieben 19. September 2023 Hallo @jloos, dein Problem wird durch die falsche Verwendung des local Schlüsselwortes verursacht. Öffne bitte die Seite Lua: demo in deinem Browser und gibt dort das folgende Skript ein: for i = 1, 3 do if i == 1 then local test = "Hallo" print(test) elseif i == 2 then print(test) else print(test) end end Du wirst sehen, dass du im Ergebnis nur einmal das Wort Hallo und zweimal nil bekommst. Entferne das Schlüsselwort local in der dritten Zeile Diesmal bekommst du dreimal das Wort Hallo als Ausgabe Begründung: local schränkt die Gültigkeit einer Variablen auf den Block ein, in welchem die Variable deklariert wird. Wenn du eine Variable local innerhalb eines Zweiges deiner if-Verzweigung definierst, dann gilt diese Variable auch nur innerhalb dieses einen Zweiges. In den anderen Zweigen derselben if-Verzweigung ist die Variable nicht bekannt. Deshalb steht in meinem Beispielskript für deinen Lokschuppen vor dem Variablennamen GKT nicht das local Schlüsselwort. Viele Grüße Götz
jloos Geschrieben 19. September 2023 Autor Geschrieben 19. September 2023 vor 32 Minuten schrieb Goetz: Hast du überlesen, was ich dir dazu geschrieben habe? ja, ich habe mich nur auf die nicht funktionierenden deferred calls konzentriert und bin dann durch probieren mit der grafischen EV auf meine jetzige Lösung gekommen. Ich habe in der Tat nicht weitergelesen. Deshalb habe ich auch nicht Dein funktionierendes script beachtet. mea culpa Jetzt noch eine Verständnisfrage. local Zufall = math.random(1, Anzahl) GKT = AuswahlListe[Zufall] local Zufall ist eine lokale Variable Zufall GKT ist dann eine Variable, die innerhalb des gesamten scripts zur Verfügung steht, hat aber nichts mit den Variablen zu tun, die ich in der EV definieren kann. PS: ich habe mit Programmiersprachen nie was zu tun gehabt und lerne bei jeder meiner Anfragen dazu. Nächstes Mal werde ich die komplette Nachricht lesen. Vielen Dank für die Hilfe, Gruß Jürgen
Goetz Geschrieben 19. September 2023 Geschrieben 19. September 2023 vor 1 Minute schrieb jloos: local Zufall ist eine lokale Variable Zufall GKT ist dann eine Variable, die innerhalb des gesamten scripts zur Verfügung steht, hat aber nichts mit den Variablen zu tun, die ich in der EV definieren kann. korrekt
jloos Geschrieben 19. September 2023 Autor Geschrieben 19. September 2023 @Goetz, Deine Antwort hat somit meine Frage beantwortet, danke Gruß Jürgen
Goetz Geschrieben 19. September 2023 Geschrieben 19. September 2023 Hallo @jloos, ein bisschen muss ich das noch erweitern: Ohne das Schlüsselwort local gilt GKT über dieses Skript hinaus in allen Skripten dieser Anlage. So, wie eine Modul- oder Objektvariable auch. Aber im Gegensatz zu Modul- und Objektvariablen geht sie beim Beenden der Anlage verloren und wird nicht mit der Anlage gespeichert. Wenn du also in anderen Skripten derselben Anlage denselben Variablennamen wieder verwendest, dann überschreibst du den Inhalt dieser Variablen und bekommst bei verzögerten Aufrufen falsche Ergebnisse! Viele Grüße Götz
jloos Geschrieben 19. September 2023 Autor Geschrieben 19. September 2023 Sehr guter Hinweis, danke @Goetz Gruß Jürgen
Goetz Geschrieben 19. September 2023 Geschrieben 19. September 2023 Was ich noch sagen wollte: vor einer Stunde schrieb jloos: ich [...] bin dann durch probieren mit der grafischen EV auf meine jetzige Lösung gekommen. Dafür hast du meinen Respekt!
jloos Geschrieben 20. September 2023 Autor Geschrieben 20. September 2023 Hallo @Goetz, die Routine für das zufällige Auswählen einer Lok mit der Zwischentabelle ist aber von Dir. Gruß Jürgen
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen.
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden