Zerlegen eines DWORD in BYTE und wieder zusammensetzen

Atlas

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich scheitere gerade daran ein 32Bit DWORD in einzelne Bytes zu zerlegen und hinterher wieder zusammensetzen. Es soll am Ende im zusammengesetzten DWORD natürlich wieder das selbe stehen wie zu Beginn :)

Ich habe jeweile einen FC dafür...

FC3 zum zerlegen:

Variablen IN:
DW_In : DWORD

Variablen OUT:
B1 : BYTE
B2 : BYTE
B3 : BYTE
B4 : BYTE

Variablen Temp:
DW_RAM : DWORD

AWL Code:


Code:
// Zerlegen des DWORDS in einzelne BYTE
// DWORD: B1(11111111) B2(11111111) B3(11111111) B4(11111111)

// Byte 4 von 4
      L     #DW_In
      T     #B4

// Byte 3 von 4
      L     W#16#8
      L     #DW_In
      SRD   
      T     #DW_RAM

      L     #DW_RAM
      T     #B3

// Byte 2 von 4
      L     W#16#16
      L     #DW_In
      SRD   
      T     #DW_RAM

      L     #DW_RAM
      T     #B2

// Byte 1 von 4
      L     W#16#24
      L     #DW_In
      SRD   
      T     #DW_RAM

      L     #DW_RAM
      T     #B1
FC4 zum zusammensetzen:

Variablen IN:
B1 : BYTE
B2 : BYTE
B3 : BYTE
B4 : BYTE

Variablen INOUT:
DW_Out : DWORD

Variablen Temp:
DW_RAM : DWORD

AWL Code:


Code:
// Zusammensetzen eines DWORDS aus einzelne BYTE
// DWORD: B1(11111111) B2(11111111) B3(11111111) B4(11111111)

// Byte 4 von 4
      L     #B4
      T     #DW_Out

// Byte 3 von 4
      L     #B3
      T     #DW_RAM

      L     W#16#8
      L     #DW_RAM
      SLD   
      T     #DW_RAM

      L     #DW_RAM
      L     #DW_Out
      UD    
      T     #DW_Out

// Byte 2 von 4
      L     #B2
      T     #DW_RAM

      L     W#16#16
      L     #DW_RAM
      SLD   
      T     #DW_RAM

      L     #DW_RAM
      L     #DW_Out
      UD    
      T     #DW_Out

// Byte 1 von 4
      L     #B1
      T     #DW_RAM

      L     W#16#24
      L     #DW_RAM
      SLD   
      T     #DW_RAM

      L     #DW_RAM
      L     #DW_Out
      UD    
      T     #DW_RAM
Leider klappt das Ganze nicht so wie ich mir das vorstelle und es kommt am Ende leider nicht das selbe wieder raus...

Die Ganze Funktion würde mich übrigends auch für REAL interessieren.



PS: Mir ist bekannt, das "#DW_RAM" nicht notwendig ist. Ich tu mir damit aber irgendwie leichter.
 
Zuletzt bearbeitet:
statt mit
Code:
*
L           W#16#8
L           #DW_In
SRD   
T           #DW_RAM
versuche er es mit

Code:
*
L           #DW_In
L           W#16#8
SRD   
T           #DW_RAM
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, das scheint nicht das Problem zu sein. Habe es mal testweise getauscht. Dann kommt noch mehr falsch raus als vorher :)

Habe denn Schiebebefehl mal von KOP nach AWL wandeln lassen. Dann kommt dabei raus:
Code:
      L     W#16#16
      L     #DW_In
      SRD   
      T     #DW_RAM

Sollte also passen dass erst "L W#16#16" und dann "L #DW_In" kommt.
 
In der originalen Fassung aus meinem ersten Post sehen die Variablen in einer VAT wie folgt aus...

Als Eingangswert habe ich den maximal möglichen Wert (unsignet) eingegeben: 2.147.483.647
 

Anhänge

  • VAT.jpg
    VAT.jpg
    58,5 KB · Aufrufe: 60
