Zitat von enertegus
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
Timer mit Abbruchbedingung und diverses
Einklappen
X
-
Also:
afterc(event, delay, var)
liefert in var die verbleibende Zeit.
Aber einiges bleibt mit nach Lesen der entsprechenden Abschnitte im Handbuch unklar:
- 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?).
- 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? - Welchen Wert hat die Variable, wenn afterc() abgelaufen ist? Null oder undefiniert?
- 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? - 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.
- 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?
- 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?
- 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)?
- Wenn der Timer abgelaufen ist, darf ich dann die Variable wieder frei verwenden?
Tessi
Kommentar
-
Zitat von Tessi Beitrag anzeigenAber einiges bleibt mit nach Lesen der entsprechenden Abschnitte im Handbuch unklar:offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
Enertex Produkte kaufen
Kommentar
-
Nun ja,
- 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.
- 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
-
Zitat von EPIX Beitrag anzeigen@Tessi: gut formuliert!
bleibt nur noch die gut formulierte AntwortBR
Marc
Kommentar
-
Zitat von Tessi Beitrag anzeigenWarum reicht nicht:.
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...
Wird die Variable gleich mit dem Aufruf von afterc() gesetzt, oder erst ab dem nächsten Zyklus?offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
Enertex Produkte kaufen
Kommentar
-
Zitat von Tessi Beitrag anzeigenGibt der Compiler da wenigstens eine Warnung aus, wenn er es denn schon nicht grundsätzlich verhindert?
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.offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
Enertex Produkte kaufen
Kommentar
-
Zitat von enertegus Beitrag anzeigenAn sich darf man auch 2 (oder mehr )after gleichzeitig laufen lassen. Ich versteh diese Frage nicht ganz.BR
Marc
Kommentar
-
Zitat von saft6luck Beitrag anzeigenDarf 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). 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
-
Zitat von enertegus Beitrag anzeigenWeil der Programmierer nicht richtig nachgedacht hat.
Zitat von enertegus Beitrag anzeigenIch werde die Fragen in das besagte Dokument einarbeiten/beantworten und dann hier posten.
Zitat von enertegus Beitrag anzeigenDer Timer setzt jeweils am Anfang der Verarbeitung diesen Zähler.
Zitat von enertegus Beitrag anzeigenNein (keine Warnung und nicht verhindern).
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 anzeigenAn sich darf man auch 2 (oder mehr )after gleichzeitig laufen lassen. Ich versteh diese Frage nicht ganz.
Zitat von enertegus Beitrag anzeigen"Erlaubt" ist das an sich schon, nur ist die Frage, was der Code dann macht.
Zitat von enertegus Beitrag anzeigenAlso: Die Variable ist einfach der Hilfszähler und jede Instanz von afterc/delayc braucht grundsätzlich ihren eigenen.
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
-
Hier das KapitelAngehängte Dateienoffizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
Enertex Produkte kaufen
Kommentar
-
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:
- 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.
. - Wie oft invalidiert denn diese Variable einen von ihr abhängigen Ausdruck?
Ab Start in jedem Zyklus bis sie 0 ist.
. - Welchen Wert hat die Variable, wenn afterc() abgelaufen ist?
0
. - 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...
. - 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.
. - Was passiert, wenn ich zur Laufzeit von afterc() der Variablen einen neuen Wert zuweise?
Es ändert die verbleibende Laufzeit!
. - 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!
. - 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.
. - Wenn der Timer abgelaufen ist, darf ich dann die Variable wieder frei verwenden?
Wird nicht erwähnt, ich vermute aber mal ja...
. - 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
- In welcher Einheit wird gezählt wird und in welcher Schrittweite die Variable inkrementiert?
-
Zitat von Tessi Beitrag anzeigenEs würde also auch ohne das if(change(...)) genauso funktionieren?. 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
Kommentar