Sonstiges SFC64, Überlauf und ein wenig 32Bit-Mathematik

RONIN

Level-3
Beiträge
2.529
Reaktionspunkte
773
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

Ich war grad dabei einen Baustein zu schreiben der den SFC64 (TIME_TCK) einsetzt. Natürlich habe ich mir dabei über den Überlauf Gedanken gemacht und
ein wenig mit Zahlenwerten herum gespielt. Dabei ist mir etwas aufgefallen.

Nimmt man zum Beispiel den höchst möglichen Positiven Zahlenwert DW#16#7FFFFFFF oder +2147483647 und zieht davon L#100 ab bzw. addiert L#100 auf so erhällt man die Werte:

+2147483547 und
-2147483549

Man kann die beiden Werte jetzt als Beispiel für einen Wert vor dem Überlauf und für einen nach dem Überlauf hernehmen. Die absolute Differenz zwischen den Werten beträgt 4294967069.
Schreibt man jetzt in AWL aber:
L L#2147483547
L L#-2147483549
-D
oder
L L#-2147483549
L L#2147483547
-D

So lauten die Ergebnisse +200 bzw. -200 weil -D ja zwei 32Bit-Zahlen (unabhängig des Vorzeichens) voneinander subtrahiert.

Lange Rede, kurzer Sinn. Eigentlich muss man dann nicht immer den Überlauf von SCF64 durch eigenen Code abfangen, sondern nur wenn man sie direkt vergleicht oder absolut
behandelt.

Wenn man jetzt aber die Differenz bildet (zum Beispiel als "Elapsed-Time"-Wert) und mit dieser weiterarbeitet, so fällt der Überlauf eigentlich nicht ins Gewicht.
Wenn man dass so macht brauch man für den Überlauf keinen separaten Code zu schreiben

Oder vertuh ich mich da...
SFC64_Ueberlauf_Mathe_2.png
<EDIT>Hab das angehängte Beispiel so angepasst dass es zum Beitrag passt.</EDIT>
 
Zuletzt bearbeitet:
Hallo Ronin,

du mußt berückschtigen dass die SFC64 nach dem Überlauf bei Null beginnt. Im Gegensatz zum Format "TIME" gibt es bei der SFC64 keine negative oder vorzeichenlose Werte.


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:icon_eek:, *FACEPALM*, :oops:
Das hat grad richtig weh getan.

Wie konnte ich dass den vergessen!!! Ich glaub heute schreibe ich wohl keine einzige Zeile mehr, bevor ich auf noch mehr blödsinnige Gedanken komm.
Ein elementarer Fehler in der Überlegung und schon zerbröselt alles....

Danke Onkel. Damit hat sich das wohl erledigt!
 
Zuletzt bearbeitet:
Ohne Opfer kein Sieg :ROFLMAO: .
Bei CodeSys ist es übrigens so, wie du es versucht hast. Dort läuft die Systemzeit ins Negative bzw. über die vollen 32 Bit (habe ich zumindest mal gehört).
 
Zurück
Oben