Zuviel Werbung?
-> Hier kostenlos registrieren
ok, geb ich dir beim schieben halt nochmal recht, aber der FC scheint das ganze durch die interne adressierung nicht so abbilden zu wollen, wie du es dir es vorstellst und der code es verheißen würde ... schon mal mit indirekter adressierung versucht?
 
Nein, hab ich noch nicht. Liegt vermutlich daran, dass ich mit indirekter adresierung noch nie was gemacht habe und das mal so eben nicht auf die reihe bringe.
 
Moin,
müssen die paar (8) AWL-Zeilen zum Zerlegen unbedingt in KOP/FUP lesbar sein?

Die Schiebe-Befehle sind ja sehr interessant und sollten mal genau untersucht werden
(sprich: F1-Taste benutzen, die Befehlsbeschreibung und die Beispiele lesen und ausprobieren).

Wenn Du die Anzahl zu schiebender Bits nicht vorher in den Akku lädst, sondern direkt
am Schiebebefehl angibst, dann kann da schon mal nichts mehr schief gehen:
Code:
      L     #DW_In
      T     #B4
      SRD   8
      T     #B3
      SRD   8
      ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie PN/DP schon schrieb, allerdings noch etwas länger, da nur mal so umgemodelt, das es funzt:


Code:
// Zerlegen des DWORDS in einzelne BYTE
// DWORD: B1(11111111) B2(11111111) B3(11111111) B4(11111111)

// Byte 4 von 4
      L     #DW_In
      T     #DW_RAM
      T     #B4

// Byte 3 von 4
      L     W#16#8
      L     #DW_RAM
      SRD   
      T     #DW_RAM
      T     #B3

// Byte 2 von 4
      L     W#16#8
      L     #DW_RAM
      SRD   
      T     #DW_RAM
      T     #B2

// Byte 1 von 4
      L     W#16#8
      L     #DW_RAM
      SRD   
      T     #B1
 
Und auch der Code zum Zusammensetzen muß etwas geändert werden, nun gleich mit der kürzeren Form:


Code:
// Zusammensetzen eines DWORDS aus einzelne BYTE
// DWORD: B1(11111111) B2(11111111) B3(11111111) B4(11111111)

// Byte 4 von 4
      L     #B4

// Byte 3 von 4
      L     #B3
      SLD   8
      +D    

// Byte 2 von 4
      L     #B2
      SLD   16
      +D    

// Byte 1 von 4
      L     #B1
      SLD   24
      +D    
      T     #DW_Out

PS: Statt +D kann man auch OD einsetzen!
Du hattest UD genutzt, das geht natürlich nicht.
 
Zuletzt bearbeitet:
OK, weil Atlas anscheinend schon ins Bett gegangen ist, verrate ich schnell noch das Zusammensetzen:
Code:
      L     #B1
      SLD   8
      L     #B2
      OD
      SLD   8
      L     #B3
      OD
      ...
      L     #B4
      OD
      T     #DW_Out
Wichtig: ODER - nicht UND!
(@Ralle: +D funktioniert natürlich auch, ist aber für den Datentyp eigentlich nicht zulässig)

Um wenn es ganz effizient sein soll, dann kannst Du (Atlas) mal hier drüber nachdenken:
Code:
// Zerlegen
      L     #DW_In      // 1234
      T     #B4
      TAW               // 1243
      T     #B3
      TAD               // 3421
      T     #B1
      TAW               // 3412 
      T     #B2

// Zusammensetzen
      L     #B2         // 0002
      TAW               // 0020
      L     #B1
      OD                // 0021
      TAD               // 1200 
      L     #B3
      OD                // 1203
      TAW               // 1230
      L     #B4
      OD                // 1234
      T     #DW_Out

Gute Nacht
Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Um wenn es ganz effizient sein soll, dann kannst Du (Atlas) mal hier drüber nachdenken:
Code:
// Zerlegen
      L     #DW_In      // 1234
      T     #B4
      TAW               // 1243
      T     #B3
      TAD               // 3421
      T     #B1
      TAW               // 3412 
      T     #B2

