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

Page 1 of 2 12 LastLast
Results 1 to 10 of 11

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

  1. #1
    Join Date
    09.08.2004
    Posts
    105
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default


    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
    Reply With Quote Reply With Quote Auf einzelne Bits einer IN_Variable (Typ Word) zugreifen?  

  2. #2
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,815
    Danke
    747
    Erhielt 3,129 Danke für 2,233 Beiträge

    Default

    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 is offline Erfahrener Benutzer
    Themenstarter
    Join Date
    09.08.2004
    Posts
    105
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default

    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

    Default

    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
    Join Date
    06.10.2003
    Posts
    4,512
    Danke
    626
    Erhielt 785 Danke für 614 Beiträge

    Default

    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
    Join Date
    27.05.2004
    Location
    Thüringen/Berlin
    Posts
    13,815
    Danke
    747
    Erhielt 3,129 Danke für 2,233 Beiträge

    Default

    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
    Join Date
    20.08.2003
    Posts
    297
    Danke
    41
    Erhielt 33 Danke für 32 Beiträge

    Default

    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

    Default

    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

    Default

    es fehlt noch ein TAW !

    Code:
    .
    .
     L  #DEIN_VARIABLE
     TAW
     T  LW 2
    .
    .
    Reply With Quote Reply With Quote Nachtrag  

  10. #10
    Join Date
    28.06.2003
    Location
    Nähe Bonn
    Posts
    372
    Danke
    27
    Erhielt 123 Danke für 97 Beiträge

    Default


    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

Similar Threads

  1. Sonstiges TcHMI TE200 Einzelne Bits einer UINT Variable
    By msauerpb in forum HMI
    Replies: 1
    Last Post: 05.07.2019, 12:56
  2. FB284 auf einzelne Bits des IDB zugreifen
    By zloyduh in forum Antriebstechnik
    Replies: 7
    Last Post: 24.02.2015, 12:25
  3. Eingangswort auf einzelne Bits aufteilen
    By Gerold in forum CODESYS und IEC61131
    Replies: 2
    Last Post: 20.07.2014, 21:11
  4. SCL: Auf Bits eines Word zugreifen.
    By Aksels in forum Simatic
    Replies: 13
    Last Post: 28.10.2011, 17:10
  5. Replies: 19
    Last Post: 30.06.2010, 23:15

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •