BauerHeini Geschrieben 1. April 2021 Geschrieben 1. April 2021 Hallo, gibt es in LUA in Zusammenhang mit MBS kein "Repeat .. Until"? MfG Heinz
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 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"
BauerHeini Geschrieben 1. April 2021 Autor Geschrieben 1. April 2021 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?
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 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 :-)
BauerHeini Geschrieben 1. April 2021 Autor Geschrieben 1. April 2021 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?
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 vor 2 Minuten schrieb BauerHeini: So? genau so. Das liest sich leichter, findest du nicht?
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 (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 1. April 2021 von Goetz
BauerHeini Geschrieben 1. April 2021 Autor Geschrieben 1. April 2021 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?
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 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?
BauerHeini Geschrieben 1. April 2021 Autor Geschrieben 1. April 2021 wie in Deiner Demo "Abbieger 05" habe ich die "Ampelsequenz" nachvollzogen und dann versucht den Timer einzubauen. Aber wie?
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 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.
BauerHeini Geschrieben 1. April 2021 Autor Geschrieben 1. April 2021 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.
Goetz Geschrieben 1. April 2021 Geschrieben 1. April 2021 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 ... 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"
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