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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: Bitfolge (Array) in Dezimalzahl wandeln

  1. #11
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    der Vorschlag von JSEngineering
    Zitat Zitat von JSEngineering Beitrag anzeigen
    Oder Du schreibst sie aus dem Array per Zuweisung in ein Byte, richtig herum geordnet, und verwendest dann das Byte...
    könnte in AWL so aussehen:

    U #BITFOLGE[0]
    = M 100.7
    U #BITFOLGE[1]
    = M 100.6
    :
    U #BITFOLGE[7]
    = M 100.0
    L MB100

  2. #12
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Leute,

    erstmal vielen Dank für die zahlreichen Tipps und Code snippets.
    @hucki:
    Zitat Zitat von hucki Beitrag anzeigen
    Ich kann mir nicht vorstellen, dass der Code so funktioniert, da Lade- und Transferbefehle nicht VKE-abhängig sind. Demzufolge werden immer alle Bitstellen addiert, egal ob das zugehörige Bit des Arrays 0 oder 1 ist.
    Damit hast Du recht
    War mir so nicht bewusst. Jetzt weiß ich aber wieso es nicht funktioniert hat

    Meine derzeitige Lösung ist ähnlich dem Vorschlag von JSEngineering/hub.

    Allerdings werde ich mir den Vorschlag von Larry und dem Pointer nochmal zu Gemüte führen, wenn ich den Baustein optimiere.

    Viele Grüße
    Timeout
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  3. #13
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Zitat Zitat von TimeOUT Beitrag anzeigen
    War mir so nicht bewusst. Jetzt weiß ich aber wieso es nicht funktioniert hat
    Wenn Du auch Deine eigene obige Variante weiter verfolgen möchtest, musst Du zwischen jeder Bitabfrage und dem folgenden Ladebefehl einen bedingten Sprung einfügen, der Dich bei ungesetztem Bit unter Auslassung der Addition zur nächsten Bitabfrage befördert:
    Code:
          L     0
          T     #code
    
          U     #BIT_Code[7]
          SPBN  Bit6
          L     1
          L     #code
          +I    
          T     #code
    
    Bit6: U     #BIT_Code[6]
          SPBN  Bit5
          L     2
    ...

  4. #14
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    tut mir leid, dass ich den Thread nochmal auspacke, aber ich habe noch eine Frage bzgl. der Pointer.

    Ich versuche mich gerade in die Thematik einzuarbeiten indem ich ein 6 Byte langes Array (BYTE_CODE) in ein 48 Bit langes Array (BIT_CODE) zu konvertieren versuche.

    Das ganze versuche ich mit der Hilfe von 2 Pointern zu realisieren.
    Ich erstelle zunächst ein Pointer auf die Anfangsadresse des BYTE-Arrays und speicher mir die Adresse weg. Anschließend erstelle ich den Pointer auf das BIT-Array und speicher mir ihn weg.

    Jetzt frage ich die einzelnen Bitwerte im BYTE-Array ab und setze, wenn TRUE das BIT im BIT-ARRAY (so zumindest der Plan)
    Anschließend inkrementiere ich beide Pointer.

    Hier mein Code:

    Code:
       
          L     0      T     #SCHLEIFENCOUNTER
          L     P##BYTE_CODE
          T     #PTR_BYTE
          L     P##BIT_CODE
          T     #PTR_BIT
    
    
    
    
    _nxt: SET   
          LAR1  #PTR_BYTE
    
    
          U     DIX [AR1,P#0.0]
          SPBN  nAkt
    
    
    // Setze Bits in BIT_CODE
    
    
          LAR1  #PTR_BIT                    // Setze Bit
          S     DIX [AR1,P#0.0]
    
    
    
    
    nAkt: SET                               // Inkrementiere Quell-Pointer
          LAR1  #PTR_BYTE
          +AR1  P#0.1
          T     #PTR_BYTE
    
    
          LAR1  #PTR_BIT                    // Rücksetze Bit
          R     DIX [AR1,P#0.0]
    
    
          LAR1  #PTR_BIT                    // Inkrementiere Ziel-Pointer
          +AR1  P#0.1
          T     #PTR_BIT
    
    
    
    
    
    
          L     #SCHLEIFENCOUNTER
          L     1
          +I    
          T     #SCHLEIFENCOUNTER
    
    
          L     #SCHLEIFENCOUNTER
          L     47
          ==I   
          SPBN  _nxt
    Leider funktioniert es wider erwartend nicht

    Was vergesse/übersehe ich?
    Hat es etwas mit dem Schieben um 3 Bit zu tun?

    Viele Grüße
    TimeOut
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo,
    Der Fehler ist, dass du nicht deinen Pointers er erhöhst ...
    Versuch es mal so :
    l #ptr_Bit
    L p#0.1
    +d
    T ptr_bit
    Gruß
    Larry

    Nachsatz : das gilt natürlich für beide Pointer ...

  6. #16
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hey,

    ich dachte das Erhöhen erfolgt durch:

    Code:
    LAR1  #PTR_BYTE
    +AR1  P#0.1
    T     #PTR_BYTE
    ??

    Aber wenn ich es, wie in deinem Vorschlag erwähnt, probiere funktioniert es leider trotzdem nicht.
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  7. #17
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.190
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Für welche CPU soll Dein Code sein?
    Wo liegen Deine Arrays BYTE_CODE und BIT_CODE? Wie sind sie deklariert?
    Programmierst Du einen FC oder einen FB? Beim indirekten Zugriff auf eigene Multiinstanz-Adressen in FB muß der Multiinstanz-Offset aus AR2 beachtet werden.
    Wie wird der DI-DB geöffnet - ist das der Instanz-DB des FB mit Deinem Code?
    Willst Du wirklich nur das Zielbit Setzen wenn das Quellbit gesetzt ist oder willst Du nicht eigentlich den Wert des Quellbits in das Zielbit kopieren, egal ob es 1 oder 0 ist? Für's Kopieren gibt es die = Operation.

    Tipp: Statt umständlicher und fehlerträchtiger Pointer-Akrobatik kann man zum Kopieren der 6 Byte auch den SFC20 BLKMOV benutzen.
    Wenn man es unbedingt mit Einzel-Operationen machen will, dann ist es in FB "schöner", statt registerindirekter Adressierung (mit AR..) die speicherindirekte Adressierung mit Pointer in TEMP-DWORD (LD) zu benutzen. Da kann man beliebig viele Pointer benutzen und spart sich das dauernde Umladen des AR1-Registers und muß AR2 nicht anfassen.
    Beispiel:
    Code:
    AUF DB [#Quell_DB]  //(kann eventuell entfallen)
    U DBX [#PTR_BYTE]   //Quell-Bit lesen
    AUF DI [#Ziel_DB]   //(kann eventuell entfallen)
    = DIX [#PTR_BIT]    //in Ziel-Bit kopieren
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    @T E :
    Das Erhöhen des AR-Registers funktioniert so - vollkommen korrekt ... und wo wird das so erhöhte Register wieder in deine Pointer-Variable zurück geschrieben ...?

    Was passiert denn so ...
    Wird der FB in einem anderen Baustein integriert ?

    Gruß
    Larry

  9. #19
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi,

    also ich programmiere einen FB. Keine Multiinstanz. Die Daten liegen allesamt im Instanzdatenbaustein.
    Der FB wird auch nirgendwo integriert.

    Also das der SFC20 das so hinbekommt wusste ich nicht. Allerdings kann ich mit der Darstellung nicht gescheit weiter arbeiten.

    Bsp: BYTE_CODE[0] := B#16#0C

    daraus macht der SFC20:
    BIT_CODE[0] :=FALSE
    BIT_CODE[1] :=FALSE
    BIT_CODE[2] :=TRUE
    BIT_CODE[3] :=TRUE
    BIT_CODE[4] :=FALSE
    BIT_CODE[5] :=FALSE
    BIT_CODE[6] :=FALSE
    BIT_CODE[7] :=FALSE


    allerdings brauche ich diese darstellungsweise:

    BIT_CODE[0] :=FALSE
    BIT_CODE[1] :=FALSE
    BIT_CODE[2] :=FALSE
    BIT_CODE[3] :=FALSE
    BIT_CODE[4] :=TRUE
    BIT_CODE[5] :=TRUE
    BIT_CODE[6] :=FALSE
    BIT_CODE[7] :=FALSE

    Liegt einfach an der darauf folgenden Weiterverarbeitung der BIT-Werte.
    Deshalb wollte ich das ganze mit den Pointer so "hinbiegen".

    @Larry

    Wird das erhöhte Register nicht hier wieder in die Variable zurückgeschrieben?

    Code:
     
    LAR1  #PTR_BIT                    // Inkrementiere Ziel-Pointer      
    +AR1  P#0.1
     T     #PTR_BIT <-- Hier??
    Ich denke wenn ich den Wert 0x0C vorher um 4 nach links rotiere (sprich: die 4 niederwertigen mit den 4 höherwertigen Bits tauschen) und dann den SFC20 darauf anwende, dass mir der dann die richte Bitfolge generiert.
    Muss das später mal probieren.

    Gruß
    Timeout
    Geändert von TimeOUT (17.02.2015 um 11:08 Uhr)
    Software:
    STEP 7 5.5 + SP4 + HF6
    TIA Portal V13 SP1 Update 4
    TwinCAT V3.1
    Hardware:
    S7-400 CPU 414-3 PN/DP
    CPU 1516-3 PN/DP
    CX5020-0110

  10. #20
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @TO:
    Ja ... rotieren (4 ×) wäre das Mittel der Wahl ...

    In deinem Code-Schnipsel verwendest du "T" -der würde den Akku 1 transferieren - nicht aber das AR1 - das könnte dann nur der Befehl TAR1 ...

    Gruß
    Larry

Ähnliche Themen

  1. Dezimalzahl stellenweise nach Array kopieren
    Von MrChipsy im Forum Programmierstrategien
    Antworten: 11
    Letzter Beitrag: 07.02.2015, 11:28
  2. Step 7 Array in string wandeln mit scl v5.5
    Von Gerri im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.11.2014, 12:12
  3. Integer in Char Array wandeln ?
    Von Power_Pete im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 28.01.2010, 15:26
  4. DB in Dezimalzahl
    Von tisler im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 15.10.2008, 15:20
  5. Array Bereich in SCL in String wandeln
    Von hubert im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 09.08.2006, 12:47

Lesezeichen

Berechtigungen

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