Zähler Überlauf überwachen

Poldi007

Level-1
Beiträge
108
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, haben einen Zähler mit einen Doppelinteger (bis +2147483647).
Zähle ich dann weiter, wird der Wert negative. Wie kann ich das verhindern, bzw. eine Warnung audgeben oder wieder bei Null beginnen?
Danke im Voraus.
 
Hallo,
damit hast du dann die Grenze des Bereichs DINT erreicht.
Du könntest :
- im Zählbereich nur Werte bis z.B. 2.000.000.000 zulassen.
- den Wertesprung erfassen (letzter Wert zu aktueller Wert)
- dir mit Hilfe z.B. der Oscat-Lib einen Quad-Integer bauen.
- mit einem Offset arbeiten, das es grundsätzlich verhindert, das solche Werte entstehen.

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie wärs wenn du den Zähler zurücksetzt sobald er den Maximalwert erreicht hat?

Code:
L Zähler
L L#Maximalwert
==D
R Zähler
oder falls du einen Zähler durch addieren nachbildest trandferierst du einfach eine "0" in den Zählwert

Code:
L DBy.dbdy
L L#Maximalwert
==D
L L#0
t dby.dbdy
Somit fängt der Zähler nach erreichen des Maximalwertes immer wieder bei "0" an. Zusätzlich könntest du noch einen Merker dabeiprogrammieren der dann z.B. eine Hinweismeldung ansteuert.
 
Sorry, ich habe gerade festgestellt da noch ein Sprung rein muss!:icon_redface:

Code:
L DBy.dbdy
L L#Maximalwert
==D
spbn ende
L L#0
t dby.dbdy
ende: Nop 0
 
Hallo,
wie wäre es einfach das oberste Bit auszumaskieren,
dann brauchst du sonst gar nichts machen

Wenns das Vorzeichen nicht gibt ist der Zähler immer positiv.

Dann hast du einen 31 Bit Zähler.

Vielleicht geht ja auch einen UDINT verwenden ?

lg
bb
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die "normalen" Zähler blockieren biem Maximalwert.
Durch Addition kann man eben einen Überlauf haben.
Um das abzufangen gibt es den SPO Befehl:
L #Zaehler
+ 1
SPO over
T #Zaehler
SPA weiter

over: L 0
T Zaehler

_____

In KOP und FUP ist der ENO Ausgang der Addition gleich Null wenn überlauf,
und gleich Eins wenn alles OK.
 
Oder du zählst eine Realzahl hoch....
Die geht noch weiter.

Aber wofür musst du soviel Zählen?!

Gruß wolder
 
Zähler 0...999.999.999 mit Wrap zu 0 und Übertrag

Oder du zählst eine Realzahl hoch....
Die geht noch weiter.
Das stimmt leider nicht, eine REAL-Zahl hochzählen funktioniert nur eingeschränkt.
Bei knapp 17 Millionen bleibt der Zähler stehen: 16.800.000,0 + 1,0 = 16.800.000,0 !!


Zähler 0 bis 999.999.999 mit automatischem Überlauf/Rückstellung zu 0
Code:
      L     DBx.DBDy                    //alter Zählerstand
      +     L#1                         //Zähleinheit addieren
      L     L#1_000_000_000             //max Zählumfang
[COLOR="RoyalBlue"]      >=D
      =     "Uebertrag"
      S     "Ueberlaufwarnung"[/COLOR]
      MOD                               //Wrap zu 0
      T     DBx.DBDy                    //neuer Zählerstand
Die blauen Programmzeilen werden nur benötigt, wenn eine Überlaufwarnung oder Kaskadierung
mehrerer Zähler zur Erhöhung des Zählumfangs erfolgen soll.

Gruß
Harald
 
Danke PN/DP!
Wußte ich noch nicht. Hab ich auch noch nie ausprobiert.
Mir ist noch kein Fall in die Quere gekommen, wo ich so viel Zählen musste.

Gruß wolder
 
Mir ist noch kein Fall in die Quere gekommen, wo ich so viel Zählen musste.
Typischer Anwendungsfall eines Zählers mit sehr großem Zählumfang sind Wasserzähler (oder andere Medien), wo nach ein oder mehreren Jahren der Gesamtverbrauch abgelesen werden soll. Da kann es sogar nötig werden, daß zwei DINT-Zähler kaskadiert werden. Deshalb hat mein Beispielzähler einen "unökonomischen" Zählumfang 0...999.999.999 und nicht 0...1.999.999.999, das kaskadiert sich wesentlich leichter.

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

ok. Kann ich mir vorstellen.

Dann würde ich das mit 2 Dint machen.
Der 1. für die Zahlen über 1 mrd. und der 2. bis 1mrd.

Danke und gruß
Wolder
 
Zurück
Oben