# Round Problem in Wago

**URL:** <https://oscat.discourse.group/t/round-problem-in-wago/1872>\
**Category:** oscat.lib fuer TwinCAT/CoDeSys\
**Created:** [6. Februar 2015 um 10:26 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872 "2015-02-06T10:26:18Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [6. Februar 2015 um 10:26 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/1 "2015-02-06T10:26:18Z")

</div>

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]

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [6. Februar 2015 um 11:52 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/2 "2015-02-06T11:52:10Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [6. Februar 2015 um 12:42 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/3 "2015-02-06T12:42:36Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [8. Februar 2015 um 15:26 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/4 "2015-02-08T15:26:49Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [8. Februar 2015 um 16:27 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/5 "2015-02-08T16:27:59Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [9. Februar 2015 um 06:47 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/6 "2015-02-09T06:47:49Z")

</div>

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 !!!

> **[Online Binary-Decimal Converter](https://www.binaryconvert.com/result_float.html?decimal=048046049)**
>
> Online binary converter. Supports all types of variables, including single and double precision IEEE754 numbers

---

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [9. Februar 2015 um 07:03 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/7 "2015-02-09T07:03:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [9. Februar 2015 um 09:32 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/8 "2015-02-09T09:32:14Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [9. Februar 2015 um 10:04 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/9 "2015-02-09T10:04:07Z")

</div>

> [@peewit post:8](#):
>
> 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]

---

<div class="post-metadata">

**Author:** ![peewit](https://avatars.discourse-cdn.com/v4/letter/p/ecc23a/32.png) [@peewit](https://oscat.discourse.group/u/peewit)\
**Post date:** [9. Februar 2015 um 12:32 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/10 "2015-02-09T12:32:23Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![NightWatcher](https://avatars.discourse-cdn.com/v4/letter/n/58f4c7/32.png) [@NightWatcher](https://oscat.discourse.group/u/NightWatcher)\
**Post date:** [9. Februar 2015 um 17:30 UTC](https://oscat.discourse.group/t/round-problem-in-wago/1872/11 "2015-02-09T17:30:47Z")

</div>

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 :🙂
