Bitfolge (IEEE-754) in REAL konvertieren

Toddy80

Level-1
Beiträge
160
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin zusammen,

ich lese Daten (Float-Werte) über Modbus ein und möchte diese in der SPS weiter als REAL-Werte verwenden.
Ich lese pro Messwert 2 Wörter aus.

Die beiden Wörter setze ich zu einem Doppelwort zusammen.
Ich bekomme z.B. ein Doppelwort mit folgendem Inhalt: 01000000 01000000 00000000 00000000
Das Datenformat ist entspricht IEEE-754.
Eine Konvertierung (z.B. unter: https://www.h-schmidt.net/FloatConverter/IEEE754de.html) ergibt einen Messwert von 2,5.
Dieser Messwert ist auch korrekt.

Wie kann ich die Bitfolge im IEEE-754-Format in TwinCAT umwandeln um den korrekten Messwert zu erhalten?
Alle Versuche per Pointer, festen Adressen und Konvertierungsbefehl sind gescheitert.
 
Mit nem Pointer geht es so.
Die richtige Bytereihenfolge vorrausgesetzt.

dwSrc : DWORD := 16#40200000;
rDst : REAL;
pDst : POINTER TO DWORD;
-----------------------
pDst := ADR(rDst);
pDst^:= dwSrc;

Wenn Du einen Wert von 2.300372e-041 erhältst müssen die Worte vertauscht werden. z.B. mit ROR.
 
Wie kann ich die Bitfolge im IEEE-754-Format in TwinCAT umwandeln um den korrekten Messwert zu erhalten?
Beachte: genaugenommen darf da nichts "umgewandelt" werden, weil das Bitmuster der 2 Word hat schon das Bitmuster eines REAL. Man muß nur die Bitmuster der beiden Word in der richtigen Byte-Reihenfolge in eine REAL-Variable speichern, aber so, daß das TwinCat nicht irgendwas umwandelt/konvertiert. Das geht in TwinCat nur über Speichern in einen Speicher und umkopieren in eine REAL-Variable mit MEMCPY, oder direkt wieder als REAL-Wert herauslesen per Pointer oder UNION, oder per Pointer direkt in eine REAL-Variable speichern. Der Trick dahinter: Das TwinCat darf dabei nicht wissen, daß das Bitmuster in eine REAL-Variable gespeichert wird, weil dann will es unbedingt das Bitmuster von Ganzzahl zu REAL konvertieren/umwandeln, was ja falsch ist.
 
Zurück
Oben