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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Wie kann man Hi-Byte Low-Byte spiegeln?

  1. #1
    Registriert seit
    22.01.2009
    Beiträge
    288
    Danke
    61
    Erhielt 32 Danke für 25 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,
    wie kann ich innerhalb eines Wortes die Bytes spiegeln, bzw. in einem Doppelwort die Worte?

    M0.0 = M1.7
    M0.1 = M1.6
    ...... = ......
    M0.7 = M1.0

    Mit rotieren habe ich es nicht hinbekommen.

    Vielen Dank!

    Klaus
    Zitieren Zitieren Wie kann man Hi-Byte Low-Byte spiegeln?  

  2. #2
    Registriert seit
    06.10.2004
    Beiträge
    278
    Danke
    17
    Erhielt 34 Danke für 30 Beiträge

    Standard

    Hallo

    TAW
    TAD

  3. Folgender Benutzer sagt Danke zu Taddy für den nützlichen Beitrag:

    Klärmolch (10.12.2010)

  4. #3
    Registriert seit
    26.01.2010
    Beiträge
    181
    Danke
    5
    Erhielt 30 Danke für 25 Beiträge

    Standard

    Zitat Zitat von Taddy Beitrag anzeigen
    Hallo

    TAW
    TAD
    Diese Befehle tauschen zwar die Bytes, spiegeln aber nicht die Bits
    Geändert von Dr.M (10.12.2010 um 16:14 Uhr)

  5. #4
    Registriert seit
    16.05.2007
    Ort
    im Stahlwerk...
    Beiträge
    1.178
    Danke
    120
    Erhielt 429 Danke für 236 Beiträge

    Standard

    Zitat Zitat von Klärmolch Beitrag anzeigen
    Hi,
    wie kann ich innerhalb eines Wortes die Bytes spiegeln, bzw. in einem Doppelwort die Worte?

    M0.0 = M1.7
    M0.1 = M1.6
    ...... = ......
    M0.7 = M1.0

    Mit rotieren habe ich es nicht hinbekommen.

    Vielen Dank!

    Klaus
    Im Prinzip kann man es ja auch so machen, wie Du es schon geschrieben hast! Wenn Du das Umwandeln der Bits mehrfach brauchst, dann schreib Dir nen kleinen FC mit einer IN-Variable (Wort oder Doppelwort) und einer OUT-Variable (Format entsprechend dem IN).
    Im FC geht das IN-Wort über dem Umweg einer Temp-Variable auf das OUT-Wort wie oben beschrieben. Den FC kann man dann mehrfach aufrufen, wie einen Rotierbefehl...
    Approx
    Nihil est in cpu, quod non fuerit in intellectu" - Nichts ist in der CPU, was nicht (zuvor) im Verstand war.

  6. #5
    Registriert seit
    18.11.2010
    Beiträge
    8
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    also wenn du das Wort bzw. Doppelwort bitweise haben möchtest würde ich das auch so machen. Das ist recht einfach und kann bibliothekfähig gemacht werden in einem FC.

    Solltest du das Wort bzw. Doppelwort im Int bzw. Dint Format haben wollen, ist es warscheinlich wesentlich aufwändiger, müsste aber prinzipiell auch gehen.

    Copy

  7. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.802
    Danke
    144
    Erhielt 1.711 Danke für 1.241 Beiträge

    Standard

    Mit den Bit-Befehlen der S7 wird das zwar schneller gehen, aber mit einer kleinen Schleife und schieben/rotieren könnte man das auch so machen:
    Code:
          L     0                           // mit 0 initialisieren
          T     #out
    
          L     16                          // 16 Bits
    loop: T     #i
    
          L     #out
          SLW   1                           // und nach links shiften
          T     #out
    
          L     #in
          UW    W#16#1                      // Bit ausmaskieren
          L     #out
          OW    
          T     #out                        // in out ein"verodern"
    
          L     #in                         // Eingang weiterschieben
          SRW   1
          T     #in
    
          L     #i
          LOOP  loop

  8. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Klärmolch (10.12.2010)

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.339
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    So sollte es gehen für 16-Bit-Word (nicht getestet):
    Code:
                    // A1|   Akku1 H-Word     Akku1 L-Word
    L    2          //Anzahl Schiebungen für alle SLW ohne Operand
    L    #In_Word   // . | ................ FEDCBA9876543210
    
    SLW  1          // F | ................ EDCBA9876543210.
    RRDA            // . | F............... .EDCBA9876543210
    SLW             // E | F............... DCBA9876543210..
    RRDA            // . | EF.............. .DCBA9876543210.
    SLW             // D | EF.............. CBA9876543210...
    RRDA            // . | DEF............. .CBA9876543210..
    SLW             // C | DEF............. BA9876543210....
    RRDA            // . | CDEF............ .BA9876543210...
    SLW             // B | CDEF............ A9876543210.....
    RRDA            // . | BCDEF........... .A9876543210....
    SLW             // A | BCDEF........... 9876543210......
    RRDA            // . | ABCDEF.......... .9876543210.....
    SLW             // 9 | ABCDEF.......... 876543210.......
    RRDA            // . | 9ABCDEF......... .876543210......
    SLW             // 8 | 9ABCDEF......... 76543210........
    RRDA            // . | 89ABCDEF........ .76543210.......
    
    SLW             // 7 | 89ABCDEF........ 6543210.........
    RRDA            // . | 789ABCDEF....... .6543210........
    SLW             // 6 | 789ABCDEF....... 543210..........
    RRDA            // . | 6789ABCDEF...... .543210.........
    SLW             // 5 | 6789ABCDEF...... 43210...........
    RRDA            // . | 56789ABCDEF..... .43210..........
    SLW             // 4 | 56789ABCDEF..... 3210............
    RRDA            // . | 456789ABCDEF.... .3210...........
    SLW             // 3 | 456789ABCDEF.... 210.............
    RRDA            // . | 3456789ABCDEF... .210............
    SLW             // 2 | 3456789ABCDEF... 10..............
    RRDA            // . | 23456789ABCDEF.. .10.............
    SLW             // 1 | 23456789ABCDEF.. 0...............
    RRDA            // . | 123456789ABCDEF. .0..............
    SLW             // 0 | 123456789ABCDEF. ................
    RRDA            // . | 0123456789ABCDEF ................
    
    SRD  16         // . | ................ 0123456789ABCDEF
    T    #Out_Word
    (alle SLW ohne Anzahl-Operand schieben 2 Bit - steht in Akku2)

    Für 32-Bit-DWORD einfach L-Word und H-Word getrennt spiegeln und dann vertauscht zusammensetzen.
    Vielleicht gibt es auch noch eine etwas kürzere Variante mit 4x Byte spiegeln.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren zwei Schritt vor und ein zurück ...  

  10. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    Klärmolch (10.12.2010)

  11. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.339
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Wie kann man in einem Byte/Word/Doppelword die Reihenfolge der Bits umdrehen/spiegeln?
    (aus der Bitfolge 76543210 soll die Bitfolge 01234567 werden)
    Zunächst die Bit-Reihenfolge in den 4 Teil-Bytes spiegeln und bei Word/Doppelword danach
    die in sich gespiegelten Bytes in die gespiegelte Reihenfolge bringen.
    Die blauen Operationen für Byte/Word/Doppelword anpassen.
    ( TAK = Tausche Akku1 mit Akku2 / . = dieses Bit ist 0 )

    Doppelword spiegeln:
    Code:
                           // H-H-Byte H-L-Byte L-H-Byte L-L-Byte
                           // 31----24 23----16 15-----8 7------0
    L    #In_DWord         // 76543210 76543210 76543210 76543210
    
    PUSH                   // #In_DWord von Akku1 in Akku2 merken
    UD   DW#16#F0F0F0F0    // 7654.... 7654.... 7654.... 7654....
    SRD  4                 // ....7654 ....7654 ....7654 ....7654
    TAK                    // 76543210 76543210 76543210 76543210
    UD   DW#16#0F0F0F0F    // ....3210 ....3210 ....3210 ....3210
    SLD  4                 // 3210.... 3210.... 3210.... 3210....
    OD                     // 32107654 32107654 32107654 32107654
    
    PUSH                   // Zwischenergebnis Akku1 in Akku2 merken
    UD   DW#16#CCCCCCCC    // 32..76.. 32..76.. 32..76.. 32..76..
    SRD  2                 // ..32..76 ..32..76 ..32..76 ..32..76
    TAK                    // 32107654 32107654 32107654 32107654
    UD   DW#16#33333333    // ..10..54 ..10..54 ..10..54 ..10..54
    SLD  2                 // 10..54.. 10..54.. 10..54.. 10..54..
    OD                     // 10325476 10325476 10325476 10325476
    
    PUSH                   // Zwischenergebnis Akku1 in Akku2 merken
    UD   DW#16#AAAAAAAA    // 1.3.5.7. 1.3.5.7. 1.3.5.7. 1.3.5.7.
    SRD  1                 // .1.3.5.7 .1.3.5.7 .1.3.5.7 .1.3.5.7
    TAK                    // 10325476 10325476 10325476 10325476
    UD   DW#16#55555555    // .0.2.4.6 .0.2.4.6 .0.2.4.6 .0.2.4.6
    SLD  1                 // 0.2.4.6. 0.2.4.6. 0.2.4.6. 0.2.4.6.
    OD                     // 01234567 01234567 01234567 01234567
    // hier sind jetzt alle 4 Bytes in sich gespiegelt
    
    TAD                    // 0------7 8-----15 16----23 24----31
    T    #Out_DWord        // gespiegeltes DWord ausgeben
    Word spiegeln:
    Code:
    // ...   Code wie oben bis:
    // hier sind jetzt alle 4 Bytes in sich gespiegelt
    
    TAW                    // 24----31 16----23 0------7 8-----15
    T    #Out_Word         // gespiegeltes L-Word ausgeben
    Byte spiegeln:
    Code:
    // ...   Code wie oben bis:
    // hier sind jetzt alle 4 Bytes in sich gespiegelt
    
    T    #Out_Byte         // gespiegeltes L-L-Byte ausgeben
    Harald
    Geändert von PN/DP (10.12.2010 um 22:25 Uhr) Grund: Erklärung+Kommentare+Word+Byte zugefügt
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren In einem Byte/Word/Doppelword die Reihenfolge der Bits umdrehen/spiegeln (S7)  

  12. Folgende 2 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    borromeus (10.12.2010),Klärmolch (10.12.2010)

  13. #9
    Klärmolch ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.01.2009
    Beiträge
    288
    Danke
    61
    Erhielt 32 Danke für 25 Beiträge

    Standard

    Hallo,
    ich dachte es gibt einen einzigen direkten Befehl der das kann.
    Nun ist mir einiges klarer.
    Ich werde die von Euch angeführten Beispiele mal ausprobieren.

    @Taddy
    Das kann ich auch gebrauchen, S7 <--> alte Kuhnke

    Vielen Dank an Euch.

    Gruß
    Klaus
    Geändert von Klärmolch (10.12.2010 um 20:59 Uhr) Grund: Ergänzung

  14. #10
    Registriert seit
    02.10.2010
    Beiträge
    453
    Danke
    62
    Erhielt 87 Danke für 69 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Klärmolch Beitrag anzeigen
    Hallo,
    ich dachte es gibt einen einzigen direkten Befehl der das kann.
    Warum definierst Du dann Deine Frage nicht so?

Ähnliche Themen

  1. Umwandeln von INT nach Byte u Byte + n
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.04.2009, 10:07
  2. bit and byte
    Von PG710 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 30.12.2008, 21:57
  3. Antworten: 5
    Letzter Beitrag: 15.07.2008, 16:38
  4. Antworten: 4
    Letzter Beitrag: 08.07.2008, 08:52
  5. HI-Byte und LOW-Byte
    Von Danielegger im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 27.08.2004, 00:41

Lesezeichen

Berechtigungen

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