# Byte werte in Real umrechen



## enter (24 Juni 2010)

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?
Danke


----------



## kaputt (24 Juni 2010)

I dont know Beckhoff, but usually it can be solved by swapping the bytes.  In S7 the instruction is "CAD".


----------



## MSB (25 Juni 2010)

kaputt schrieb:


> 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


----------



## Mr.Spok (25 Juni 2010)

*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.



```
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


----------



## bits'bytes (25 Juni 2010)

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




bg
bb


----------



## enter (25 Juni 2010)

Hallo,
@Mr. Spok das funktioniert sehr gut vielen Dank 
aber was ist  B_IEEE32_TO_Real für ein Befehl ?  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


----------



## Mr.Spok (25 Juni 2010)

*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:

```
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


----------



## enter (25 Juni 2010)

Hi Jan,
(das ist eine selbst geschriebene Funktion) jetzt wo du es schreibst ist es wir klar geworden  

Vielen Dank !!


----------

