# DINT HI and LOW Bytes tauschen



## HK09 (24 Mai 2011)

Hallo,

ich habe das Problem das ich über einen DP/DP Koppler ein DINT auslesen soll, allerdings stehen bei mir ganz andere Werte in der DINT Variablen als auf der Siemens Steuerung. Was gehört habe ist das man HI und LOW Byte tauschen soll. Wie funktionert das beim DINT?


----------



## enter (24 Mai 2011)

Versuche mal das ist aber ohne Garantie auf Funktion

```
FUNCTION B_IEEE32_TO_Dint : DINT
VAR_INPUT
	BYTE_0:BYTE;
	BYTE_1:BYTE;
	BYTE_2:BYTE;
	BYTE_3:BYTE;
END_VAR
VAR
 IN : ARRAY[0..3] OF BYTE;
      PTDInt:POINTER TO DINT;

END_VAR
IN[0]:=BYTE_3;
IN[1]:=BYTE_2;
IN[2]:=BYTE_1;
IN[3]:=BYTE_0;
PTDInt:=ADR(IN);
B_IEEE32_TO_Dint := PTDInt^;
```


----------



## HK09 (24 Mai 2011)

Können sie mir kurz erklären wie die Funktion funktioniert?


----------



## enter (24 Mai 2011)

```
DintWert:=B_IEEE32_TO_Dint(Byte_Empfang[1]
Byte_Empfang[2],Byte_Empfang[3],Byte_Empfang[4]);
```

Byte_Empfang[1] von Siemens PLC
Byte_Empfang[2] von Siemens PLC
Byte_Empfang[3] von Siemens PLC
Byte_Empfang[4] von Siemens PLC

Wie gesagt ist nicht getestet


----------



## Bjornf (29 Mai 2011)

Ist dises  OK ?
Intelformat :=ROL(MotorolaFormat,16);


----------



## PN/DP (29 Mai 2011)

Bjornf schrieb:


> Ist dises  OK ?
> Intelformat :=ROL(MotorolaFormat,16);


Nein, so einfach ist es leider nicht.
Damit änderst Du die Byte-Reihenfolge von 1234 zu 3412, Ziel ist aber 4321.

Harald


----------



## Bjornf (29 Mai 2011)

Sche.... zu wenig nachgedacht ,es ist ja DINT habe halt statt 8 16 hingefuegt
(*VAR
IntelFormat INT :=16#01020304;
Teil1 :INT;
Teil2 :INT;
MotorolaFormat: DINT;
END_VAR
************************************ *)
Teil1:=ROL(DINT_TO_INT (IntelFormat),8  ;
Teil1:=SHL(Teil1,16);
Teil2:=ROL(DINT_TO_INT(SHR(IntelFormat ,16)),8  ;
MotorolaFormat:=Teil1+Teil2;

P.S Falls Beckhoff , In system manager gibts "Tausche Lobyte und Hibyte" bzw HiWord Loword wenn Daten auf Eingaenge kommen.


----------



## Bjornf (29 Mai 2011)

Die Smile's  hatmein text geaendert aber Ich habe nicht auf  ) D aufgepasst 
Teil1 , 2 und IntelFormat sollen DINTsein


----------



## PN/DP (29 Mai 2011)

*Bytereihenfolge tauschen durch rotieren*

Wenn das Tauschen der Bytereihenfolge mit Rotieren sein soll, dann würde ich das so machen:

```
OutVar := DWORD_TO_DINT((ROL(DINT_TO_DWORD(InVar),8) AND 16#00FF00FF)
                     OR (ROR(DINT_TO_DWORD(InVar),8) AND 16#FF00FF00));
```

Harald


----------

