TIA Zähler, der mit Real-Zahl arbeitet

Halbi

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte eine Variable gerne im Sekunden-Takt um einen bestimmten Wert hochzählen lassen. Also eigentlich die Funktion eines normalen Zählers, nur, dass ich nicht um „1“ hochzählen will, sondern um eine Real-Zahl. Könnte mir vorstellen, dass das z.B. in SCL relativ einfach möglich ist. Leider sind meine SCL-Kenntnisse aber noch nicht so groß...
Wäre schön, wenn mir jemand weiterhelfen könnte :D

Danke schon mal!
 
Hi, in etwa so:

Code:
IF #Takt THEN
 #Variable := #Variable + 1.0;
END_IF;

#Takt muss dabei eine Flanke sein. Geht auch übrigens in KOP/FUP/AWL sehr einfach. Bei KOP/FUP eine "ADD" Box ins Programm ziehen.

Bei AWL
Code:
U #Takt
SPBN M001
L #Variable
L 1.0
+R
T #Variable
M001 : NOP 0

Achtung: Bei REAL gibts ein paar Fallen wegen der Ungenauigkeit des Formats. Es kommt zu Problemen wenn man Werte addiert die sehr weit auseinander liegen.
Wie genau kann ich mit REAL Zahlen rechnen, die in umfangreichen Formeln verwendet... - ID: 14844391 - Industry Support Siemens
 
Zuletzt bearbeitet:
Moin TP-Inc,


Code:
IF #Takt THEN
 #Variable := #Variable + 1.0;
END_IF;

nur, das der TE nicht mit 1.0, sondern mit einer Variablen inkrementieren will.

Beim Inkrementieren mit 1.0 hätte ich noch diesen Pfeil im Köcher:

Code:
IF #Takt THEN
 #Variable += 1.0;
END_IF;


oh, moment, das muss natürlich auch mit einer Variablen gehen:

Code:
IF #Takt THEN
 #Variable += #AddValue;
END_IF;


VG

MFreiberger
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Achtung: Bei REAL gibts ein paar Fallen wegen der Ungenauigkeit des Formats. Es kommt zu Problemen wenn man Werte addiert die sehr weit auseinander liegen.
Wie genau kann ich mit REAL Zahlen rechnen, die in umfangreichen Formeln verwendet... - ID: 14844391 - Industry Support Siemens
Man kann das Problem mit die Sättigung von die Mantissa umgehen indem man die Umwandlung auf REAL zuletzt macht.
Code:
IF #Flanke THEN
 #Anzahl_flanken := #Anzahl_flanken + L#1; 
END_IF;
#Ausgangs_variable := DINT_TO_REAL(#Anzahl_flanken) * #Messwert_pro_flanke ;
 
Moin Jesper,

Man kann das Problem mit die Sättigung von die Mantissa umgehen indem man die Umwandlung auf REAL zuletzt macht.
Code:
IF #Flanke THEN
 #Anzahl_flanken := #Anzahl_flanken + L#1; 
END_IF;
#Ausgangs_variable := DINT_TO_REAL(#Anzahl_flanken) * #Messwert_pro_flanke ;

guter Vorschlag. Hoffentlich will der TE nicht mit 1.01 oder 0.87 inkrementieren :ROFLMAO:

VG

MFreiberger
 
Hallo,

hier ist auch zu beachten, dass die REAL Variablen irgendwann ihre Genauigkeitsgrenze.
d.h. Bei grossen Zählerständen schlägt ein Inkrement von 1.0 nicht mehr zu Buche...
auch wenn die 1.0 tausend mal aufaddiert wird.



.....oh zu spät
 
Die Genauigkeit einer Real-Zahl sind 7 Dezimalstellen einer LReal-Zahl 12 Dezimalstellen!

Werden es mehr wird es ungenau, egal wie man rechnet!
 
Moin Jesper,

ja, das geht aber nur, wenn der zu inkrementierende Wert nicht zur Laufzeit variiert.

