"Warteschleife" für Lua - Fahrstraßenfunktion?

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Es gibt etwas viel besseres als Slots, nämlich Tag-Texte.

    Hallo Fried :)

    ja, daran hatte ich oben auch schon gedacht. Allerdings ist das meiner Meinung nach für den Benutzer nicht besonders transparent. Und zweitens ist es u.U. mit etwas Aufwand verbunden, zumindest wenn Du komplexere Aufgaben damit lösen willst.

    Noch schöner wäre es, wenn Trend meinem schon geäußerten Wunsch nachkommen würde und man Tag-Texte auch in Signalen speichern könnte.

    Oh ja :be_1:

    Gruß Ingo

  • Hallo zusammen,

    ich habe mich nun mit den Data Slots beschäftigt und ein Script für eine Warteschleife geschrieben. Leider ist dort ein Fehler drin, den ich nicht finden kann:

    Er liegt wahrscheinlich darin, dass die in der Funktion enthaltene EEPOnSignal-Funktion, ohne Signalbewegung (bei Anforderung und gesperrter Fahrstraße) nicht aufgerufen wird und somit die Warteschleife (von @ Corinthiano) nicht aktiviert wird. Mein ganzes Script ist im Gegensatz zu den hier vorgestellten LUA Scripten natürlich recht holprig und laienhaft, aber mir fehlt leider momentan die Zeit, um mich noch intensiver damit zu beschäftigen.

    Deswegen würde ich mich total freuen, wenn ihr euch dieses zur Korrektur mal anschauen würdet. Ich habe nun schon viel hier im Forum herumgesucht und auch das rus- Paket angesehen. Doch leider fällt mir einfach nichts mehr ein, um das Problem zu lösen.

    Vielen Dank!

    Gruß Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

  • Hallo Silberstern ,

    ein paar Anmerkungen zum Lua-Code Deines letzten Beitrages.

    Wie immer von mir kein fertiger Code, da ich der Meinung bin, Anregungen ja, aber durch selber machen (auch durch das selber machen eventueller Fehler), lernt man mehr, als durch das Kopieren von fertigem Quellcode.

    Erstens:

    Ich hätte nicht gedacht, dass folgendes Konstrukt (Definition einer Funktion innerhalb einer Funktion) in Lua funktioniert.

    Ich hab's auf der Seite "Lua Demo" getestet und es funktioniert, nur einen praktischen Nutzen sehe ich darin trotzdem nicht.

    In Deinem Lua-Code sieht es aber noch etwas anders aus.

    Dies funktioniert nur fehlerfrei, wenn FS8 == 4 ist, denn sonst wird die Funktion bbb() nicht definiert.

    Die Funktion aaa() entspricht Deiner Funktion Abzweig8()

    Die Funktion bbb() entspricht Deiner Funktion EEPOnSignal_8(StatusFS8)

    Ist dieses Konstrukt wirklich so von Dir gewollt?

    Ich bezweifle, dass die globale Variable FS8 unter jeder Bedingung, beim Aufruf der Funktion EEPOnSignal_8 immer den gewünschten Wert hat und dieser nicht durch den erneuten Aufruf innerhalb der EEPMain() verändert wurde.

    Z.B. wird die Variable in der Funktion Warteschleife() nicht mit dem aktuellen Wert belegt, aber durch diese Funktion könnte EEPOnSignal_8 ebenfalls ausgelöst werden.


    Zweitens:

    Dein Konstrukt mit den

    if (T==2) then bzw. (T==3) bzw. (T==4)

    ist nicht erforderlich.

    Weise der globalen Variable FS8 den Wert von T zu

    FS8 = T

    Oder verwende die Variable T, statt der Variable FS8 in EEPSetSignal(...)


    Drittens:

    Wie Du bereits vermutet hast, wird die Funktion EEPOnSignal_8 nicht aufgerufen, wenn das Signal nicht geschaltet wird/nicht geschaltet werden kann.

    Aber die Funktion Warteschleife() wird natürlich in der EEPMain() im Sekundentakt ausgeführt, unabhängig von der Funktion EEPOnSignal_8.


    Viertens:

    Das registrieren des Signales 8 für EEPOnSignal_8 muss nur einmalig gemacht werden und nicht bei jedem Aufruf der Funktion Abzweig8().


    Fünftens:

    In dem von Dir gezeigten Code geht es nur um das Signal 8.

    In der Funktion Warteschleife() werden aber die Dataslots für 50 FS-Signale geprüft, soll es da noch eine Erweiterung geben?

    (Ich gebe zu, ich habe auch nicht alle Beiträge des Thred gelesen, die mir eventuell die Frage beantwortet hätten.)


    Sechstens:

    Bis der Zug den Kontaktpunkt mit der Funktion DataSlot8Nil() erreicht hat, wird weiterhin im Sekundentakt versucht, die Fahrstraße zu schalten.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

  • Hallo Jürgen,

    ich bin dir sehr dankbar, dass du mein Script so ausführlich "auseinandergenommen" hast, denn durch die viele Ausprobiererei hatte ich doch irgendwann nicht mehr den richtigen Durchblick. Das hier war auch nur ein Script für ein Test. Die FS-Funktionen für meine richtige Anlage sehen natürlich ganz anders aus und funktionieren - bis auf die Wiederholfuntion- auch sehr gut. Die generierten Zufallswerte "T" dienen hier nur als Bedingung für die if - then Funktion.

    Ich werde deine Vorschläge umsetzen und ein neues Script "basteln", denn ich bin auch deiner Meinung, man sollte erstmal selber tätig werden.

    Ich habe nun folgendes vor:

    1.) In der durch einen KP aufgerufenen FS-Funktion wird, je nach passender if-then-Bedingung, eine Variabel (z.B. FS8) generiert, die der gewünschten Stellung der Fahrstraße entspricht (bei mir: 2 oder 3 oder 4).

    2.) In der EEPMain bleibt die "Warteschleifenfunktion" so bestehen, wie sie hier (bei #1) zu sehen ist. (von Corinthiano).

    3.) Die generierte Variabel (FS8) wird in einen Data-Slot gespeichert. Ein EEPSetSignal gibt es in dieser Funktion nicht mehr!

    4.) Die "Warteschleife" in der EEPMain nimmt den gespeicherten Wert auf und setzt die entsprechende Fahrstraße.

    Somit wird das Schalten der FS im Grunde ganz der "Warteschleife" übertragen. Die durch KP (am Vorsignal ) aufgerufene Funktion (hier z.B. Abzweig8) dient ausschließlich nur zum Erzeugen und Abspeichern der entsprechenden Variabel, die auch der gewünschten FS-Stellung entspricht. Eine EEPOnSignal Funktion wird nicht benötigt.

    5.) Abschließend wird die Funktion zum Löschen des entsprechenden Speichers (mit KP -kurz hinter dem Signal) definiert, um die Schleife zu beenden.

    Ich werde nachher auf meiner Testanlage mal schauen, ob es geht.

    Gruß Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

  • Hallo Silberstern ,

    sehr gut, dass Du als Erstes selbst versuchst, Deine Lua-Probleme zu lösen und notfalls hier Fragen stellst. Nur das wird dazu führen, dass Dir Lua immer mehr Spaß bringt.

    Was die Funktion zum Löschen des DataSlot betrifft, würde ich Dich bitten zu prüfen, ob Du diese Funktion eventuell beim Freigeben der FS im Script aufrufst und nicht erst durch einen Kontaktpunkt.

    Selbst wenn der Kontaktpunkt dicht hinter dem Signal ist, würde dies ein paar unnötige Versuche sparen, die angemeldete FS nochmals freizugeben.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

  • Hallo Jürgen,

    ich habe nun das Script neu geschrieben aber es läuft irgendwie nicht.

    Zuerst musste ich EEPSaveData(8, FS8) in EEPSaveData(8, hData) ersetzen, da diese Funktion wohl keine Variabeln zulässt und dann habe ich festgestellt, dass nur der Wert der letzten if-then Bedingung (FS8= 4) im Slot gespeichert wird und die "Warteschleife" (siehe Beitrag#22) aufruft. Bei den anderen (2 und 3) geschieht nichts???

    Ziemlich merkwürdig und für mich unverständlich. Woran kann das liegen?

    Der Wert der Zufallsfunktion "T" ist hier in der Testanlage übrigens nur eine Bedingung, um die if-then-Funktion zu definieren!

    Hier ein Auszug daraus.

    Gruß Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

  • Hallo Silberstern ,

    dass mit dem

    EEPSaveData(8,hData)

    habe ich nicht verstanden.

    hData ist genauso eine Variable, wie FS8.

    Das muss genauso mit der Variablen FS8 funktionieren.

    Was gibt es denn für eine Fehlermeldung?

    Dass nur die 4 im Dataslot gespeichert wird, liegt daran, dass das EEPSaveData sich nur in der if-Bedingung

    if T==4 then

    ...

    befindet.

    Geh doch einfach mal Zeile für Zeile den Weg nach, wenn T gleich 3 ist. Du wirst sehen, dass Du nicht zur EEPSaveData-Zeile kommst.

    Aber, wenn Du in den if's nicht noch irgend etwas anderes machen möchtest, dann brauchst Du diese nicht.

    Wenn Du schreibst

    Code
    print("T=" ...
    
    FS8 = T   -- das brauchst Du auch
              -- nur, wenn FS8 noch
              -- woanders gebraucht
              -- wird
    EEPSaveData(8,FS8)
    
    print("Gespeicherter Wert FS8 ...

    Und wenn Du die if's doch für etwas anderes brauchst, dann müssen die "end" aller if's vor den EEPSaveData-Block "rutschen", damit dieser sich nicht mehr in einem if-Block befindet.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    4 Mal editiert, zuletzt von JuergenSchm (30. September 2021 um 23:08)

  • Hallo Silberstern,

    den ganzen Current_State(), T, FS8 Kram benötigst du nicht. 1 Zeile macht alles!

    Lua
    function Abzweig8() --Über KP am Vorsignal aufgerufen.
        EEPSaveData(8, math.random(2, 4))
    end

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.3.0 Plug-in 1, 2, 3; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • Hallo Fried ,

    genau das ist die Lösung, die jemand braucht, der schon bei der Struktur einfacher if's Probleme hat.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

    Einmal editiert, zuletzt von JuergenSchm (30. September 2021 um 23:25)

  • Hallo JuergenSchm ,

    ich nehme mal an, dass du das ironisch meinst. Wieso?

    math.random hat er selbst benutzt Er hat es nur in eine völlig unnötige Funktion gepackt. Und nur dadurch ist er zu seinen ausufernden if-Konstruktionen gezwungen, die er gar nicht benötigt.

    Wenn er sich diese 1 Zeile im Vergleich zu seinem Skript durch den Kopf gehen lässt, sieht er, dass es eine ganz einfache Verschiebung der math.random Funktion ist und er all den Ballast drum herum, mit dem er deiner Meinung nach Schwierigkeiten hat, nicht benötigt. Er macht sich das Leben mit eben diesen if's nur unnötig schwer und nicht nur dort.

    Fried-liche Grüße:aq_1:

    Rentner sein ist wie Urlaub, nur 365 Tage im Jahr.

    Wen es interessiert ...

    PC: AMD Ryzen 5 5600X 6x3,7GHz; 32GB RAM; GeForce RTX3060XC 12GB; 2x 1TB SSD; Windows10Pro 64bit;

    Monitore: 2560x1440 (ASUS) + 1920x1080 (alt)

    Laptop: i7-4710HQ 2,5GHz; 8GB RAM; NVIDIA GeForce GTX860M; 125GB SSD + 1TB HDD; W10Pro64bit

    EEP: Aktuell 15.1.2 Plug-in 1, 17.3.0 Plug-in 1, 2, 3; HN17; AnlVerb17; MK; ME; ZE; TM; ...

  • Hallo Fried ,

    und was passiert, wenn ich's nicht ironisch meine?

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB

  • Hallo zusammen,

    nochmals vielen Dank für eure Hilfe.

    Bitte nicht über die math.random Funktion aufregen. Wie schon erwähnt, dient diese nur dazu, eine Bedingung für die if-then Funktion in meiner Testanlage! zu schaffen.

    Wenn das alles funktioniert, wie ich es brauche, werde ich diese Wiederholfuntion an die Fahrstrassenfunktionen in meiner richtigen Anlage anpassen.


    Gruß Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

  • Zu der anderen Sache mit meinen fehlerhaft gesetzten end`s. Ich brauche LUA, um meine Anlage so, wie ich es möchte zu betreiben.

    Es sind viele Stunden dabei draufgegangen, um mir meine bescheidenen Kenntnisse anzueignen. Doch leider vergisst man dann doch mal das eine oder andere, wenn man nicht kontinuierlich dabei bleibt und ich finde es super, dass es dieses Forum hier zur Hilfe gibt.

    Ansonsten hätte ich wahrscheinlich schon bei EEP 11 aufgehört.

    Aber jetzt habe ich wieder dazugelernt.

    Viele Grüße aus dem Münsterland.

    Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

  • Und wenn Du die if's doch für etwas anderes brauchst, dann müssen die "end" aller if's vor den EEPSaveData-Block "rutschen", damit dieser sich nicht mehr in einem if-Block befindet.

    Hallo Jürgen,

    ja das war's! :be_1: Jetzt läuft alles wie gewünscht. Wie konnte mir das passieren?

    Wie schon bemerkt, werde ich in der nächsten Zeit anfangen, diese Wiederholfunktion in die nötigen Fahrstraßenfunktionen meiner Anlage einzufügen.

    Ich hatte dieses Problem bislang über einen KP, der die Funktion einer gesperrten/angeforderten Fahrstraße wiederholt, gelöst. Das hatte aber bei längerem Betrieb zu neuen Problemen geführt.

    Also vielen Dank nochmals für die Hilfe!

    Gruß.

    Silberstern

    System: Win11 Pro x64; Prozessor: AMD Ryzen 5 3600X-3,8GHz-6K-12T; Grafik: Gigabyte Radeon RX5600 XT Gaming OC 6G (rev2.0); RAM: 32GB

    EEP6; EEPX/Expert (Patch5); EEP14.1 (Patch 2); HN14 (Patch1); EEP16.4; Aktuell: EEP17.2 (Update 2; Patch1) Plugin 1

    Einmal editiert, zuletzt von Silberstern (1. Oktober 2021 um 14:12) aus folgendem Grund: Löschen von Text.

  • Hallo Silberstern ,

    schön, dass das Script nun so funktioniert, wie Du das möchtest.

    Ja, die automatische Freigabe einer, bei Zufahrt gesperrten, FS wäre eine gute Sache.

    Aber, leider ist das bei vielen Automatismen in EEP (das ist eigentlich auch ein Problem vieler anderer Programme) so, dass das dann nicht jeder User, warum auch immer, haben möchte und die Automatik (z.B. einige Gleis/Straße-"EEP-Hilfen" beim Verlegen, das manchmal unnatürliche "Nicken" der Autos in Kurven und noch einige weitere) sich dann nicht deaktivieren lässt und dann wird der Vorteil auch schnell zum Nachteil.

    Und je fitter Du in Lua wirst, um so mehr eigene Script-Schnipsel besitzt Du, die Du un- oder leicht verändert wieder für neue Dinge einsetzen kannst und die dann helfen die neue Aufgabe relativ schnell zu lösen.

    Jürgen

    EEP: 12.1, 13.2, 14.1, 15.1, 16.4 (z.Zt. installiert aber nur für Tests im Einsatz)

    keinerlei externe Zusatztools und manuell manipulierte Anlagendateien

    Prozessor: Intel(R) Core(TM) i5-4460S CPU @ 2.90 GHz 2.90 GHz
    PC: RAM 12 GB, Windows 10 Home, 64 Bit
    GK: NVIDIA Geforce GT 730, 4 GB