Jump to content

Empfohlene Beiträge

Geschrieben

Doch, das gibt es, Heinz

Das folgende Skript funktioniert:

n = 1

repeat
  n = n + 1
until n == 5

$("Beschriftung 1").text = n
$("Beschriftung 2").text = "done"

 

Geschrieben

Ich habe folgendes Skript erstellt:

repeat
  local t = (function ()
    if not deferredCall then
      $("AmpelNS").state = 1
      $("AmpelOW").state = 3
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(10, "Verzögerung")
    elseif deferredCall == "Verzögerung" then
      $("AmpelNS").state = 2
      $("AmpelOW").state = 4
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(2, "Verzögerung (2)")
    elseif deferredCall == "Verzögerung (2)" then
      $("AmpelNS").state = 3
      $("AmpelOW").state = 1
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(10, "Verzögerung (3)")
    elseif deferredCall == "Verzögerung (3)" then
      $("AmpelNS").state = 4
      $("AmpelOW").state = 2
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(2, "Verzögerung (4)")
    elseif deferredCall == "Verzögerung (4)" then

    end
      return {}
    end)()
    for i, Wdh in ipairs(t) do
    end
until $("Kippschalter Ampel").state==0

Leider wird es nach einem Durchlauf mit Fehlermeldung "Maximum instruction count reached" beendet. Kannst Du da was mit anfangen?

Geschrieben
vor 15 Minuten schrieb BauerHeini:

Kannst Du da was mit anfangen?

Das wäre für mich leichter, wenn du dein Skript in ein entsprechendes Fenster setzt, Der Knopf dafür ist <>

Vielen Dank :-)

Geschrieben
repeat
  local t = (function ()
    if not deferredCall then
      $("AmpelNS").state = 1
      $("AmpelOW").state = 3
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(10, "Verzögerung")
    elseif deferredCall == "Verzögerung" then
      $("AmpelNS").state = 2
      $("AmpelOW").state = 4
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(2, "Verzögerung (2)")
    elseif deferredCall == "Verzögerung (2)" then
      $("AmpelNS").state = 3
      $("AmpelOW").state = 1
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(10, "Verzögerung (3)")
    elseif deferredCall == "Verzögerung (3)" then
      $("AmpelNS").state = 4
      $("AmpelOW").state = 2
      $("Beschriftung Ampel").text = $("AmpelNS").state
      defer(2, "Verzögerung (4)")
    elseif deferredCall == "Verzögerung (4)" then

    end
      return {}
    end)()
    for i, Wdh in ipairs(t) do
    end
until $("Kippschalter Ampel").state==0

So?

Geschrieben (bearbeitet)

Also,
was du da versuchst, ist nicht der Sinn und Zweck von "repeat". Das ist nicht dafür gedacht, dass man auf die Änderung äußerer Umstände wartet. Das ist für Lua-interne Dinge. Beispielsweise kannst du damit einen Datensatz durchsuchen, bis du ein bestimmtes Element gefunden hast.

Du musst dir bitte vor Augen halten, dass hier zwei Programme - Lua und das MBS - parallel laufen. Lua kann dem MBS sagen, was es tun soll. Aber ausführen muss es das MBS. Und solange du in dieser Lua Schleife steckst, kriegst du Änderungen von außen gar nicht mit.

In deinem Fall wird die Geschichte noch durch die Verzögerungen erschwert. Denn die haben nichts mit Lua zu tun. Die sind ein cleveres Konstrukt, welches Neo im MBS implementiert hat. Sie sorgen dafür, dass dasselbe Skript nach Ablauf einer Zeit erneut aufgerufen wird. Bei diesem Aufruf wird eine Variable gesetzt, die in Lua ausgewertet wird um zu unterscheiden, an welcher Stelle es weitergehen soll. Das funktioniert aber nur, wenn das Skript zuvor verlassen wird. Und das verhindert dein repeat leider.

Du musst dir eine andere Taktik ausdenken. Weder "repeat", noch seine Geschwister ("while" etc.) sind für diesen Zweck geeignet.

Lieben Gruß
Götz

Bearbeitet von Goetz
Geschrieben

Ok, verstanden. Danke. Leider habe ich große Probleme mit dem Timer, den Du in Deinem Beispiel eingebaut hast.

Wie kann man mein Skript dann ohne die Repeat-Schleife wiederholt aufrufen?

Geschrieben
vor 2 Minuten schrieb BauerHeini:

Leider habe ich große Probleme mit dem Timer

Dann sollten wir diese Probleme lösen.
Kannst du sie beschreiben?

Geschrieben

In meinem Beispiel ist kein Timer im Einsatz.

Scroll bitte im Ereignis "Ampelsequenz" ganz nach unten.

Dort findest du unter der Bedingung "Schalter steht auf an" den Aufruf des Ereignisses "Ampelsequenz".

Ampelsequenz ist ein "benutzerdefiniertes Ereignis". Das bedeutet, dass du es wie eine Funktion aufrufen kannst.
Bei mir geschieht der erste Aufruf dann, wenn der Schalter auf "an" umgeschaltet wird. Und zum Schluss ruft sich dieses Ereignis selbst wieder auf. Bei diesem erneuten Aufruf werden die Adressen von Ampel 1 und Ampel 2 vertauscht. Sprich: Der Inhalt der Variablen "Ampel 2" wird an das Argument "Ampel 1" übergeben und umgekehrt.

So muss ich den Ablauf "Rot - Rot, Gelb - Grün - Gelb" nur einmal schreiben und kann ihn im Wechsel für die Achse Nord-Süd oder Ost-West verwenden.

Wenn du stattdessen einen Timer verwenden möchtest, dann musst du zuerst die Sequenz so vervollständigen, dass sie den kompletten Zyklus für alle Ampeln enthält. Du benötigst dann keine Variablen "Ampel 1" und "Ampel 2", sondern adressierst die Ampeln direkt. Mit dem Schalter bedienst du nur noch den Timer. Und wenn der abgelaufen ist, löst du die Ampelsequenz aus. Die Dauer des Timers muss einem kompletten Zyklus entsprechen.

 

Geschrieben

Ok. Ich kam nur darauf, weil unter dem Ereignis "Ampelsequenz" ein Eintrag "Verzögerung" steht. Das andere werde ich mal durcharbeiten. Vielen Dank für den Kurs. Was bekommst Du dafür;)

Hast Du eigentlich auch einmal Freizeit?

Liebe Grüße

Heinz

P.S.

Muss mich jetzt mal um meine Enkel kümmern, die ich  über Ostern zu Besuch habe.

Geschrieben
vor 15 Minuten schrieb BauerHeini:

weil unter dem Ereignis "Ampelsequenz" ein Eintrag "Verzögerung" steht

Der Eintrag steht immer dann unter Ereignissen, wenn in der Aktionsliste Verzögerungen enthalten sind und eine dieser Verzögerungen gerade läuft ...

266403945_Verzgerungen.jpg.f69c00b8152780d1e896c8a71c1aeb56.jpg

Da sich dieses Ereignis immer wieder selbst aufruft und die Aktionen zwischen den Verzögerungen in Bruchteilen von Sekunden erledigt werden, steht bei der Ampelsequenz permanent "Verzögerungen" drunter. Es sei denn, du schaltest die Ampel mit dem Kippschalter ganz ab. Dann verschwindet der Eintrag am Ende der aktuellen Sequenz.

Wenn ein Timer im Spiel ist, dann heißt er "Timer" und nicht "Verzögerungen"   ;)

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...