Nochmal zum Block Time() ...
dieser hat laut Anleitung einen Maxwert von 49d17h2m47s295ms (4194967295 ms)
was passiert dann nach 49 Tagen -> er wird auf 0 gesetzt
als Beispiel der Block m_t aus Oscat 1.7 ..
( check for rst input )
IF rst OR et >= tmax THEN
init := FALSE; startup := FALSE; pt := t#0ms; et := t#0ms;
END_IF;
( avoid timers to start when input is true at startup )
IF NOT startup THEN
edge := in; startup := TRUE;
( read system timer )
tx := TIME();
( edge trigger rising and falling edge )
IF in XOR edge THEN
edge := in; (* rising edge starts measurement *) IF in THEN init := TRUE; start := Tx; (* falling edge stops measurement *) ELSIF init THEN stop := Tx; pt := stop - start; END_IF;
IF init AND in THEN
et := Tx - start; ELSE et := t#0ms;
was passiert nun, wenn die steigende Flanke bei Time():=49d17h2m47s295ms kommt -> dann wird diese in Start gespeichert
Danach kommt die fallende Flanke nach dem Reset des Timers, also bei Time():=500ms.
Dann erfolgt die Berechnung der Differenz aus: et := Tx - start -> dies wäre dann Tx:=500ms - 49d17h2m47s295ms
-> dabei kommt es sicher zum Ãœberlauf ...
Viele Grüße
Hendrik
ja es kommt zu einem überlauf.
jedoch ist das ergebnis einer subtraktion wieder richtig.
probiere es einfach aus:
setzte eine dword variable var_1 auf 0. ziehe davon 10 ab.
setzte ein zweite dword variable var_2 auf 10.
errechne nun das ergebnis var2 - var 1 und du bekommt genau die 20 die der differenz zwischen var 1 und var 2 entsprechen.
eine subtraktion funktioniert auch bei überlauf, andere dinge wie vergelich größer kleiner oder addition jedoch nicht.
deshalb benutzen wir in oscat immer nur das ergebnis der subtraktion endwert - startwert. das geht immer, auch bei überlauf.
Log in to post a comment.
Nochmal zum Block Time() ...
dieser hat laut Anleitung einen Maxwert von 49d17h2m47s295ms (4194967295 ms)
was passiert dann nach 49 Tagen -> er wird auf 0 gesetzt
als Beispiel der Block m_t aus Oscat 1.7 ..
( check for rst input )
IF rst OR et >= tmax THEN
END_IF;
( avoid timers to start when input is true at startup )
IF NOT startup THEN
END_IF;
( read system timer )
tx := TIME();
( edge trigger rising and falling edge )
IF in XOR edge THEN
END_IF;
IF init AND in THEN
END_IF;
was passiert nun, wenn die steigende Flanke bei Time():=49d17h2m47s295ms kommt -> dann wird diese in Start gespeichert
Danach kommt die fallende Flanke nach dem Reset des Timers, also bei Time():=500ms.
Dann erfolgt die Berechnung der Differenz aus: et := Tx - start -> dies wäre dann Tx:=500ms - 49d17h2m47s295ms
-> dabei kommt es sicher zum Ãœberlauf ...
Viele Grüße
Hendrik
ja es kommt zu einem überlauf.
jedoch ist das ergebnis einer subtraktion wieder richtig.
probiere es einfach aus:
setzte eine dword variable var_1 auf 0. ziehe davon 10 ab.
setzte ein zweite dword variable var_2 auf 10.
errechne nun das ergebnis var2 - var 1 und du bekommt genau die 20 die der differenz zwischen var 1 und var 2 entsprechen.
eine subtraktion funktioniert auch bei überlauf, andere dinge wie vergelich größer kleiner oder addition jedoch nicht.
deshalb benutzen wir in oscat immer nur das ergebnis der subtraktion endwert - startwert. das geht immer, auch bei überlauf.