FLOAT IEEE 754 in Dezimahlzahl

Eco123

Level-1
Beiträge
33
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forums Gemeinde, hätte kurz eine Frage an euch. Weiß jemand wie man eine IEEE 754 FLOAT Zahl in eine "lesbare" Dezimahlzahl umwandeln kann in Twincat 3?

Bekomme nämlich vom Gerät mit dem ich Kommuniziere in Hex folgendes übermittelt : 0x42A00000. Dies würde dann ja 80.0 entsprechen. Gibt es da vielleicht eine Funktion von Beckhoff? Der Wert der vom Gerät übermittelt wird ist ein 32Bit Wert.

Danke

Gruss
 
Hallo, habe es gerade selber herausgefunden. Das ganze kann man mit einem Pointer machen, indem man den Wert auf einen Pointer legt und dessen Inhalt dann ausliest.

In etwa so :

dwEingangsdaten : DWORD;
pZahl : POINTER TO REAL;
rErgebnis : REAL;

pZahl := ADR(dwZahl);

rErgebnis := pZahl^;

Vieleicht brauch es mal jemad.

Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ganze kann man mit einem Pointer machen, indem man den Wert auf einen Pointer legt und dessen Inhalt dann ausliest.
nee, nicht "den Wert auf einen Pointer" sondern einen REAL-Pointer auf die DWORD-Variable ...

Das macht aber nicht aus einer IEEE-754-Float-Zahl eine "lesbare Dezimalzahl", sondern holt das Bitmuster eines DWORD in eine REAL-Variable, ohne daß TC3 eine unerwünschte Konvertierung vornimmt.

Das ganze geht auch ohne Pointer, indem man eine DWORD-Variable und eine REAL-Variable in einer UNION übereinanderlegt, und das DWORD hineinspeichert und als REAL wieder herausliest. :cool:

Harald
 
Hallo Harald, danke für deine Antwort.
Aber meine "Rohzahl" also meine Float Zahl ist am Anfang eine DWORD Variable. Ich bekomme den Wert nämlich als 4 Bytes übertragen und muss Sie dann zuerst noch richtig shiften und zusammensetzen damit ich eine ganze Zahl herausbekomme. Und wenn ich das ganze dann so mache wie ich es oben Beschrieben habe, also das DWORD dann auf einen POINTER OF REAL und danach den Inhalt des POINTERS auf eine REAL Variable gebe funktioniert es und es kommt genau das raus was soll.

Deshalb verstehe ich nicht ganz wie du meinst einen REAL POINTER auf die DWORD Variable?

Das mit dem UNION hatte ich noch nicht Überlegt, werde ich mir aber anschauen.

Danke

Grüsse
 
Hallo Eco

Ich wollte nur hinweisen daß Deine Ausdrucksweise irreführend bzw. nicht ganz korrekt ist - da wird nicht ein DWORD auf einen Pointer gegeben, sondern andersrum ein Pointer auf eine DWORD-Variable gesetzt und behauptet es wäre die Adresse einer REAL-Variable, so daß der TC3-Compiler das frisst ohne den Inhalt der Variable zu manipulieren/ohne zu konvertieren.
Tatsächlich läuft Dein Code so: die Adresse der DWORD-Variable wird in einen Pointer geladen (nun zeigt der Pointer auf die DWORD-Variable) und dann wird indirekt (mit dem Pointer) der Wert der DWORD-Variable gelesen und das gelesene 32-Bit-Bitmuster ohne Änderung in eine REAL-Variable geschrieben, weil der Pointer "glaubt" daß er auf eine REAL-Variable zeigt und ein REAL-Wert gelesen wurde.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald, ja stimmt, habe mich da wohl falsch ausgedrückt. Es stimmt natürlich so wie du es sagst. Aber das ganze sollte so passen oder liege ich falsch?
Oder würdest du eher den Weg über das UNION empfehlen?

Danke

Grüsse
 
Ich bevorzuge die UNION-Variante, weil die auch mit Variablen funktioniert, welche nicht über ihre Adresse adressierbar sind (wo nur direkte symbolische Adressierung möglich/erlaubt ist, wie z.B. bei Siemens S7 und "optimiertem" Speicher).

Frag mal Deine Kollegen, welche Programmvariante die besser verstehen würden, falls die mal einen Blick in Deine Programme werfen müssen.

Harald
 
Hallo Harald,
das mit der UNION funktioniert nur, wenn das mit den Indianern stimmt und nicht die Byte-Order eine andere ist, was, wenn ich den TE richtig verstehe, der Fall ist.

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
das mit der UNION funktioniert nur, wenn das mit den Indianern stimmt und nicht die Byte-Order eine andere ist
Wenn die Byte-Order nicht stimmt, dann funktioniert es auch nicht mit einem Pointer. Sprich: die Byte-Order ist kein Kriterium, was UNION oder POINTER erzwingen würde.

Harald
 
Hallo Harald, habe das mit dem Union nun umgesetzt. Ich brauch da lediglich die 2 Variablen, also eine DWORD Variable und eine REAL Variable im Union anlegen. Dann das WORD an die DWORD Variable des UNION übergeben und danach den REAL Wert des UNION auslesen? Habe ich das so richtig verstanden?

Danke für die Hilfe

Grüsse
 
Sorry, Schreibfehler. Ich meinte natürlich DWORD. Also das DWORD welches meine "Roh" Float Variable beinhaltet die ich mir vorher zusammensetzen muss, da ich die variable in 4 Bytes geschickt bekomme. Könnte natürlich die 4 Bytes auch direkt an das DWORD vom Union übergeben.
 
Ja, das hast Du richtig verstanden.
Dieselben 4 Byte im Speicher haben dann zwei verschiedene Namen und zwei verschiedene Datentypen, die Du je nach Bedarf ansprechen kannst.
 
Zurück
Oben