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?