Round Problem in Wago

Begonnen von NightWatcher, 06. Februar 2015, 11:26:18

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

NightWatcher

Hat schonmal jemand nen gerundeten Wert auf einen Merker gelegt und diesen über Modbus ausgelesen?

Man bekommt komischerweise einen Wert mit 11 Nachkommastellen. (siehe Anhang).

Ist der Wert z.b. genau 20 oder 20.5, dann wird er korrekt an den Merker gegeben.

Könnte jemand den Fehler irgendwo vermuten?

P: Nicht von den Unterschiedlichen Werten (Visu - CodeSys blenden lassen)  ;)

[gelöscht durch Administrator]

peewit

hi


eine real zahl wird intern als 32bit wert im speicher abgelegt (nach IEEE754)
wenn du eine real zahl über modbus übertragen willst dann gibt es zwei möglichkeiten

du überträgst die zahl als text (string) was aber ziemlich umständlich ist
oder du nimmst den 32bit wert der real-variable und übergibst sie in zwei modbusregister (2x 16 bit)
und machst auf der anderen seite genau das gegenteil -> aus 2x16bit wert eine echte real-zahl


damit du das machen kannst haben wir "vor langer" zeit schon in oscat basic die beiden bausteine REAL_TO_DW und DW_TO_REAL erfunden

real-wert  mittels REAL_TO_DW in zwei 16bit worter konvertieren
dann über modbus übertragen

auf der anderen seite müssen die zwei 16 bit modbus werte wieder mittels DW_TO_REAL zurückwandeln

gruss peewit


NightWatcher

Hi Peewit,

das Problem mit den 11 Nachkommastellen passiert aber nur, wenn ich den Wert runde.

Übergebe ich den real vor dem Baustein an den Merker (mit den 4 Nachkommastellen), dann erhalte ich den richtigen Wert im Frontend.

Weisst du, was ich meine?

peewit

eine real-variable kann nicht immer genau die gewünschte zahl darstellen
es ist immer eine annäherung !!!

eine real variable kann einen sehr grossen zahlenbereich darstellen inklusive viele nachkommastellen
dafür aber nicht jede zahl exakt.

sodass sich bei manchen genauen decimal zahlen in real eine ungefähre zahl ergibt.

NightWatcher

Hi, irgendwie ist es aber dennoch komisch. Denn sofern nicht gerundet wird, ist die Zahl korrekt im register. Wago stellt er ins codesys auch richtig dar.

Gibst du mir also recht, dass man mit der wago nicht runden kann, sofern man den Wert über modbus auslesen möchte.

Dann muss ich mit nen weg überlegen, es im Script zu runden.

peewit

#5
wenn ein wert als real-zahl nicht genau darstellbar ist , dann kannst du runden bis du schwarz wirst

beispiel
die decimale zahl 0.1 als real kannst du nicht genau als real darstellen

daraus wird 1.00000001490116119384765625E-1


und aus der zahl 7.8 wird eigentlich 7.80000019073486328125E0


was wahrscheinlich codesys macht ist das es einfach nach gewissen anzahl an nullen nach dem komma den angezeigten wert "normalisiert" also rundet

das ist aber nur der angezeigte wert !

verabschiede dich von den gedanken das du mit real jede zahl exakt darstellen kannst

real ist zb für finanz rechnung (geldbeträge) ungeeignet !!!


http://www.binaryconvert.com/result_float.html?decimal=048046049

NightWatcher

#6
Das macht Sinn.

Ich danke dir für die ausführliche Aufklärung. Dann werde ich das ganze in meiner Visualisierung entsprechend runden.

PS: Kannst du denn erklären, wieso der Wert vom Temperatur Sensor, welcher über 1wire als real kommt, Punktgenau (3 Stellen nach dem Komma) angezeigt und übertragen wird? Müsste er laut deiner Erklärung nicht dann auch n Nachkommastellen besitzen

peewit

er hat vielleicht auch viele nachkommastellen da frage ist ob der angezeigte wert der reale ist oder
ein optisch gerundeter


das ist jetzt schwierig zu überprüfen da du ja nicht wirklich feststellen kannst


probiere doch mal real_to_string
normalerweise sollte hier der echte wert zum string werden und kein gerundeter

NightWatcher

Zitat von: peewit in 09. Februar 2015, 10:32:14
er hat vielleicht auch viele nachkommastellen da frage ist ob der angezeigte wert der reale ist oder
ein optisch gerundeter

Er liegt zumindest nicht mit sovielen Nachkommastellen im Register, wie beim Round Baustein (sondern nur mit 4, wie es der Sensor auch ausspuckt).

real_to_string gibt auch nur die eine Nachkommastelle aus. (Anhang)

[gelöscht durch Administrator]

peewit


wert 5.4 kann in real intern nur so dargestellt werden    5.400000095367431640625


die anzeige in codesys zeigt dir immer nur  5.4000000
und der rest 95367431640625 wird wegoptimiert da es im 100 miilionstel liegt

NightWatcher

Hi,

den Grundsatz dahinter habe ich verstanden. Auch dass es in Codesys nicht angezeigt wird.

Übergebe ich dem Temperaturwert aber DIREKT an den register, dann erhalte ich dort den korrekten wert auf 4 Nachkommastellen genau. Da ist nicht mit 20 Nachkommastellen.

Das ist das, was mich wundert. Vielleicht denke ich auch zu kompliziert  ::)