Ankündigung

Einklappen
Keine Ankündigung bisher.

Timer mit Abbruchbedingung und diverses

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #31
    Zitat von enertegus Beitrag anzeigen
    Ok Du hast recht, ich ändere die Beispiele ab, ich habe die als getrennte Beispiele aufgefasst.
    Super!
    BR
    Marc

    Kommentar


      #32
      Also:

      afterc(event, delay, var)

      liefert in var die verbleibende Zeit.

      Aber einiges bleibt mit nach Lesen der entsprechenden Abschnitte im Handbuch unklar:

      1. Ich habe aber keinen Hinweis gefunden, in welcher Einheit gezählt wird (ich nehme mal an, in Millisekunden) und in welcher Schrittweite die Variable inkrementiert wird (in 1ms-Schritten oder größer oder variabel, je nach Auslastung?).
      2. Wenn ich diese Variable in einem Ausdruck verwende, so wird diese ja invalid und erneut ausgewertet, sobald ein Wert sich verändert.
        Wie oft invalidiert denn diese Variable einen von ihr abhängigen Ausdruck?
      3. Welchen Wert hat die Variable, wenn afterc() abgelaufen ist? Null oder undefiniert?
      4. Es führt zu undefiniertem Verhalten, wenn die selbe Variable von verschiedenen afterc() Aufrufen verwendet wird.
        Gibt der Compiler da wenigstens eine Warnung aus, wenn er es denn schon nicht grundsätzlich verhindert?
      5. Was passiert, wenn ich die Variable statt dessen zeitgleich für einen delayc()-Aufruf verwende? Das Handbuch sagt dazu nichts, ich würde aber die selben Probleme erwarten, wie bei zeitgleicher Nutzung durch zwei afterc()-Aufrufe.
      6. Was passiert, wenn ich zur Laufzeit von afterc() der Variablen einen neuen Wert zuweise? Ändert das die Laufzeit oder wird umgehend wieder der korrekte Wert zugewiesen? Oder ahndet das der Compiler als Fehler und es geht daher gar nicht?
      7. Falls es geht und falls es die Laufzeit ändert, stoppt dann ein Setzen auf 0 den Timer? Würde er dann die vorgesehene Aktion (vorzeitig) triggern oder hätten wir damit den hier gewünschten Abbruch?
      8. Falls so kein Abbruch möglich ist, könnte man nicht diese Variable als Referenz für eine Abbruchfunktion verwenden (die halt nichts tut, wenn der Timer schon abgelaufen ist)?
      9. Wenn der Timer abgelaufen ist, darf ich dann die Variable wieder frei verwenden?
      Tessi

      Kommentar


        #33
        Zitat von Tessi Beitrag anzeigen
        Aber einiges bleibt mit nach Lesen der entsprechenden Abschnitte im Handbuch unklar:
        https://knx-user-forum.de/270589-post39.html
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #34
          @Tessi: gut formuliert!
          bleibt nur noch die gut formulierte Antwort
          EPIX
          ...und möge der Saft mit euch sein...
          Getippt von meinen Zeigefingern auf einer QWERTZ Tastatur

          Kommentar


            #35
            Nun ja,
            1. ist mit dem verlinkten Dokument beantwortet. Es sind Millisekunden und die Schrittweite ist variabel und entspricht dem zeitlichen Abstand zwischen den Starts der einzelnen Zyklen, hängt also auch, aber nicht nur, von der jeweiligen Auslastung ab.
            2. Die Variable ändert sich während der Laufzeit von afterc() in jedem Zyklus. Dabei verstehe ich aber nicht, warum in diesem Beispiel das
              if change(var) then ...
              gebraucht wird:
              [highlight=epc]
              Max=1000000000000000u64
              Restzeit=0u64
              StoppZeit=Max
              MaxZyklusZeit=0u64
              MinZyklusZeit=Max
              PerformanceZeit=20u64

              if afterc(after(systemstart(),10000u64), Max, Restzeit) then {
              StoppZeit=0u64;
              } endif

              if change(Restzeit) then {
              MaxZyklusZeit=max(StoppZeit-Restzeit-PerformanceZeit,MaxZyklusZeit);
              MinZyklusZeit=min(StoppZeit-Restzeit -PerformanceZeit,MinZyklusZeit);
              StoppZeit=Restzeit;
              } endif
              [/highlight]
              Warum reicht nicht:
              [highlight=epc]
              Max=1000000000000000u64
              Restzeit=0u64
              StoppZeit=Max
              MaxZyklusZeit=0u64
              MinZyklusZeit=Max
              PerformanceZeit=20u64

              if afterc(after(systemstart(),10000u64), Max, Restzeit) then {
              StoppZeit=0u64;
              } endif

              MaxZyklusZeit=max(StoppZeit-Restzeit-PerformanceZeit,MaxZyklusZeit);
              MinZyklusZeit=min(StoppZeit-Restzeit -PerformanceZeit,MinZyklusZeit);
              StoppZeit=Restzeit;
              [/highlight]
              Invalidiert die Variable einen sie verwendenden Ausdruck denn nicht automatisch bei Änderung? Wird sie da anders behandelt, als "normale" Variablen? Oder wird das if(...) gebraucht, um die Auswertung dieser Ausdrücke bei Systemstart zu unterdrücken? Oder um sicherzustellen, das alle anderen beteiligten Variablen nicht triggern können?

            Auch nach Durcharbeiten des Dokuments kann ich mir die Fragen 2.-9. nicht beantworten. Sollte ich diese Fragen vielleicht besser im Thread "Zeitfunktion / Dauer des Zustandes einer GA " stellen, in dem sich auch das hier zitierte Dokument "Zyklus.pdf" befindet?
            Wobei Frage 7. und 8. sich ja schon auf den hier gewünschten Abbruch beziehen...

            Und ich habe noch eine 10. Frage:
            Wird die Variable gleich mit dem Aufruf von afterc() gesetzt, oder erst ab dem nächsten Zyklus?
            Tessi

            Kommentar


              #36
              Zitat von EPIX Beitrag anzeigen
              @Tessi: gut formuliert!
              bleibt nur noch die gut formulierte Antwort
              Kann mich leider nur anschließen. Die Informationsflut erschlägt auch mich noch nicht wirklich
              BR
              Marc

              Kommentar


                #37
                Zitat von Tessi Beitrag anzeigen
                Warum reicht nicht:
                Weil der Programmierer nicht richtig nachgedacht hat .
                Auch nach Durcharbeiten des Dokuments kann ich mir die Fragen 2.-9. nicht beantworten. Sollte ich diese Fragen vielleicht besser im Thread "Zeitfunktion / Dauer des Zustandes einer GA " stellen, in dem sich auch das hier zitierte Dokument "Zyklus.pdf" befindet?
                Wobei Frage 7. und 8. sich ja schon auf den hier gewünschten Abbruch beziehen...
                Ich werde die Fragen in das besagte Dokument einarbeiten/beantworten und dann hier posten.
                Wird die Variable gleich mit dem Aufruf von afterc() gesetzt, oder erst ab dem nächsten Zyklus?
                Der Timer setzt jeweils am Anfang der Verarbeitung diesen Zähler.
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #38
                  Zitat von Tessi Beitrag anzeigen
                  Gibt der Compiler da wenigstens eine Warnung aus, wenn er es denn schon nicht grundsätzlich verhindert?
                  Nein (keine Warnung und nicht verhindern).
                  Was passiert, wenn ich die Variable statt dessen zeitgleich für einen delayc()-Aufruf verwende? Das Handbuch sagt dazu nichts, ich würde aber die selben Probleme erwarten, wie bei zeitgleicher Nutzung durch zwei afterc()-Aufrufe.
                  An sich darf man auch 2 (oder mehr )after gleichzeitig laufen lassen. Ich versteh diese Frage nicht ganz.
                  offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                  Enertex Produkte kaufen

                  Kommentar


                    #39
                    Zitat von enertegus Beitrag anzeigen
                    An sich darf man auch 2 (oder mehr )after gleichzeitig laufen lassen. Ich versteh diese Frage nicht ganz.
                    Darf die Variable nur nicht für afterc() mehrfach verwendet werden oder auch gemischt für afterc() und delayc() nicht mehrfach? (Vermutung: Mehrfachverwendung ist generell nicht erlaubt)
                    BR
                    Marc

                    Kommentar


                      #40
                      Zitat von saft6luck Beitrag anzeigen
                      Darf die Variable nur nicht für afterc() mehrfach verwendet werden oder auch gemischt für afterc() und delayc() nicht mehrfach? (Vermutung: Mehrfachverwendung ist generell nicht erlaubt)
                      "Erlaubt" ist das an sich schon, nur ist die Frage, was der Code dann macht . Also: Die Variable ist einfach der Hilfszähler und jede Instanz von afterc/delayc braucht grundsätzlich ihren eigenen.
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #41
                        Zitat von enertegus Beitrag anzeigen
                        Weil der Programmierer nicht richtig nachgedacht hat .
                        Es würde also auch ohne das if(change(...)) genauso funktionieren?

                        Zitat von enertegus Beitrag anzeigen
                        Ich werde die Fragen in das besagte Dokument einarbeiten/beantworten und dann hier posten.
                        OK, bin schon sehr gespannt.

                        Zitat von enertegus Beitrag anzeigen
                        Der Timer setzt jeweils am Anfang der Verarbeitung diesen Zähler.
                        "Jeweils" schließt den Zyklus ein, in dem afterc() getriggert wird (also die Bedingung des umschließenden if() erstmals wahr wird, oder ist die Variable in diesem Zyklus noch undefiniert und wird erstmals erst zu Beginn des diesem "Start"-Zyklus folgenden Zyklus gesetzt?

                        Zitat von enertegus Beitrag anzeigen
                        Nein (keine Warnung und nicht verhindern).
                        Also Verhindern wäre auch fraglich, da ich vielleicht bei verschiedenen afterc() Aufrufen genau weiß, das sie nie gleichzeitig laufen, und ich daher die selbe Variable nutzen kann und will.
                        Aber ich fände eine Warnung da ganz sinnvoll, damit Anwender, die das nicht wollten aber versehentlich gemacht haben (copy & paste) hier nicht erst stundenlang suchen müssen und ggf. aus dem uns derzeit noch unbekanntem Verhalten ja auch gar nicht darauf schließen können.

                        Zitat von enertegus Beitrag anzeigen
                        An sich darf man auch 2 (oder mehr )after gleichzeitig laufen lassen. Ich versteh diese Frage nicht ganz.
                        Na ja, wenn zwei afterc() Aufrufe mit der selben Variablen sich gegenseitig in die Quere kommen, so gilt dies sicherlich auch für den Zeitgleichen Aufruf eines delayc() und eines Afterc() Aufrufs mit der selben Variablen. Auf ersteres wird explizit hingewiesen (tu das nicht!), der zweite Fall wird nicht erwähnt.

                        Zitat von enertegus Beitrag anzeigen
                        "Erlaubt" ist das an sich schon, nur ist die Frage, was der Code dann macht .
                        Genau das ist eine wichtige Frage, deren Antwort auch gleichzeitig meine 7. Frage beantworten würde. Was passiert, wenn es doch passiert ist? Und was passiert, wenn Code an anderer Stelle (versehentlich?) auch den Variablenwert ändert? Hat das einen Einfluss auf den Ablauf von delayC() und afterc() oder ist die Variable eine reine Ausgabevariable, deren Wert (falls er von "außen" verändert wird) keinen Einfluss auf den Funktionsablauf selbst hat?

                        Zitat von enertegus Beitrag anzeigen
                        Also: Die Variable ist einfach der Hilfszähler und jede Instanz von afterc/delayc braucht grundsätzlich ihren eigenen.
                        Heißt Hilfszähler, das die Funktion intern zur Steuerung einen anderen Zähler verwendet, auf den von außen nicht zugegriffen werden kann?
                        Das jede Instanz grundsätzlich eine eigene Variable haben sollte ist klar, mir geht es darum zu wissen, wie das System im Fehlerfall (Fehler des Programmierers) reagiert, also wie gravierend sich das auswirken wird und anhand welcher Symptome ich eine versehentliche Mehrfachnutzung halbwegs eindeutig erkennen kann.

                        Ich sehe aber schon, das es nicht so einfach ist, meine Fragen aus dem Stand zu beantworten, das Thema scheint ähnliche Schwierigkeiten zu bereiten, wie seinerseits das Validierungsschema, zu dem es heute ja ein gut erklärendes Kapitel im Handbuch gibt, welches alle seinerzeit aufgetretenen Fragen mittlerweile beantwortet. Ich würde mich freuen, wenn das oben referenzierte Dokument zum Thema afterc() und delayc() dereinst die gleiche Qualität erreichen würde. Das wäre wahrscheinlich für alle viel hilfreicher, als wenn wir hier noch weiter mit Missverständnissen durch unserer Formulierungen kämpfen...
                        Tessi

                        Kommentar


                          #42
                          Hier das Kapitel
                          Angehängte Dateien
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #43
                            Wow! Das wäre es! Volle Kontrolle über den Verlauf.

                            Ist das schon so implementiert oder soll es erst noch so kommen?


                            Fassen wir mal zusammen:
                            1. In welcher Einheit wird gezählt wird und in welcher Schrittweite die Variable inkrementiert?
                              Variabel, je nach Auslastung. Zu Beginn eines Zyklus um die seit Beginn des vorherigen Zyklus vergangene Zeit.
                              .
                            2. Wie oft invalidiert denn diese Variable einen von ihr abhängigen Ausdruck?
                              Ab Start in jedem Zyklus bis sie 0 ist.
                              .
                            3. Welchen Wert hat die Variable, wenn afterc() abgelaufen ist?
                              0
                              .
                            4. Es führt zu undefiniertem Verhalten, wenn die selbe Variable von verschiedenen afterc() Aufrufen verwendet wird.
                              Gibt der Compiler da wenigstens eine Warnung aus, wenn er es denn schon nicht grundsätzlich verhindert?
                              Nein, keine Warnung, kein Fehler, es wird auch nicht verhindert - no risk, no fun...
                              .
                            5. Was passiert, wenn ich die Variable statt dessen zeitgleich für einen delayc()-Aufruf verwende?
                              Es ist die selbe Situation, wie bei zeitgleicher Nutzung durch zwei afterc()-Aufrufe.
                              .
                            6. Was passiert, wenn ich zur Laufzeit von afterc() der Variablen einen neuen Wert zuweise?
                              Es ändert die verbleibende Laufzeit!
                              .
                            7. Stoppt dann ein Setzen auf 0 den Timer? Würde er dann die vorgesehene Aktion (vorzeitig) triggern oder hätten wir damit den hier gewünschten Abbruch?
                              Setzen auf 0 stoppt den Timer ohne die vorgesehene Aktion zu triggern und stellt den hier gewünschten vorzeitigen Abbruch dar!
                              .
                            8. Falls so kein Abbruch möglich ist, könnte man nicht diese Variable als Referenz für eine Abbruchfunktion verwenden (die halt nichts tut, wenn der Timer schon abgelaufen ist)?
                              Hat sich erledigt, siehe 7.
                              .
                            9. Wenn der Timer abgelaufen ist, darf ich dann die Variable wieder frei verwenden?
                              Wird nicht erwähnt, ich vermute aber mal ja...
                              .
                            10. Wird die Variable gleich mit dem Aufruf von afterc() gesetzt, oder erst ab dem nächsten Zyklus?
                              Wird nicht explizit gesagt, aber da sie als steuernder Zähler dient, müsste sie noch im Startzyklus selbst auf den Maximalwert gesetzt werden.

                            Frage 9 müsste noch mal bestätigt werden, Frage 10 wirft dennoch eine weitere 11. Frage auf:

                            Wenn die Variable beim Start eines Timers gesetzt und wird, und es weitere abhängige Ausdrücke davon gibt, die dadurch invalidiert werden, werden diese dann noch im selben Zyklus ausgewertet oder erst im nächsten? Also erfolgt die erstmalige Auswertung mit dem Startwert?
                            Tessi

                            Kommentar


                              #44
                              Zitat von Tessi Beitrag anzeigen
                              Es würde also auch ohne das if(change(...)) genauso funktionieren?
                              arg, hab ich eben nochmals kontrolliert. Das gesagte zur Validierung stimmt zwar, aber dann wäre im Beispiel die Definition nicht mehr eindeutig (Kompiler schmeisst da eine entsprechende Fehlermeldung).
                              Muss also so bleiben wie usrpünglich angegeben...
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar


                                #45
                                Mal wieder ein Lob an Michael und sein Team!

                                Hab heut afterc() 4x verwendet, mit zig "Abbruchbedingungen" und ... funktioniert super!

                                P.s. Eine Frage hätte ich noch: Ist das Kapitel mit den Beispielen zu afterc() im offiziellen Handbuch eingebaut?
                                BR
                                Marc

                                Kommentar

                                Lädt...
                                X