Regelmäßige Funktionsaufrufe im EEPMain-Takt - Funktionsliste und Zeittaktsteuerung

!!! Please ensure, that your contribution or question is placed into the relevant section !!!
Questions about rolling stock, for example, do not belong in "Questions about the Forum". Following is perhaps the right area where your question will be better looked after:
General questions to EEP , Splines, rolling stock, Structures in EEP, landscape elements, Signalling system and controlling, designers, Europe-wide EEP meetings , Gossip
Your cooperation to keep the forum clear is appreciated.
In the case of pictures that are attached to the article, the source must also be stated. This also applies to your own pictures, which were taken by you. Pictures without source information will be deleted!
  • [VORBEMERKUNG]

    Dieser Text wurde im Ergebnis der nachfilgenden Diskussion mehrfach angepasst und

    im Beitrag #12 habe ich noch den Code für ein Testbeispiel hinzugefügt .

    [/VORBEMERKUNG]


    Mir ist bei meinen LUA-Übungen ein Gedanke gekommen, weil ich regelmäßig z.B. Werte protokolliere oder von Zeit zu Zeit auch Lokomotiven, Krane u.a. Dinge positioniere.


    Meine EEPMain-Funktion habe ich ergänzt/angepasst:


    Takt = 0 -- Taktzähler fuer EEPMain (5x pro Sekunde)

    TaktFunktionen = {} -- Liste der Funktionen, welche im Zyklus ausgefuehrt werden

    function Anlagen_EEPMain()

       Takt = Takt + 1

       local RCode = 1

       for k,v in ipairs(TaktFunktionen) do

          if v~=nil then

             if Takt%(v[2])==0 and v[1]() then TaktFunktionen[k]=nil end

          end

       end

       return RCode

    end

    An passenden Stellen füge ich dann TaktFunktionen in die Liste ein und gebe die Häufigkeit an, in der die Befehle auszuführen sind. Der Rückkehrcode legt fest, ob die Taktfunktion in der Liste (also aktiv) bleibt oder entfernt wird. Wird "true" zurückgegeben, wird sie entfernt. Sonst bleibt sie aktiv. Die Funktion in der TaktFunktion prüft selbst, ob sie fertig ist oder nicht.

    function TestProtokoll(Kennung, maxTakt)

       if Takt>maxTakt then return true end

       print(Takt.." "..Kennung.." "..maxTakt.." ")

    end

    TaktFunktionen[#TaktFunktionen+1] =

       { function() return TestProtokoll("A05",74) end, 5} -- Alle 5 Takte (also pro 1 Sekunde) bis max. Takt 74

    TaktFunktionen[#TaktFunktionen+1] =

       { function() return TestProtokoll("A12",65) end, 12} -- Alle 12 Takte (also pro 2,4 Sekunden) bis max. Takt 65

    TaktFunktionen[#TaktFunktionen+1] =

       { function() return TestProtokoll("A02",30) end, 2} -- Alle 2 Takte (also pro 2,4 Sekunden) bis max. Takt 30

    Allgemeiner also

    TaktFunktionen[#TaktFunktionen+1] = { function() return AUSZUFUEHRENDE FUNKTION end, HAEUFIGKEIT }

    So kann ich alles in den einzufügenden Quelltexten (via require) außerhalb des Hauptscriptes kodieren.

    Vielleicht gefällt jemandem diese Idee und sie ist hilfreich.


    LG aus dem Randboulettenland

    Ekkehard (moevenbaer)

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


    The post was edited 4 times, last by moevenbaer ().

  • if v~=nil then if Takt%(v[2])==0 and v[1]() then v=nil end end

    Scheinbar reagiert unter verschiedenen (im Moment noch nicht erkannten) Situationen etwas verschieden, kann vielleicht mit den Chunks und der variablenreichweite zu tun haben. Egal wie, in zwei kleinen testanlagen ging es und in weitern dann plötzlich nicht mehr.

    Die Mystik der Programmierung.


    Also habe ich mich auf Fehlersuche begeben.


    Deshalb habe ich diese Zeile korrigiert:

    if v~=nil then if Takt%(v[2])==0 and v[1]() then TaktFunktionen[k]=nil end end

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Hallo Ekkehard ( moevenbaer ),

    ein Hinweis.


    Das Durchsuchen einer Tabelle mit ipairs stoppt, wenn es in der Tabelle auf einen nil-Wert trifft.

    Jürgen


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

    keinerlei 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

  • Das habe ich dann wohl doch noch nicht vollständig getestet.

    Es muss da wohl nochmal eine Anpassung her zum Füllen der "Lücke":

    TaktFunktionen[k]=nil

    ersetzen durch

    table.move(TaktFunktionen,k+1,#TaktFunktionen,k)

    TaktFunktionen[#TaktFunktionen]=nil

    Danke für den Hinweis.

    Stellt sich noch eine Frage für mich, die ich in den nächsten Tagen mit der LUA-Konsole ohne EEP mal probieren werde:

    Ist for i=1,#TaktFunktionen do ... end schneller oder langsamer als for k,v in ipairs(TaktFunktionen) do ... then?

    Um das table.move kommt ich also doch nicht herum. Schade, aber auch nicht wirklich schlimm.


    LG aus dem Randboulettenland

    Ekkehard (moevenbaer)

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • P.S. Und eben ist mir noch aufgefallen, dass wohl der "letzte" Eintrag (k==#TaktFunktionen) abgefangen werden muss. Das prüfe ich auch noch die Tage dann. Da muss ich mich wohl in die Programmierung mit LUA noch weiter eindenken.

    Es gibt eben immer was zu tun :aa_1::co_k::aq_1:


    P.S. Erste Idee:


    if k==#TaktFunktionen then

    TaktFunktionen[k]=nil

    else

    table.move(TaktFunktionen,k+1,#TaktFunktionen,k)

    TaktFunktionen[#TaktFunktionen]=nil

    end

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


    The post was edited 1 time, last by moevenbaer ().

  • Hallo Ekkehard ( moevenbaer ) ,


    noch ein Hinweis.


    Es gibt ja nicht nur ipairs.

    Schau Dir doch mal pairs oder #Tabelle zu deren Möglichkeiten in der Verwendung in einer for-Schleife an.

    Eventuell ist die Änderung an Deinem Code, dieses Problem betreffend, gar nicht so groß.

    Jürgen


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

    keinerlei 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

    The post was edited 1 time, last by JuergenSchm ().

  • Ich weiß nicht, wieviele Funktionen Du planst, auf diese Weise zu takten.

    Aber ich glaube, dass Du Dir über eine eventuelle Laufzeitdifferenz zwischen ipairs, pairs und #Tabelle keine Gedanken machen musst.


    Eher, das ist mein Lieblingsthema, was passiert, wenn die Anlage während der Laufzeit der Takte, beendet und neu gestartet wird.

    Jürgen


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

    keinerlei 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

  • Laufzeitdifferenz zwischen ipairs, pairs und #Tabelle

    Das ist hetzt auch eher nur allgemeines Interesse für andere Projekte in denen ich 10-16-stellige Zyklen haben werde. Kann sein, dass das für EEP keinewesentliche Rolle.

    Wenn ich das richtig gelesen und verstanden habe, können LUA Tables sowohl Name-Wert-Einträge (assoziativ?) als auch indizierte Einträge enthalten und pairs ist für erstere und ipairs für zweitere. Da habe ich aber in ipairs etwas zu viel interpretiert. Aber der Tip bringt mich auch auf den Gedanken, nicht mit Indizes sondern mit assoziativen Einträgen zu arbeiten.

    Vielleicht sind die indizierten Felder auch nur assoziative Einträge mit Zahlenwerten als Name.

    Noch mehr zu untersuchen. Es häuft sich ...

    :af_1::aq_1::co_k: ... aber heute nicht mehr ...

    Eine gute Nacht allen

    LG aus dem Randboulettenland

    Ekkehard (moevenbaer)

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • JuergenSchm Dankeschön für die Denkanstöße und Gedankennebelverdünner. :aq_1::bg_1:

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Hallo,

    10 - 16 stellige Zyklen?

    Da hab ich sicherlich etwas falsch verstanden.


    Nehmen wir mal an (15stellig)

    100.000.000.000.000 / 5 =

    20.000.000.000.000 Sekunden / 60 =

    333.333.333.333 Minuten (rund) / 60 =

    5.555.555.555 Stunden / 24 =

    231.481.481 Tage / 365 =

    634.195 Jahre (rund)


    Das nenne ich eine recht lange Laufzeit.

    Da solltest Du auch den EEP-Versionswechsel mit rein programmieren. :aa_1:


    Aber Du meintest sicherlich etwas anderes.

    Jürgen


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

    keinerlei 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

    The post was edited 1 time, last by JuergenSchm ().

  • Aber Du meintest sicherlich etwas anderes.

    Ja. Es geht um Statistiken zu Ziffernkombinationen in verschiedenen Zahlensystemen.

    Das ist hetzt auch eher nur allgemeines Interesse für andere Projekte in denen ich 10-16-stellige Zyklen haben werde. Kann sein, dass das für EEP keinewesentliche Rolle.

    Das war mal wieder unscharf formuliert. Hätte besser heißen sollen:


    "Das ist jetzt auch eher nur allgemeines Interesse für andere Projekte in denen ich 10-16-stellige Zyklen haben werde.

    Kann sein, dass diese Laufzeitdifferenzen für EEP keine wesentliche Rolle spielen."

    Eventuell ist die Änderung an Deinem Code, dieses Problem betreffend, gar nicht so groß.

    Da könnte wohl ein i zu viel sein, denn pairs liefert auch die numerischen Schlüssel, wie ich oben schon mal vermutete und dann auch im LUA-Buch (früher überlesen hatte) nun wieder gefunden habe.


    LUA bietet halt sehr viel Holz zum Stapeln. Und wenn man zu schnell stapelt, baut man auch Hohlräume ein. :aa_1:

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k:


  • Es lies mir doch keine Ruhe. Bereitschaft muss doch auch zu was nütze sein ... :af_1:

    Es war das i von ipairs. Habe den Startartikel entsprechend angepasst und mit einem Hinweis hierhoin versehen.


    Nun habe ich mal ein Beispiel mit allen möglichen Fällen erstellt und unter dem Spoiler "versteckt".

    :aq_1: Es gibt immer mehrere Wahrheiten. Deine, seine, ihre, meine und ... die echte.

    Meine Freiheit endet dort, wo das Recht anderer beginnt. Ab da müssen immer

    ausgewogene Kompromisse geschlossen werden.:aq_1::co_k: