BauerHeini Posted April 1, 2021 Share Posted April 1, 2021 Hallo, gibt es in LUA in Zusammenhang mit MBS kein "Repeat .. Until"? MfG Heinz Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 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" Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 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? Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 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 :-) Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 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? Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 2021 vor 2 Minuten schrieb BauerHeini: So? genau so. Das liest sich leichter, findest du nicht? Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 2021 Stimmt Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 2021 (edited) 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 Edited April 1, 2021 by Goetz Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 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? Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 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? Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 2021 wie in Deiner Demo "Abbieger 05" habe ich die "Ampelsequenz" nachvollzogen und dann versucht den Timer einzubauen. Aber wie? Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 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. Link to comment Share on other sites More sharing options...
BauerHeini Posted April 1, 2021 Author Share Posted April 1, 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. Link to comment Share on other sites More sharing options...
Goetz Posted April 1, 2021 Share Posted April 1, 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" Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now