Byte werte in Real umrechen

enter

Level-2
Beiträge
83
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ich brauche mal eure Hilfe, wir haben eine Beckhoff Profibus Master der mit einen DPDP Koppel von einer Siemens CPU Datenaustausch das klapp soweit sehr gut und ohne Probleme bei Bit zugriffen, und Intwerten passen die Werte bloß wie rechne ich die Siemens Realwerte aus? Die Daten kommen als Byte rein hier mal die Werte byte1=66, byte2=170, byte3=0, byte4=0 da soll laut Vorgabe der Siemens 85 bei raus kommen wie Rechne ich das? Mantisse?:confused:
Danke
 
I dont know Beckhoff, but usually it can be solved by swapping the bytes. In S7 the instruction is "CAD".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
I dont know Beckhoff, but usually it can be solved by swapping the bytes. In S7 the instruction is "CAD".

... bzw. "TAD" bei deutscher Mnemonik.

wobei TAD bzw. CAD in dem Fall, da die Integer-Werte passen nichts bringen dürfte, weil da ein wenig zu viel getauscht wird ...

Ich habe auch eine Kopplung zwischen Beckhoff <-> S7 über Profibus am laufen,
hatte auf die Beckhoff-Steuerung aber keinen Einfluss.
Der Kollege, der die Beckhoff-Steuerung programmiert hat, konnte bei den Einstellungen den Bereich, den wir als "Doppelwort" also z.B. Real-Werte defniert haben,
den für Siemens notwendigen Byte-Tausch konfigurieren.

Nachdem er dieses getan hatte, hatte sowohl ich als auch eher korrekt formatierte Realwerte. (Div. Werte gingen von Beckhoff -> S7 und div. Werte von S7 -> Beckhoff).

Leider habe ich mich zum damaligen Zeitpunkt aus Zeitmangel nicht mit irgendwelchen Details bezüglich der Beckhoff-Parametrierung beschäftigt,
so das ich hier nicht mit Details dienen kann.

Mfg
Manuel
 
Byte´s zu real

Hallo,

habe hier eine Funktion die die Byte´s zu einer Real-Zahl wandelt. Ich glaube du mußt durch das Siemens-Byte-Swapping bei Array-Element [3] dein Byte 1 (66), bei Array-Element [2] dein Byte 2 (170) anschreiben, dann sollte 85 rauskommen.


Code:
FUNCTION B_IEEE32_TO_REAL : REAL
VAR_INPUT
 IN : ARRAY[0..3] OF BYTE;
END_VAR
VAR
      PTREAL:POINTER TO REAL;
END_VAR
 
 
 
PTREAL:=ADR(IN);
B_IEEE32_TO_REAL := PTREAL^;

mfG Jan
 
Hallo,
dieses Bild zeigts noch mal...

Ist dann wahrscheinlich ein Big-Endian/Little Endian Problem, d.h.
Byte.0 mit Byte.3 tauschen
Byte.1 mit Byte.2 tauschen

Real in bytes.jpg

bg
bb
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
@Mr. Spok das funktioniert sehr gut vielen Dank :p
aber was ist B_IEEE32_TO_Real für ein Befehl ? :confused: der taucht noch nicht mal bei der Beckhoff Hilfe auf kommt der aus der C abteilung.

Geht das auch umgekehrt REAL_TO_B_IEEE32 ich muss nämlich auch Real werte zur Siemens schreiben
 
Ieee32

Hallo enter, das ist eine selbst geschriebene Funktion, den Quellcode hast du ja. Das ganze geht natürlich auch umgekehrt. Im Anhang mal ein Bild wie eine Real-Zahl Bit für Bit ab gespeichert wird. Mit dem Pointer in der Funktion änderst du praktisch nur die "Sichtweise" auf die Bits, sodass diese als Real-Zahl interpretiert werden.

Hier die Sache andersherum:
Code:
FUNCTION REAL_TO_B_IEEE32 : ARRAY [0..3] OF BYTE
VAR_INPUT
 IN:REAL;
END_VAR
VAR
 PTARRAY:POINTER TO ARRAY [0..3] OF BYTE;
END_VAR
 
 
PTARRAY:=ADR(IN);
REAL_TO_B_IEEE32:=PTARRAY^;

mfG Jan
 

Anhänge

  • IEEE-754-single.png
    IEEE-754-single.png
    14,2 KB · Aufrufe: 133
Hi Jan,
(das ist eine selbst geschriebene Funktion) jetzt wo du es schreibst ist es wir klar geworden :p

Vielen Dank !!
 
Zurück
Oben