Zerlegen eines DWORD in BYTE und wieder zusammensetzen

Zuviel Werbung?
-> Hier kostenlos registrieren
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*

Im einfachsten Fall, indem du mit einem MW arbeitest. Da kannst du direkt auf die Bits und das MW zugreifen. Ansonsten in einem FC/FB über indirekte Adressierung. Entweder du legst ein Temp-DWord an und greifst über indir. Adressierung auf die einzelnen Bits des DWord zu oder umgekehrt, di legst 16 Temp-Bool hintereinander an (Wordgrenzen beachten!) und greifst dann über indir. Adressierung (siehe FAQ) auf das Word zu. Welche Variante der indir. Adressierung du nutzt hängt dabei nur davon ab, wie oft du die Bits oder das Word benötigst, welches öfter verwendet wird kommt direkt in den Temp-Bereich.

Eine weitere Möglichkeit ist SCL und der AT-Operator. Da kann man einer Variable unterschiedliche Sichten zuordnen, also auf ein Word, dessen Bytes oder auch Bits schauen.
 
Guten Morgen!
Mal eine Frage: wozu soll dieses Zerlegen eines REAL in 4 BYTE gut sein?

mögliche anwendung: bytweise versenden ... über nen cp341 z.b.

Genau dafür!


moin :)
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

Ich habe fertige und getestete Bausteine die dir aus 2 BYTES ein WORD machen und umgedreht. Allerdings kann ich Dir den Code dafür erst heute abend posten wenn dir das auch hilft...

Ansonsten kannst Du jedes einzelne BIT in einem WORD welches z.B. im DB1 auf Adresse 0 steht über DB1.DBX0.1 bis DB1.DBX1.0 direkt adressieren. Das muss dann aber immer manuell für jedes WORD programmiert werden.
 
Zuletzt bearbeitet:
16 Bit in ein Word? War die Frage tatsächlich ernst gemeint?
Dann vielleicht so:
Code:
L MW222      // enthält M223.0 (Bit0) ... M222.7 (Bit15)
T #Wordwert
Für solche Fälle eignet sich ein Schmiermerkerbereich. (Temp geht auch, aber nur in SCL durchgehend symbolisch)
Code:
TmpUnion_Bit24	M     220.0	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit25	M     220.1	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit26	M     220.2	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit27	M     220.3	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit28	M     220.4	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit29	M     220.5	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit30	M     220.6	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit31	M     220.7	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit16	M     221.0	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit17	M     221.1	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit18	M     221.2	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit19	M     221.3	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit20	M     221.4	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit21	M     221.5	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit22	M     221.6	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit23	M     221.7	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit8	M     222.0	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit9	M     222.1	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit10	M     222.2	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit11	M     222.3	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit12	M     222.4	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit13	M     222.5	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit14	M     222.6	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit15	M     222.7	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit0	M     223.0	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit1	M     223.1	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit2	M     223.2	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit3	M     223.3	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit4	M     223.4	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit5	M     223.5	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit6	M     223.6	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_Bit7	M     223.7	BOOL	temporäres DWord für Zugriff auf .0 ... .31
TmpUnion_HH_B	MB    220	BYTE	temporäres DWord Bits .24 ... .31
TmpUnion_HL_B	MB    221	BYTE	temporäres DWord Bits .16 ... .23
TmpUnion_LH_B	MB    222	BYTE	temporäres DWord Bits .8 ... .15
TmpUnion_LL_B	MB    223	BYTE	temporäres DWord Bits .0 ... .7
TmpUnion_H_W	MW    220	WORD	temporäres DWord Bits .16 ... .31
TmpUnion_L_W	MW    222	WORD	temporäres DWord Bits .0 ... .15
TmpUnion_DW	MD    220	DWORD	temporäres DWord Bits .0 ... .31

Harald
 
@ralle ja immoment mach ich das direkt über eine db word direkt auf die einzelnen bits möchte des aber gerne indirekt machen in einem fb um dann noch einen timer dazuzubauen ... (für fehlermeldungen von zylindern) mach des ziemlich simpel ein die einzelnen bit´s sind fehler und werden dann word weiße verglichen erst wenn das wort dann unverändert über längere zeit bleibt wird das word an´s panel gesendet.

