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

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

Thema: Bitfolge (Array) in Dezimalzahl wandeln

  1. #1
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Forum,

    ich habe ein Array [0..7] OF BOOL und möchte nun die enthaltene Bitfolge in eine Dezimalzahl wandeln.
    Dabei ist Bit 7 das LSB und 0 das MSB.

    Beispiel:
    BITFOLGE[0] := 0
    BITFOLGE[1] := 0
    BITFOLGE[2] := 0
    BITFOLGE[3] := 0
    BITFOLGE[4] := 1
    BITFOLGE[5] := 0
    BITFOLGE[6] := 0
    BITFOLGE[7] := 1

    --> Dezimalzahl = 9

    Gibt es da von Siemens aus eine Konvertierungsfunktion o.Ä.?
    Ich programmiere in AWL.

    Danke für die Tipps

    Gruß
    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
    Zitieren Zitieren Bitfolge (Array) in Dezimalzahl wandeln  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Etwas Fertiges kann ich mir nicht vorstellen, in SCL würde mir da etwas Schickes einfallen. In AWL sähe das dann nicht mehr so schick aus - du müßtest dir ja eine Schleife erstellen (oder Wert für Wert aufaddieren).

    Gruß
    Larry

  3. #3
    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 Larry,

    Im Moment mach ich es quasi ganz stur mit:

    Code:
     L     0
          T     #code
    
    
          U     #BIT_Code[7]
          L     1
          L     #code
          +I    
          T     #code
    
    
          U     #BIT_Code[6]
          L     2
          L     #code
          +I    
          T     #code
    
    
          U     #BIT_Code[5]
          L     4
          L     #code
          +I    
          T     #code
    
    
          U     #BIT_Code[4]
          L     8
          L     #code
          +I    
          T     #code
    Wie genau kann ich darum eine Schleife programmieren? SIMATIC lässt keine #Variable, welche ich hochzähle bzw. runter zählen lasse, als Index für BIT_Code[#Variable] zu.

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

  4. #4
    Registriert seit
    03.02.2015
    Ort
    Hatten
    Beiträge
    183
    Danke
    16
    Erhielt 32 Danke für 29 Beiträge

    Standard

    Du könntest die Bits schieben oder rotieren und dann immer das LSB auswerten für Deine Addition.
    Dein Array ist ja nichts Anderes als ein Byte, auf welches Du zugreifen kannst.
    Kannst Du denn nicht sofort "anders herum" einlesen (7=MSB/0=LSB)? Dann kannst Du direkt das Byte auslesen...
    Oder Du schreibst sie aus dem Array per Zuweisung in ein Byte, richtig herum geordnet, und verwendest dann das Byte...

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Das Problem bei dir ist, dass die Bit-Reihenfolge im Grunde falsch herum ist.

    Du bildest dir eine Hilfsvariable als Multiplikator und setzt die zunächst auf 1.
    Du bildest dir einen Pointer auf das niedrigste Bit im Array (Bitfolge[0]) und lädst diese Adresse. Wenn TRUE dann addierst du auf dein Ergebnis die Hilfsvariable.
    Nun erhöhst du den Pointer um 1 und die Hilfsvariable schiebst du um ein nach links (danach hat sie als Wert 2).
    Nun lädst du die neue Pointeradresse und wenn TRUE dann addierst du auf dein Ergebnis die Hilfsvariable.
    Usw.
    Kannst du das als Code umsetzen ?

    Gruß
    Larry

  6. #6
    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

    Wie bilde ich nochmal einen Pointer auf das niederwertigste Bit im Array (Bitfolge[7]) und lade dann die Adresse?

    Ich muss mir die Pointer FAQ nochmal anschauen.. das verstehe ich noch nicht so ganz

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

  7. #7
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Vll. so, ist aber ungeteste

    Code:
    VAR
    BITFOLGE : ARRAY[0..7] OF BOOL;
    BITFOLGE_WERT : INT;
    END_VAR
    
    VAR_TEMP
    tBYTE : BYTE;
    tBYTE_BITS AT tBYTE : ARRAY[0..7] OF BOOL;
    END_VAR
    
    tBYTE_BITS[0] := BITFOLGE[7]; //alternativ per Schleife zuweisen
    tBYTE_BITS[1] := BITFOLGE[6];
    tBYTE_BITS[2] := BITFOLGE[5];
    tBYTE_BITS[3] := BITFOLGE[4];
    tBYTE_BITS[4] := BITFOLGE[3];
    tBYTE_BITS[5] := BITFOLGE[2];
    tBYTE_BITS[6] := BITFOLGE[1];
    tBYTE_BITS[7] := BITFOLGE[0];
    
    BITFOLGE_WERT := BYTE_TO_INT(tBYTE);
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  8. #8
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.716
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von TimeOUT Beitrag anzeigen
    Im Moment mach ich es quasi ganz stur mit:

    Code:
     L     0
          T     #code
    
    
          U     #BIT_Code[7]
          L     1
          L     #code
          +I    
          T     #code
    
    
          U     #BIT_Code[6]
          L     2
    ...
    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.




    Zitat Zitat von Flux Beitrag anzeigen
    Vll. so, ist aber ungeteste

    Code:
    tBYTE_BITS[0] := BITFOLGE[7]; //alternativ per Schleife zuweisen
    tBYTE_BITS[1] := BITFOLGE[6];
    ...
    Hat nur einen Haken:
    Zitat Zitat von TimeOUT Beitrag anzeigen
    Ich programmiere in AWL.

  9. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    TimeOUT (12.02.2015)

  10. #9
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Hat nur einen Haken:
    Das kommt davon, wenn man gen Feierabend den thread überfliegt. .

  11. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von TimeOUT Beitrag anzeigen
    Wie bilde ich nochmal einen Pointer auf das niederwertigste Bit im Array (Bitfolge[7]) und lade dann die Adresse?

    Ich muss mir die Pointer FAQ nochmal anschauen.. das verstehe ich noch nicht so ganz
    Hallo,
    nicht das niederwertigste sondern das niedrigste - also von der Speicheradresse her - das wäre dann Bitfolge[0] ...

    Code:
    L 0
    T #meinOutWert
    L 128
    T #meinBitwert
    L p##Bitfolge
    LAR1
    
    Loop: U [AR1 , p#0.0]
             spbn nAkt
    
             L #meinOutWert
             L #meinBitwert
             +I
             T #meinOutWert
    
    nAkt: L #meinBitwert
             SRW 1   
             T #meinBitwert
    
             L p#0.1
             +AR1
    
             L #meinBitwert
             L 0
             <>I
             SPB Loop
    ... ungetestet ... könnte aber zum Ziel führen ...

    Gruß
    Larry

  12. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    TimeOUT (12.02.2015)

Ä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
  •