# Konvertierung einer 32 Bit Fließkommazahl nach IEEE 754 in HEX-Darstellung



## d-fan02 (27 November 2013)

Hallo liebe Gemeinde,

Meine Beckhoff SPS bekommt über TCP/IP einen 32 Bit großen Wert [DWORD] mit der HEX-Darstellung von z.B. 16#3A199DCB in ein Register geschrieben.
Diese HEX-Folge repräsentiert nach der IEEE 754 Konvertierung den Wert 0,000586. 
Meine Frage an euch. Wie bekomme ich mit TwinCAT-PLC genau diesen Wert von 0,000586 durch eine Typumwandlung oder etc. zurück? Es zeigt mir leider immer nur den Dezimalwert von 
974757323 an. Dieser Wert entspricht aber nicht den Wert 0,000586 nach IEEE 754. 

Ich würde mich über einen Gedankenimpuls sehr freuen.

d-fan02


----------



## Mobi (27 November 2013)

Was ist, wenn du den Bereich einfach als REAL deklarierst?


----------



## d-fan02 (27 November 2013)

Hallo Mobi,
danke für deine schnelle Anteilnahme. Welchen Bereich meinst du genau? DWORD_TO_REAL finktioniert leider nicht. SPS hab ich gerade nicht zur Hand und besitze nur die 64Bit-Engineering Version ohne Runtime. 

Danke


----------



## LowLevelMahn (27 November 2013)

passt doch?

uint32 wert als hex: 0x3A199DCB
uint32 wert als dez: 974757323
cast auf float32: 0.00058599998


----------



## Chräshe (27 November 2013)

Auf irgend eine Variable wird der Wert ja geschrieben.
Wie ist diese Variable deklariert?
Wenn sie als REAL deklariert wurde, sollte es passen.
Einzig die Bytefolge könnte noch Probleme machen...


----------



## Chräshe (27 November 2013)

Beim Beobachten kann man angeben, ob man die Werte in Hex, Bool, oder Dez sehen will...
-> einfach Rechtsklick, wenn man online ist


----------



## d-fan02 (27 November 2013)

Das mit der Darstellung ist mir bekannt, programmiere aber hauptsächlich in HEX-Schreibweise.

Meint Ihr eine zusätzliche Konvertierung in FLOAT also LREAL??? "Cast auf FLOAT32"????

Danke


----------



## LowLevelMahn (27 November 2013)

> Es zeigt mir leider immer nur den Dezimalwert von
> 974757323 an. Dieser Wert entspricht aber nicht den Wert 0,000586 nach IEEE 754.



doch das ist genau richtig so

hab nur deine Werte in C getestet und es kommen genau die Erwarteten Ergebnisse raus - passt alles so weit

mit float32 meinte ich nur das ich es in einen 32bit float gesteckt habe (single precision), unter S7 wäre das ein REAL, ein LREAL ist eher 64Bit also ein double (double precision, was in deinem Fall falsch wäre)

ich glaube die DWORD_TO_REAL macht keinen Cast sondern konvertiert deine Ganzzahl in einen REAL-Wert - also nimmt nicht einfach nur das Bitmuster


----------



## Mobi (28 November 2013)

DWORD_TO_REAL macht das selbe wie DWORD_TO_INT. Nur das DWORD_TO_REAL noch ein Komma ranmacht, sodass man es für Berechnungen mit anderen REALs nutzen kann.

DIe Variable wo der Wert reingeschrieben wird, musst du nur als REAL deklarieren oder du deklarierst eine neue REAL-Variable mit einem Pointer auf den Bereich/Register.


----------



## MSB (28 November 2013)

DWORD_TO macht technisch eigentlich gar nichts.
Das ist eigentlich nur ein 1 zu 1 Move des Bitmusters,
ohne wie auch immer geartete Konvertierung.

Für die Online Anzeige ist das DWord einfach eine Vorzeichenlose Ganzzahl,
in dem Fall halt des Bitmusters der entsprechenden Real Zahl.

Gesendet von meinem GT-I9505 mit Tapatalk


----------



## Mobi (28 November 2013)

Mit einem DWORD kannst du aber nicht z.B. dividieren. D.h. du musst es dann zu einem REAL konvertieren. Also wird es dann im Speicher quasi von einer Ganzzahl zu einem IEEE754-formatierten Float umgewandelt.


----------



## MSB (28 November 2013)

Es wird aber nicht gewandelt oder konvertiert, sondern nur das Bitmuster kopiert.

Sprich das Bitmuster des DWORD ist vorher bereits eine Float Zahl,
und du sagst mit DWORD_TO_REAL dem Compiler nur das sich im DWORD eben jenes Real-Bitmuster versteckt.

Gesendet von meinem GT-I9505 mit Tapatalk


----------



## Mobi (28 November 2013)

Wenn in einem DWORD "000030B9" drin steht heißt das ja dezimal 12473. Will man das aber als REAL haben muss es ja 12473.0 heißen. Also macht man DWORD_TO_REAL. D.h. im Speicher steht dann statt "000030B9", "4642E400" und dies ist dann als IEEE754-Format. Und somit auch ein anderes Bitmuster.


----------