Möglicherweise soll ein Messwert aufaddiert werden? Um der RealZahlProblematik zu entkommen, könnte man noch einen LReal nehmen oder, wenn der Wert eine bestimmte Größe erreicht hat, in einen anderen Zähler überführen, der z.B. bei jeder 1000.0er-Überschreitung inkrementiert wird. Also, wenn 1000.056 erkannt wird, den 1000.0er-Zähler um 1 (hier könnte man wieder einen Dint nutzen) inkrementieren und die Zählervariable auf 0.056 setzen. Von da an weiter aufaddieren.

Vielleicht konkretisiert der TE seine Anforderung etwas?



VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank, ihr seid ja flott :D
Genau das hab ich gesucht, dachte mir schon dass es ganz einfach geht...
An das Genauigkeitsproblem mit den Real-Zahlen werde ich wahrscheinlich nicht kommen, da ich nicht so große Zahlen erreiche. Aber trotzdem sehr interessant!

Viele Grüße!
 
max Zählweite mit LREAL und xINT

LREAL schafft eine Auflösung von 15 Dezimalziffern.
Mit (U)LINT kann man 18 bis 20 Dezimalziffern große Zahlen verarbeiten und speichern.
Will man noch mehr Ziffern, dann kann man (U)(L)INT kaskadieren.

(x)REAL ist ein Gleitpunkt/Gleitkomma-Format, wo mit der Zahl auch die Position des Dezimalpunktes mit gespeichert wird (bzw. der Exponent (Multiplikator)).

Die (x)INT-Ganzzahlen heißen auch Festpunkt/Festkomma-Zahlen - das heißt, der Dezimalpunkt ist an einer festen Stelle - das muß aber nicht hinter der letzten Ziffer sein, es kann auch eine festgelegte/vereinbarte/"gedachte" Stelle in der Zahl sein :cool:

Das kann man z.B. so nutzen:
Ein Wasserzähler soll Einheiten von 0.001 Liter zählen. Wie weit kann man zählen ohne Genauigkeitsverlust und ohne kaskadieren?
Lösung: man zählt nicht 0.001 Liter als LREAL (rWert+=0.001;) sondern ganze Milliliter als LINT (iWert+=1;)! Und wenn man irgendwo die Zahl mit Nachkommastellen sehen will, dann fügt man für die Anzeige 3 Stellen von hinten einen Dezimalpunkt in die Anzeige ein. Dann kommt man so weit:
Code:
18_446_744_073_709_551.615 (ULINT maximal)
 9_999_999_999_999_999.999 (ULINT sinnvoll)
 9_223_372_036_854_775.807 (LINT maximal)
   999_999_999_999_999.999 (LINT sinnvoll)
   999_999_999_999_999.*** (LINT-Wert in LREAL gewandelt, die Nachkommastellen * sind nur 
                            genau, wenn sie innerhalb der 15 möglichen Ziffern liegen)
       999_999_999_999.999 (max wenn in LREAL 0.001 gezählt wird)
Auf die selbe Weise kann man anstatt Milliliter (0.001) auch Zentiliter (0.01) oder Deziliter (0.1) zählen. Oder Mikroliter ... Oder ganz andere physikalische Größen. Man kann auch "krumme Werte" wie 0.87 zählen. Wobei das Wort "zählen" eigentlich das Abzählen ganzer Einheiten meint und nicht das fortlaufende Addieren (krummer) Werte.

Harald
 
Es ist eigentlich kein Genauigkeitsproblem, sondern es addiert irgendwann garnichts mehr!

Also vereinfacht gesagt, zu ner 7-stelligen Realzahl kannst Du keine einstellige addieren...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist eigentlich kein Genauigkeitsproblem, sondern es addiert irgendwann garnichts mehr!...
Das Genauigkeitsproblem entsteht schon lange vorher, da mit immer größer werdender Differenz zwischen Summe und Summand, Kommastelle für Kommastelle bei der Addition ignoriert wird, bis sehr viel später gar nichts mehr geht. Für Zählerstände also denkbar ungünstig.

Ich frage mich allerdings, wie und warum Siemens bei den SENTRONs den Zählerstand als LREAL ausgibt.
 
Zuletzt bearbeitet:
Zurück
Oben