und das mit das word auf ne temp legen sagt mir sogar grad was muss mal schauen :)

auf den code von atlas bin ich trozdem gespannt :)
 
// DWORD -> BYTE

L DW
SLD 24
SRD 24
T Byte_1

L DW
SLD 16
SRD 24
T Byte_2

L DW
SLD 8
SRD 24
T Byte_3

L DW
SRD 24
T Byte_4

// BYTE -> DWORD

L Byte_4
SLD 24
T DW

L Byte_3
SLD 16
UD DW
T DW

L Byte_2
SLD 8
UD DW
T DW

L Byte_1
UD DW
T DW
 
@Gerri:
was soll das sein ?
Erstmal : nicht "L DW" sondern "L DBD"
Und dann : beim Zusammensetzen nicht "UD" sondern "OD"

Gruß
Larry
 
du schiebst die bytes nach links, dadurch werden die bits der bytes die du nicht benötigst null.
Anschliessend schiebst du das byte in die andere Richtung und schreibst den Wert in das benötigte byte

zb. Byte 3 ermitteln:

1111_1111_1111_1111_1111_1111_1111_1111
SLD 8

-> 1111_1111_1111_1111_1111_1111_0000_0000
SRD 24

-> 0000_0000_0000_0000_0000_0000_1111_1111

das Byte 3 ist nun selektiert.

in der anderen Richtung schiebt man das byte and die gewünschte stelle des Doppelworts und "fügt es mit" OD "hinzu"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FB PackBits

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*
Hier mal ein Baustein, der genau das macht, sogar ohne Schmiermerker.
Funktioniert allerdings nicht als FC, sondern nur als FB und benötigt dadurch noch einen IDB.
Code:
FUNCTION_BLOCK "PackBits"
TITLE =Dieser FB packt 16 Bits in ein Word
//#Bit_0 muß der erste IN-Parameter sein, #Bit_1 .. #Bit_15 müssen direkt folgen!
//Der Programmcode funktioniert nur als FB, nicht als FC!
AUTHOR : PN_DP
VERSION : 0.1

VAR_INPUT
  Bit_0 : BOOL ;
  Bit_1 : BOOL ;
  Bit_2 : BOOL ;
  Bit_3 : BOOL ;
  Bit_4 : BOOL ;
  Bit_5 : BOOL ;
  Bit_6 : BOOL ;
  Bit_7 : BOOL ;
  Bit_8 : BOOL ;
  Bit_9 : BOOL ;
  Bit_10 : BOOL ;
  Bit_11 : BOOL ;
  Bit_12 : BOOL ;
  Bit_13 : BOOL ;
  Bit_14 : BOOL ;
  Bit_15 : BOOL ;
END_VAR
VAR_OUTPUT
  WordVal : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =Eingangsbits in Ausgangsword übertragen

      L     P##Bit_0;      //Adresse des ersten IN-Parameters
      LAR1  ;
      L     W [AR1,P#0.0]; //alle 16 Bool-IN lesen
      TAW   ;              //-> Big Endian
      T     #WordVal;      //auf Ausgang schreiben

END_FUNCTION_BLOCK
Doch für diese simple Sache extra einen Baustein einsetzen?
Da ist ja alleine der Code für den Baustein-Aufruf ein vielfaches der eigentlichen Funktion.
Doch OK, es ist natürlich besser lesbar und die Chancen für Tippfehler sind geringer.

Harald
 
was passiert wenn man einen Wert der grösser als ein byte ist auf ein byte transferiert? Bleiben die Bits die nicht verwendet werden (also vom nächst höheren byte) unberücsichtigt.
Ehrlich gesagt hab ich das noch nie durchdacht dass das so ist
 
was passiert wenn man einen Wert der grösser als ein byte ist auf ein byte transferiert? Bleiben die Bits die nicht verwendet werden (also vom nächst höheren byte) unberücsichtigt.
Ehrlich gesagt hab ich das noch nie durchdacht dass das so ist

Genau so ist es, wenn du ein DWord auf ein Byte schreibst, wird nur das niederwertigste Byte des DWord in das Byte geschrieben, für den Rest ist ja kein Platz, der fällt also in den Gulli. :ROFLMAO:
 
Zurück
Oben