// Zusammensetzen
      L     #B2         // 0002
      TAW               // 0020
      L     #B1
      OD                // 0021
      TAD               // 1200 
      L     #B3
      OD                // 1203
      TAW               // 1230
      L     #B4
      OD                // 1234
      T     #DW_Out

Gute Nacht
Harald

Das gefällt mir, wird aber sicher,wenn im Code genutzt, immer wieder mal zu Fragen von Kollegen führen. :ROFLMAO:

@PN/DP
Das mit dem +D stimmt, aber es ist spät :)
 
Zuletzt bearbeitet:
Um wenn es ganz effizient sein soll, dann kannst Du (Atlas) mal hier drüber nachdenken:
Code:
// Zerlegen
      L     #DW_In      // 1234
      T     #B4
      TAW               // 1243
      T     #B3
      TAD               // 3421
      T     #B1
      TAW               // 3412 
      T     #B2
 
// Zusammensetzen
      L     #B2         // 0002
      TAW               // 0020
      L     #B1
      OD                // 0021
      TAD               // 1200 
      L     #B3
      OD                // 1203
      TAW               // 1230
      L     #B4
      OD                // 1234
      T     #DW_Out

Gute Nacht
Harald
*ROFL*

Ist das genial,
ich habe das jetzt nicht probiert, aber ich glaube Dir dass es so funktioniert.

Ich würde mich zwar selber Ohrfeigen wenn ich das mal später ohne Kommentar bei mir sehen würde, aber wie gesagt "Klasse"
 
Nagut,
Moin Paule!

Was glaubst Du, warum ich für die paar Zeilen einen kurzen Kommentar dranstehen habe?
Ich werde älter und müsste in einem Jahr ohne Kommentar auch länger drüber nachdenken.
Bei meinen Programmen ist meistens die Erklärung viel länger als der Code. :cool:

und 4L:
meinst Du mit Scheiß etwa die indirekte Adressierung?!

Aber jetzt wirklich Gute Nacht!!!
Harald
 
Guten Morgen!

Danke für die Unterstützung!

Habe eben die Vorschläge von Ralle in die Steuerung geladen...

http://sps-forum.de/showpost.php?p=283395&postcount=9
http://sps-forum.de/showpost.php?p=283395&postcount=10

Das scheint zu funktionieren!


Der Vorschlag von PN/DP ist mir so früh am Morgen noch nicht verständlich aber er scheint auf die schnelle auch zu funktionieren.

Danke an alle!!


PS:
Mit REAL funkitioniert das ganze genauso. Super!

Code:
L REAL_Zahl
T #DW_In

// Zerlegen
// ...

// Zusammensetzen
// ...

L #DW_Out
T REAL_Zahl
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
PS:
Mit REAL funkitioniert das ganze genauso. Super!

Code:
L REAL_Zahl
T #DW_In

// Zerlegen
// ...

// Zusammensetzen
// ...

L #DW_Out
T REAL_Zahl
Guten Morgen!
Mal eine Frage: wozu soll dieses Zerlegen eines REAL in 4 BYTE gut sein?
(man kann natürlich jeden 32-Bit-Datentyp in 4 Byte zerlegen)
Die 4 Bytes haben dann einen völlig unauswertbaren Inhalt und eignen sich nur zum wieder Zusammensetzen.
Was willst Du damit erreichen? In Dezimalziffern zerlegen?

Harald
 
Guten Morgen!
Mal eine Frage: wozu soll dieses Zerlegen eines REAL in 4 BYTE gut sein?
(man kann natürlich jeden 32-Bit-Datentyp in 4 Byte zerlegen)
Die 4 Bytes haben dann einen völlig unauswertbaren Inhalt und eignen sich nur zum wieder Zusammensetzen.
Was willst Du damit erreichen? In Dezimalziffern zerlegen?

Harald

mögliche anwendung: bytweise versenden ... über nen cp341 z.b.
 
moin :)
wenn ihr grad so schön dabei seid *grins*

ich grübel seit lägerem ab und zu mal darüber 16 bit´s zu einem word zu machen... bisher is mir nichts gescheites dazu eingefallen :confused:

wie würde das denn gehn :) *ganz lieb schau*
 
Zurück
Oben