Thema: Delphi IEEE-Float to Real

Einzelnen Beitrag anzeigen

Domino

Registriert seit: 7. Okt 2003
6 Beiträge
 
#9

Re: IEEE-Float to Real

  Alt 8. Okt 2003, 21:06
Hallo,
ich kenne dein OCX nicht, mit dem du die Daten von der S7-Steuerung holst. Die Reihenfolge der Bits ist jedenfalls umgedreht. Probier doch mal, nachdem du die Bits der 4 Bytes vertauscht hast, folgenden Code:

procedure myProc;
var
buffer : array[0..3] of byte;
abData : array[0..3] of byte;
rData : single;
i : integer;
begin
//Beispiel für die Zahl 5:
// buffer enthält die 4 umgedrehten Bytes:
buffer[0] := 64; // binär 01000000
buffer[1] := 160; // binär 10100000
buffer[2] := 0; // binär 00000000
buffer[3] := 0; // binär 00000000

// Reihenfolge der 4 Byte vertauschen
for i := 0 to 3 do
abData[i] := buffer[3-i];

//Umwandeln der 4 Byte in in single-Variable
CopyMemory(@rData, @abData, 4); //Windows-Funktion, siehe Hilfe Windows SDK
// als Ergebnis enthält rData die Zahl 5 !!

//Beispiel für die Zahl 4:
// buffer enthält die 4 umgedrehten Bytes:
buffer[0] := 64; // binär 01000000
buffer[1] := 128; // binär 10100000
buffer[2] := 0; // binär 00000000
buffer[3] := 0; // binär 00000000

// Reihenfolge der 4 Byte vertauschen
for i := 0 to 3 do
abData[i] := buffer[3-i];

//Umwandeln der 4 Byte in in single-Variable
CopyMemory(@rData, @abData, 4);
// als Ergebnis enthält rData die Zahl 4 !!


//Beispiel für 5.01:
// buffer enthält die 4 umgedrehten Bytes:
buffer[0] := 64;
buffer[1] := 160;
buffer[2] := 81;
buffer[3] := 236;

// Reihenfolge der 4 Byte vertauschen
for i := 0 to 3 do
abData[i] := buffer[3-i];

//Umwandeln der 4 Byte in in single-Variable
CopyMemory(@rData, @abData, 4); //Windows-Funktion, siehe Hilfe Windows SDK
// Ergebnis für rData : 5.01000022888184 (single-Genaugkeit !)


//Beispiel für 5.02:
// buffer enthält die 4 umgedrehten Bytes:
buffer[0] := 64;
buffer[1] := 160;
buffer[2] := 163;
buffer[3] := 215;

// Reihenfolge der 4 Byte vertauschen
for i := 0 to 3 do
abData[i] := buffer[3-i];

//Umwandeln der 4 Byte in in single-Variable
CopyMemory(@rData, @abData, 4); //Windows-Funktion, siehe Hilfe Windows SDK
// Ergebnis für rData : 5.01999998092651 (single-Genaugkeit !)


end;

PS: Welches OCX benutzt du?
  Mit Zitat antworten Zitat