Strukturierter Text, Strukturierung eines DWORD´s

tx43c

Level-2
Beiträge
6
Reaktionspunkte
0
Hallo zusammen,

Ich habe das Problem auf meiner B&R Steuerung (Automations Studio 4.2), dass ich 4 Variablen in UDINT Format habe und diese gerne nacheinander in 1 DWORD schreiben möchte.
Wie kann ich also die Variablen nacheinander in das einzelne Dword einfügen?

UDINT_4 UDINT_3 UDINT_2 UDINT_1

DWord: (31 - 24) (23 - 16) (15 - 8 ) (7 - 0)


Danke schon mal im Vorraus ;)
 
Hallo tx43c,
ich kenne die B&R Steuerungen leider nicht, aber wenn B&R nicht andere Bezeichnungen für Ihre Variablen nimmt geht das was Du vorhast gar nicht. Ein UDINT ist ein unsigned double int und 32 Bit lang (UInt = 16 Bit, doppeltes UInt = 2 * 16 Bit = 32 Bit) , ein DWORD ist ein double word und ebenfalls 32 Bit lang (Word = 16 Bit, doppeltes Word = 2 * 16 Bit = 32 Bit). Du bekommst also immer nur ein UDINT in ein DWORD und nicht mehrere.
 
Um 4 USINT in ein DWORD zu packen gibt es sooo viele schöne und unschöne Möglichkeiten, z.B.:
Code:
myDWord := SHL(SHL(SHL(USINT_TO_DWORD(myUSInt_4), 8) OR USINT_TO_DWORD(myUSInt_3), 8)
               OR USINT_TO_DWORD(myUSInt_2), 8) OR USINT_TO_DWORD(myUSInt_1);

//oder (Empfehlung)
[COLOR="#0000FF"]myDWord :=    SHL(USINT_TO_DWORD(myUSInt_4), 24)
           OR SHL(USINT_TO_DWORD(myUSInt_3), 16)
           OR SHL(USINT_TO_DWORD(myUSInt_2), 8)
           OR USINT_TO_DWORD(myUSInt_1);[/COLOR]

//oder
myDWord := UDINT_TO_DWORD( USINT_TO_UDINT(myUSInt_4) * 256*256*256
                         + USINT_TO_UDINT(myUSInt_3) * 256*256
                         + USINT_TO_UDINT(myUSInt_2) * 256
                         + USINT_TO_UDINT(myUSInt_1) );

Kann die B&R auch "UNION", oder "AT" für normale Variablen? Dann könntest Du 1 DWORD und 4 USINT auf dem selben Speicherplatz überlagern, die 4 USINT hineinkopieren und als DWORD herauskopieren. Dabei musst Du allerdings wissen/beachten, wie herum die Bytes des DWord im Speicher liegen (Endianness).
Code:
VAR
  uVar : UNION
    nVar : DWORD;
    stVar : STRUCT
      Byte1 : USINT;
      Byte2 : USINT;
      Byte3 : USINT;
      Byte4 : USINT;
    END_STRUCT
  END_UNION
END_VAR

uVar.stVar.Byte1 := myUSInt_1;
uVar.stVar.Byte2 := myUSInt_2;
uVar.stVar.Byte3 := myUSInt_3;
uVar.stVar.Byte4 := myUSInt_4;
myDWord := uVar.nVar;
Das Kopieren über Speicher kann man vielleicht auch mit Pointern machen (falls B&R sowas unterstützt) oder als "Overkill" notfalls MEMCPY verwenden (falls es MEMCPY bei B&R gibt).

Harald
 
Zurück
Oben