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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Auf einzelne Bits einer IN_Variable (Typ Word) zugreifen?

  1. #1
    Registriert seit
    09.08.2004
    Beiträge
    101
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Habe hier eine Funktion in der ich als "In-Variable" ein Statuswort einlese,
    wie kann ich jetzt innerhalb der Funktion direkt auf die einzelnen Bits zugreifen?
    Also in etwa so:
    ( U #IN_Var.BX0.4
    S DB_Fehler.dbx0.4)
    ( 4. Bit des Statuswort bedeutet Fehler xjz )

    Rangieren auf ein Merkerwort will ich nicht, da der Baustein in mehreren Programmen verwendbar sein soll und ich da nicht Platz in der Symbolik reservieren will.

    Vielen Dank schonmal,

    mfg Thorsten
    Zitieren Zitieren Auf einzelne Bits einer IN_Variable (Typ Word) zugreifen?  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Erstelle dir eine Temp-Variable mit den Bits zum Zugreifen.

    Am Bausteinanfang Umrangieren der IN-Var in die Temp-Var

    Code:
    L #IN_VAR_1
    T LW 2             //in der Temp-Deklarations-Tabelle steht die Adresse (hier z.Bsp. LW 2)
    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

  3. #3
    thorsten ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2004
    Beiträge
    101
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    Ja so weit ist mir das schon klar, aber wie greife ich jetzt auf die einzelnen Bits zu?



    Also ich habe ne Invariable vom Typ WORD: #IN_VAR_1
    Eine Temp Variable Typ WORD: LW_2


    Jetzt möchte ich im Baustein prüfen ob zb. das 4. Bit der übergebenen Variablen 1 ist, wie mache ich das?

    mfg thorsten

  4. #4
    Anonymous Gast

    Standard

    1.Kliken auf Variable (rechte Taste) ...Eingenschaften
    2. Welche Lokaldaten sind zugeordnet ? z.B. 0.0
    3. Dann Bit 0 ....U L1.0
    Bit 1....U L1.1 usw.

  5. #5
    Registriert seit
    06.10.2003
    Beiträge
    3.412
    Danke
    451
    Erhielt 506 Danke für 408 Beiträge

    Standard

    Hallo Thorsten,

    wie Ralle schon geschrieben hat, kannst du auch Bit-Variablen des entsprechenden LW anlegen und auf diese symbolisch zugreifen. Du musst nur darauf achten dass sie bei Bausteinänderungen unverändert im Adressbereich bleiben. Am besten ganz nach oben legen (ab Adresse 0.0).

    Gruss, Onkel

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    noch etwas ausführlicher zu Onkels Ergänzung:

    Torsten schrieb:

    Eine Temp Variable Typ WORD: LW_2
    Nein, du legst Bitvariablen an, am besten für das gesamte Wort:

    Code:
    Bit_Var_0 BOOL 2.0
    Bit_Var_1 BOOL 2.1
    .
    .
    .
    Bit_Var_15 BOOL 3.7
    wenn du jetzt umrangiertst, kannst du symbolisch auf #Bit_Var_1 zugreifen.

    Die Adresse ergibt sich aus der Stellung deiner Temp-Variable und erscheint in der 3.Spalte unter Adresse.

    Teddys Variante geht genauso, aber dann hast du keinen symbolischen Zugriff, was die Lesbarkeit bei großen Bausteinen verschlechtert.

    Gleiches geht auch mit INOUT-Var, dann mußt du am Ende des Bausteins wieder zurückrangieren.
    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

  7. #7
    Registriert seit
    20.08.2003
    Beiträge
    275
    Danke
    38
    Erhielt 32 Danke für 31 Beiträge

    Standard

    Hallo,
    eine weitere Möglichkeit um einzelne Bits auf 1-Signal zu prüfen ist das Maskieren mit dem UW-Befehl.
    Auf das zu prüfende WORT wird eine Maske gelegt in welcher das Bit, welches auf 1 -Signal geprüft werden soll, 1-Signal hat.
    Danach wird der Befehl UND-Wort (UW) ausgeführt.
    Da eben 1 UND 1 = 1 ist, steht im AKKU nach dem UW-Befehl eine 0, wenn das geprüfte Bit nicht 1 ist und eine Zahl >0, wenn das Bit 1-Signal hat.
    Wenn das Ergebnis des UW-Befehls (Akku Inhalt) mit 0 verglichen wird, kann man den Zieloperand vom Vergleichsergebnis her beeinflussen.

    Hier ist ein Beispiel, welches auch in FUP dargestellt werden kann:

    NETWORK
    TITLE =Prüfen
    L #IN_Var; //Input-Variable
    L W#16#8; // Maske 00000000 00001000
    UW ; // Bit 4 auf 1 Prüfen
    T #ZE_1; // Ergebnis speichern
    NOP 0;
    NETWORK
    TITLE =Auswertung
    //Operand "Bit_4_TRUE" hat 1-Signal,wenn wenn Bit 4 "TRUE"-Signal hat
    L #ZE_1;
    L 0;
    >I ;
    = #BIT_4_TRUE;

    Gruss, Rayk

  8. #8
    Anonymous Gast

    Standard

    Oder man definiert eine struktur variable z.b.

    Code:
    VAR_INPUT
      DEINE_VARIABLE : INT ; 
    END_VAR
    
    VAR_OUTPUT
      OK: BOOL ;  //ein ergebnis
    END_VAR
    .
    .
    VAR_TEMP
      tsw : STRUCT  //bit struktur
       B00 : BOOL ;
       DBX01 : BOOL ;
       B02 : BOOL ; 
       B03 : BOOL ; 
       B04 : BOOL ; 
       B05 : BOOL ; 
       DBX06 : BOOL ; 
       B07 : BOOL ; 
       B10 : BOOL ; 
       B11 : BOOL ; 
       B12 : BOOL ; 
       B13 : BOOL ; 
       B14 : BOOL ;
       B15 : BOOL ; 
       B16 : BOOL ; 
       B17 : BOOL ; 
      END_STRUCT ;  
    END_VAR
    
    NETWORK
    TITLE =daten in die struktur variable schaufeln
    // tsw darf nicht geändert werden sonst muss
    // T     LW     0 angepasst werden
          L     #DEINE_VARIABLE
          T     LW     0; //absolute adressierung in L-Bereich
    
    NETWORK
    TITLE =fu bereit
          U     #tsw.DBX01; 
          U     #tsw.B16; 
          U     #tsw.B04; 
          =     #OK;
    da die struktur in der schnittstellendefinition mit drin ist kannst du den
    baustein ohne zusätzlich UDTs verwenden.

  9. #9
    Anonymous Gast

    Standard

    es fehlt noch ein TAW !

    Code:
    .
    .
     L  #DEIN_VARIABLE
     TAW
     T  LW 2
    .
    .
    Zitieren Zitieren Nachtrag  

  10. #10
    Registriert seit
    28.06.2003
    Ort
    Nähe Bonn
    Beiträge
    292
    Danke
    15
    Erhielt 92 Danke für 71 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Thorsten,

    dieses Lösungen mögen funktionieren, aber sie haben einen Nachteil, weil sie mit absoluten Adressen der Lokaldaten arbeiten. (Beim Einfügen von neuen Temp-VAriablen können sich die Adressen verschieben.)

    Wenn Du die Adresse der Lokaldaten auf einen Pointer legt und dann mit dem Pointer arbeitest, bist Du von evtuellen Erweitungen der Lokaldatentabelle unabhängig.

    Beispiel:

    L #Eingangswert (Byte, Wort, ...)
    T #Hilfsvariable

    LAR1 P##Hilfsvariable // Pointerwert und Bereichskennung laden (Adresse von Lokaldatenbyte/wort "Hilfsvariable")
    U L [AR1,P#0.0] // Abfrage Bit 0
    = .....
    U L [AR1,P#0.1] // Abfrage Bit 1
    = ....


    Du kannst auch das AR2 mit benutzen, wenn Du von 2 verschiedenen Eingangswörten Bitergebnisse benötigst.

    vill Jröß (viele Grüße)
    Peter

Ähnliche Themen

  1. SCL: Auf Bits eines Word zugreifen.
    Von Aksels im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 28.10.2011, 17:10
  2. Antworten: 19
    Letzter Beitrag: 30.06.2010, 23:15
  3. LinNoDave und einzelne Bits
    Von Lazarus™ im Forum Hochsprachen - OPC
    Antworten: 4
    Letzter Beitrag: 19.01.2009, 13:46
  4. Einzelne Bits ausmaskieren
    Von zwerg77 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 03.12.2007, 07:14
  5. WinCC 5.1 C-Script einzelne bits abfragen
    Von tarzanhb im Forum HMI
    Antworten: 2
    Letzter Beitrag: 24.10.2006, 10:00

Lesezeichen

Berechtigungen

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