Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 47

Thema: Zerlegen eines DWORD in BYTE und wieder zusammensetzen

  1. #1
    Registriert seit
    28.06.2007
    Beiträge
    63
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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.
    Geändert von Atlas (28.09.2010 um 00:02 Uhr)
    Zitieren Zitieren Zerlegen eines DWORD in BYTE und wieder zusammensetzen  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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
    Geändert von vierlagig (27.09.2010 um 23:56 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Atlas ist offline Benutzer
    Themenstarter
    Registriert seit
    28.06.2007
    Beiträge
    63
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    möglicherweise hast du recht, aber was kommt denn überhaupt RAUS???
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. #5
    Atlas ist offline Benutzer
    Themenstarter
    Registriert seit
    28.06.2007
    Beiträge
    63
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg VAT.jpg (58,5 KB, 58x aufgerufen)

  6. #6
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    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?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  7. #7
    Atlas ist offline Benutzer
    Themenstarter
    Registriert seit
    28.06.2007
    Beiträge
    63
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.326 Danke für 2.688 Beiträge

    Standard

    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    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
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  10. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.
    Geändert von Ralle (28.09.2010 um 01:11 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. Quersumme eines Byte,WORD,DWORD
    Von Susi im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.04.2011, 16:19
  2. Auslesen eines Byte aus einem DWORD (SCL)
    Von tahren im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.06.2010, 12:01
  3. DWORD to Byte
    Von hank12 im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 05.05.2009, 07:44
  4. byte in word / dword umwandeln
    Von Gerri im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.07.2008, 14:31
  5. Dword zu Byte, oder ähnlich....
    Von Anonymous im Forum PC- und Netzwerktechnik
    Antworten: 2
    Letzter Beitrag: 11.11.2005, 10:56

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •