Jump to content

mein script geht nicht


jloos

Recommended Posts

--[[
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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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"]

Screenshot2023-09-18162600.thumb.jpg.15f65432a82d672c4e27af522628c3a5.jpg

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

Link to comment
Share on other sites

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

Edited by jloos
Rechtschreibung
Link to comment
Share on other sites

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.  

Screenshot2023-09-18182720.thumb.jpg.3139adc24efdf2494ca1140d660c2ec3.jpg

VG,

Hawkeye

Link to comment
Share on other sites

vor 2 Stunden schrieb jloos:

Es kommt im Ereignisprotokoll keinerlei Fehlermeldung.

Eine Fehlermeldung findet man darin nicht, stimmt.
Aber einen nützlichen Hinweis:

ProtokollLokschuppenTore.thumb.jpg.50d44a5089c493b00f4cce8abe5d8801.jpg

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

Edited by Goetz
Ergänzungen
Link to comment
Share on other sites

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


 

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...