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

d-fan02

Level-1
Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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...
 
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
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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.
 
Zurück
Oben