Vorzechenlose Ganzzahl 32Bit (DWORD) in REAL wandeln und zurück.

cosmomaster

Well-known member
Beiträge
72
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen ich habe eine VorzeichenLOSE Ganzzahl 32bit als DWORD vorliegen.

Nun möchte ich diese um in S7 ordentlich arbeiten zu können in ein REAL wandeln und zwar über den ganzen Bereich also 2^0 - 2^32.

Gibt es dafür einen Baustein?

Mit Befehl DTR geht es nicht, denn 2^32 (16#FFFFFFFF) ergibt -1.
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
Hallo,
es gibt dann erstens die Einschränkung, das die Wandlung das Ding wie einen DINT behandelt (was du ja schon bemerkt hast) - gut dafür könnte man sich ggf. einen Workaround schaffen wenn man das Ganze Wort-weise betrachtet - aber das Nächste ist dann ja die Genauigkeit des Real's. Der stellt ja nur ein paar Nachkommastellen dar (ich meine 6) und mehr gibt es dann auch nicht. Das heißt dann das einen große Zahl nach der Wandlung inhaltlich schon nicht mehr stimmt (wenn es dir hier auf die Genauigkeit ankommt) ...

Gruß
Larry
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.103
Punkte Reaktionen
3.820
Zuviel Werbung?
->Hier kostenlos registrieren
Theoretisch müßtest du mit DTR wandeln und dann (wenn negativ) 4294967295 ( entspricht FFFFFFFF) dazu addieren.
4294967295 in Real gehr aber leider nicht so genau aufzulösen, da Real nur mit 7 Ziffern Genauigkeit arbeitet. Daher wird eine Wandlung so großer Zahlen also ungenau.
Du könntest auch einfach deine DWord durch 2 dividieren, wandeln und anschließend die Real mit 2.0 multiplizieren.
 

PN/DP

User des Jahres 2011-2013; 2015-2017; 2020-2021
Beiträge
19.482
Punkte Reaktionen
5.873
Du könntest auch einfach deine DWord durch 2 dividieren, wandeln und anschließend die Real mit 2.0 multiplizieren.
.. wenn die zusätzliche Ungenauigkeit durch das Verringern der Rechenauflösung um 1 Bit tolerierbar ist. (?)
Das Dividieren darf dann aber das höchste Bit im DWORD nicht als Vorzeichen interpretieren.
Also NICHT mit "/D" sondern mit "SRD 1" dividieren.

Ich würde die Zahl gar nicht in REAL wandeln, sondern immer in Ganzzahl (vorzeichenlos!) rechnen.

Harald
 

Ralle

Supermoderator
Teammitglied
Beiträge
15.103
Punkte Reaktionen
3.820
Zuviel Werbung?
->Hier kostenlos registrieren
.. wenn die zusätzliche Ungenauigkeit durch das Verringern der Rechenauflösung um 1 Bit tolerierbar ist. (?)
Das Dividieren darf dann aber das höchste Bit im DWORD nicht als Vorzeichen interpretieren.
Also NICHT mit "/D" sondern mit "SRD 1" dividieren.

Harald

Ist klar, bei kleinen Zahlen verliert er dann das Bit, aber ich würde dann ohnehin zuerst prüfen, ob die Prozedur (/2,*2.0) nötig ist und nur bei Dword größer 7FFFFFFF diese anwenden.
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
.. und beim beobachten sieht man nur Gemüse.:sad:

Die größte Zahl in REAL ohne an Genauigkeit zu verlieren ist also 9.999.999 oder unsigned HEX98 96 7f?

Das mit dem Gemüse haben wir uns ja nicht so ausgesucht ... :ROFLMAO:

Und nein ... du bekommst durch die interne Erstellung der Realzahl noch weitere (relativ unkontrollierbare) Ungenauigkeiten da hinzu.
Ist jetzt nur beispielhaft ... aber aus INT/DINT/DWORD 2 kann durchaus Real 1.999997 oder 2.000003 werden ...

Gruß
Larry
 

miami

Well-known member
Beiträge
386
Punkte Reaktionen
83
Die größte Zahl in REAL ohne an Genauigkeit zu verlieren ist also 9.999.999 oder unsigned HEX98 96 7f?
Die Genauigkeit bei REAL ist exakt 24 Stellen im Dualsystem. Das ergibt eben ungefähr 6 bis 7 Stellen im Dezimalsystem.
Wo genau die Grenze liegt kann ich nicht sagen, aber 9.999.999 ist sie sicher nicht. Ich bin mir auch nicht sicher, dass es eine exakte Grenze gibt. Vermutlich ist es eher ein Bereich unter dem die Wandlung immer ohne Rundung und darüber nur mit Rundung auskommt; in dem Bereich mal so oder so.

Schau dir mal http://support.automation.siemens.com/WW/view/de/22172161 an, da werden auch spannende Effekte beschrieben.
 
Zuletzt bearbeitet:
Oben