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

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

Thema: Bit in Word setzen bzw rücksetzen

  1. #1
    Registriert seit
    11.09.2010
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo
    ich arbeite grade an meiner Facharbeit für meinen Techniker abschluss.
    Nun habe ich folgendes Problem.
    Ich habe mir Palettenfunktionen gebaut und in einem Datenword jedes Bit einem Pallettenplatz zugewiesen.
    Nun möchte ich die Bits einzeln setzen bzw rücksetzen.
    Ich habe einen Zähler der mir sagt das wievielte Bit gesetzt bzw zurück gesetzt werden muss.

    Hat jemand eine Idee wie ich das realisieren kann???

    mfg
    Wilhelm
    Zitieren Zitieren Bit in Word setzen bzw rücksetzen  

  2. #2
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    Code:
    FUNCTION FC 103 : VOID
    TITLE =
    //Diese Funktion steuert in abhängigkeit der Nummer (Nr),
    //ein Bit im Any-Pointer (Bitfeld).
    //Der Zustand der aktuellen Bit-Nummer wird im Status (Status) 
    //angezeigt.
    //- Zulässige Parameter für den Any-Pointer sind:
    //    BIT, BYTE, WORD u. DWORD
    //- Folgende Fehler (Fehler) werden ausgewertet: 
    //    Parametrierung, Nr größer Bitanzahl u. Nr kleiner 0
    //    Fehler wird im BIE-Bit signalisiert.
    //    Parametrierung Fehlerfrei BIE = TRUE
    //     "     "    "  Fehler     BIE = FALSE
    AUTHOR : dalbi
    FAMILY : SIGNAL
    NAME : NRBIT
    VERSION : 1.1
    
    
    VAR_IN_OUT
      NR : INT ;    //Nummer
      ZEIGER : ANY ;    //Zeiger Bitfeld
    END_VAR
    VAR_TEMP
      tLaenge : INT ;    //Länge in Bits
      tZaehler : INT ;    //Schleifenzähler
      tDBNr : WORD ;    //Datenbausteinnummer
      tTyp : BYTE ;    //Datentyp
      SaveAR1 : DINT ;    //Speicher Adressregister 1
      SaveAR2 : DINT ;    //Speicher Adressregister 2
    END_VAR
    BEGIN
    NETWORK
    TITLE =Adressregister sichern
    
          TAR1  #SaveAR1; 
          TAR2  #SaveAR2; 
    
    NETWORK
    TITLE =Any-Pointer zerlegen
    
          L     P##ZEIGER; // AR1 auf ANY
          LAR1  ; 
    
          L     W [AR1,P#4.0]; // DB-Nummer
          T     #tDBNr; 
    
          L     W [AR1,P#2.0]; // Wiederholfaktor für Typ
          T     #tLaenge; 
    
          L     B [AR1,P#1.0]; // Datentyp
          L     B#16#1; // BIT
          ==I   ; 
          L     0; 
          SPB   set1; 
    
          L     B [AR1,P#1.0]; // Datentyp
          L     B#16#2; // BYTE
          ==I   ; 
          L     1; 
          SPB   set1; 
    
          L     B [AR1,P#1.0]; // Datentyp
          L     B#16#4; // WORD
          ==I   ; 
          L     2; 
          SPB   set1; 
    
          L     B [AR1,P#1.0]; // Datentyp
          L     B#16#6; // DWORD
          ==I   ; 
          L     3; 
          SPB   set1; 
          BEA   ; // Bausteinende wenn Typ nicht past
    set1: T     #tTyp; 
    
    NETWORK
    TITLE =Bitbereich löschen
    
          L     D [AR1,P#6.0]; // AR1 auf Anfangsadresse
          LAR1  ; 
    
          AUF   DB [#tDBNr]; // DB aufschlagen
    
          L     #tLaenge; 
    next: T     #tZaehler; 
    
          L     #tTyp; 
          SPL   nix; 
          SPA   BIT; // Sprung bei 0
          SPA   BYTE; // Sprung bei 1
          SPA   WORD; // Sprung bei 2
          SPA   DW; // Sprung bei 3
    nix:  L     0; 
          T     #tTyp; 
          BEA   ; 
    BIT:  SET   ; 
          R      [AR1,P#0.0]; 
          +AR1  P#0.1; // Weiter auf nächstes Bit
          SPA   cr; 
    BYTE: L     B#16#0; 
          T     B [AR1,P#0.0]; 
          +AR1  P#1.0; // Weiter auf nächstes Byte
          SPA   cr; 
    WORD: L     0; 
          T     W [AR1,P#0.0]; 
          +AR1  P#2.0; // Weiter auf nächstes Word
          SPA   cr; 
    DW:   L     L#0; 
          T     D [AR1,P#0.0]; 
          +AR1  P#4.0; // Weiter auf nächstes DW
    cr:   L     #tZaehler; 
          LOOP  next; 
    
          LAR1  #SaveAR1; // Adressregister 1 rückschreiben
          LAR2  #SaveAR2; // Adressregister 2 rückschreiben
    
    NETWORK
    TITLE =Any-Pointer zerlegen
    
          L     P##ZEIGER; // AR1 auf Bitfeld
          LAR1  ; 
    
          L     B [AR1,P#1.0]; // Datentyp
          L     B#16#1; // BIT
          ==I   ; 
          SPB   bit; 
    
          TAK   ; 
          L     B#16#2; // BYTE
          ==I   ; 
          SPB   byte; 
    
          TAK   ; 
          L     B#16#4; // WORD
          ==I   ; 
          SPB   word; 
    
          TAK   ; 
          L     B#16#6; // DWORD
          ==I   ; 
          SPB   dw; 
    
          SPA   err; // Fehler, wenn kein Typ
    
    bit:  L     1; // BIT
          SPA   set; 
    byte: L     8; // BYTE
          SPA   set; 
    word: L     16; // WORD
          SPA   set; 
    dw:   L     32; // DWORD
    set:  L     W [AR1,P#2.0]; // Wiederholfaktor für Typ
          *I    ; 
          T     #tLaenge; // Länge in Bit
    
          L     #NR; 
          L     1; 
          >=I   ; 
          SPB   m031; 
          T     #NR; 
    m031: L     #NR; 
          L     #tLaenge; // Wiederholfaktor für Typ
          <=I   ; 
          SPB   m032; 
          T     #NR; 
    m032: NOP   0; 
    
          L     W [AR1,P#4.0]; // DB-Nummer
          T     #tDBNr; 
    
          AUF   DB [#tDBNr]; // DB aufschlagen
    
          L     #NR; 
          L     P#0.1; 
          *D    ; 
          L     P#0.1; 
          -D    ; 
          L     D [AR1,P#6.0]; // AR1 auf Anfangsadresse
          +D    ; 
          LAR1  ; 
    
    NETWORK
    TITLE =Logik
    
          SET   ; 
          =      [AR1,P#0.0]; // steuern
    
    NETWORK
    TITLE =Auswertung BIE-Bit
    
          SET   ; // IO
          SPA   io; // BIE-Bit auf 1 setzen
    err:  SET   ; // Bei Fehler
          CLR   ; // BIE-Bit auf 0 setzen
    io:   SAVE  ; // BIE-Bit sichern
    
          LAR1  #SaveAR1; // Adressregister 1 rückschreiben
          LAR2  #SaveAR2; // Adressregister 2 rückschreiben
    
    END_FUNCTION
    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  3. #3
    geit ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.09.2010
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo
    ich hab mir den mal in S7 eingehackt......

    So ganz versteh ich das nicht.....
    Wie kann ich ein Word definieren? in dem ich Bits setzen bzw rücksetzen will....
    Und wie kann ich die Bits dann setzen bzw rücksetzen???

    mfg
    wilhelm

  4. #4
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    anbei noch ein kleines Beispiel.

    Gruss Daniel
    Angehängte Dateien Angehängte Dateien
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  5. #5
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Zitat Zitat von geit Beitrag anzeigen
    ...Und wie kann ich die Bits dann setzen bzw rücksetzen???
    Das entsprechende Bit wird durch die Nummer gesetzt.

    z.B. Nummer = 1 entspricht im Beispiel M2.0, Nummer = 2 wäre M2.1 und Nummer = 16 Bit M3.7 im MW2.

    Gruss Daniel
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Wilhelm möchte Bits einem Datenword setzen/rücksetzen:
    Zitat Zitat von geit Beitrag anzeigen
    Ich habe mir Palettenfunktionen gebaut und in einem Datenword jedes Bit einem Pallettenplatz zugewiesen.
    Nun möchte ich die Bits einzeln setzen bzw rücksetzen.
    Andere Variante:
    Der Simatic Manager enthält eine Funktion FC97 "DECO" - Vorgegebenes Bit im DWord setzen
    Bibliotheken > Standard Library > TI-S7 Converting Blocks > FC97 DECO
    Die Baustein-Hilfe ist allerdings teilweise falsch (mit der Beschreibung des FC96 vertauscht).

    Code:
    //Bitmuster mit Bit[Bitnummer]=1 erzeugen
          CALL  FC97
           IN     :=MW100                   //Bitnummer 0..31 (für Word: 0..15)
           RET_VAL:=#temp_dwBitmuster       //Bitmuster mit Bit[Bitnummer]=1
    
    //Beispiel Bit in DWord setzen
          L     #temp_dwBitmuster
          L     DB1.DBD0
          OD
          T     DB1.DBD0
    
    //Beispiel Bit in DWord rücksetzen
          L     #temp_dwBitmuster
          INVD
          L     DB1.DBD0
          UD
          T     DB1.DBD0
    
    //Beispiel Bit in Word setzen
          L     #temp_dwBitmuster
          L     DB1.DBW0
          OW
          T     DB1.DBW0
    
    //Beispiel Bit in Word rücksetzen
          L     #temp_dwBitmuster
          INVI
          L     DB1.DBW0
          UW
          T     DB1.DBW0
    Alternativ zum FC97 tuts auch diese Befehlsfolge:
    Code:
    //alternativ Bitmuster mit Bit[Bitnummer]=1 erzeugen
          L     MW100                       //Bitnummer 0..31 (für Word: 0..15)
          L     1
          SLD
          T     #temp_dwBitmuster           //Bitmuster mit Bit[Bitnummer]=1
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.186
    Danke
    923
    Erhielt 3.291 Danke für 2.660 Beiträge

    Standard

    Oder als Bausteine (FC..)
    Code:
    //Bit in einem Word setzen
    VAR_IN
      Nr : INT     //Bitnummer 0..15 - wird nicht geprüft!
    END_VAR
    VAR_IN_OUT
      Datenword : WORD
    END_VAR
    
          L     #Nr                         //Bitnummer 0..15
          L     1
          SLD
          L     #Datenword
          OW
          T     #Datenword
    Code:
    //Bit in einem Word rücksetzen
    VAR_IN
      Nr : INT     //Bitnummer 0..15 - wird nicht geprüft!
    END_VAR
    VAR_IN_OUT
      Datenword : WORD
    END_VAR
    
          L     #Nr                         //Bitnummer 0..15
          L     1
          SLD
          INVI
          L     #Datenword
          UW
          T     #Datenword
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #8
    Registriert seit
    13.04.2008
    Ort
    Großraum KA
    Beiträge
    963
    Danke
    52
    Erhielt 128 Danke für 112 Beiträge

    Standard

    Wenn zB. Das Datenwort 0 im DB 1 gemeint sei, dann
    besteht dieses Datenwort aus den "Datenbits" Db1.DBX0.0 bis DB1.DBX1.7

    Diese wiederum können einfach mit zB.

    M1.1
    = Db1.dbx0.6

    oder

    U m125.3
    S DB1.dbx1.4

    also wie zB. jeder Merker bearbeitet und auch natürlich abgefragt werden.

    u DB1.DBX 0.2
    = M11.7


    peter(R)

  9. #9
    geit ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.09.2010
    Beiträge
    18
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    moin
    @ peter das wird wohl meine Lösung sein.
    Schieben kommt nicht in Frage weil alle anderen Bits in dem Word an der alten stelle erhalten bleiben müssen.
    Das Word wird dazu genutzt die nächste frei Pallette ausfindig zu machen.
    Hier ein kurzer auszug aus der Erkennung.
    und wenn die Pallette dann belegt wurde wollte ich mit einer eleganten lösung das bit für z.B. #Pal_1 in dem Datenword setzen und bei entnahme rücksetzen.

    [PHP] U #Pal_1 // wenn Pallette 1 frei dann automatische anwahl
    SPB pa1 // wenn Pallette belegt dann springe zur nächsten
    L 1 // Lade Soll Palletten Nr
    T #erste_freie_Pal
    SPA end
    pa1: NOP 0
    U #Pal_2
    SPB pa2 // wenn Pallette 2 frei dann automatische anwahl
    L 2
    T #erste_freie_Pal
    SPA end
    pa2: NOP 0
    U #Pal_3
    SPB pa3
    L 3 // wenn Pallette 3 frei dann automatische anwahl
    T #erste_freie_Pal
    SPA end
    pa3: NOP 0
    [/PHP]
    Geändert von geit (24.10.2010 um 11:43 Uhr)

  10. #10
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi,

    Zitat Zitat von PN/DP Beitrag anzeigen
    Wilhelm möchte Bits einem Datenword setzen/rücksetzen: ...
    Oha wer lesen kann ist klar im Vorteil, aber es war ja auch schon spät.

    Code:
    FUNCTION FC 103 : VOID
    TITLE =
    //Diese Funktion steuert in abhängigkeit der Nummer (Nr)
    //ein Bit im Any-Pointer (Bitfeld).
    AUTHOR : dalbi
    VERSION : 1.0
    
    
    VAR_INPUT
      Steuern : BOOL ;    //Ein / Aus
      NR : INT ;    //Nummer
    END_VAR
    VAR_IN_OUT
      ZEIGER : ANY ;    //Zeiger Bitfeld
    END_VAR
    VAR_TEMP
      tSaveAR1 : DWORD ;    //Speicher Adressregister 1
      tSaveAR2 : DWORD ;    //Speicher Adressregister 2
      tDBNr : WORD ;    //Datenbausteinnummer
    END_VAR
    BEGIN
    NETWORK
    TITLE = 
    
          TAR1  #tSaveAR1; // Adressregister sichern
          TAR2  #tSaveAR2; 
    
          L     P##ZEIGER; // AR1 auf Bitfeld
          LAR1  ; 
    
          L     W [AR1,P#4.0]; // DB-Nummer
          T     #tDBNr; 
    
          AUF   DB [#tDBNr]; // DB aufschlagen
    
          L     #NR; 
          L     P#0.1; 
          *D    ; 
          L     P#0.1; 
          -D    ; 
          L     D [AR1,P#6.0]; // AR1 auf Anfangsadresse
          +D    ; 
          LAR1  ; 
    
          U     #Steuern; 
          =      [AR1,P#0.0]; // steuern
    
          LAR1  #tSaveAR1; // Adressregister 1 rückschreiben
          LAR2  #tSaveAR2; // Adressregister 2 rückschreiben
    
    END_FUNCTION
    Gruss Daniel
    Angehängte Dateien Angehängte Dateien
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

Ähnliche Themen

  1. Ausgang setzen und rücksetzen
    Von Andreas k im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 26.07.2010, 16:39
  2. WINCC V6.2 Bit setzen/rücksetzen
    Von HarbichC im Forum HMI
    Antworten: 19
    Letzter Beitrag: 03.05.2010, 10:12
  3. Schütz mit Setzen Rücksetzen
    Von mitchih im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 15.03.2010, 16:07
  4. WinCC 6.0 Bit setzen/rücksetzen
    Von zwerg77 im Forum HMI
    Antworten: 6
    Letzter Beitrag: 07.12.2008, 22:48
  5. Bit setzen/rücksetzen bei Tastendruck
    Von tantrum13 im Forum HMI
    Antworten: 0
    Letzter Beitrag: 15.12.2006, 07:54

Lesezeichen

Berechtigungen

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