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

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

Thema: Verschiede DB-Bits nacheinader antriggern

  1. #1
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo!

    ich habe mehrere Datenbausteine bestehend aus einzelnen Bits (DBX)
    Jeder dieser Bits löst bei 1 eine Meldung am TP aus. Insgesamt sind es an 1200 meldungen, wobei je nach Anlage die Anzahl variert.

    Jetzt muss ich für ein Testsystem alle Bits in allen DB's nacheinander, alle 5 Sekunden, kurz mit einer 1 ansteuern und somit die entsprechende Störmeldung antriggern.

    Es ist leider so, dass die Meldungen in verschiedenen DB's liegen. Auch die Bitfolge ist nicht fortlaufend.

    Jetzt habe ich mir gedacht, man könnte 3 DB's erzeugen. In einem stehen die Nummer der DB's, in anderem die dazugehörige Byteadresse und in drittem die Bitadresse.

    Dann müsste man zum Beispiel den DB1.DBW1 laden, den DB2.DBW1 laden und DB3.DBW1 laden und anschliessend zum Pointer zusammensetzen und den Pointer dann eine 1 zuweisen.
    Dann müsste man die Zeit, z.B. 5 sek. abwarten und das ganze wiederholen, aber mit DBW2 u.s.w. bis Baustein durch ist.

    Jetzt mein Problem: kenn mich mit Pointern wenig bis gar nicht aus. Ich kann zwar den Pointer zusammensetzten, aber wie schaffe ich es den nächsten DBW mit Adressen zu laden?

    Vielleicht gibt es auch einfacheren Weg?

    Ich bin sehr dankbar für jegliche Art von Ideen und Vorschlägen.

    mfg

    Nico
    Zitieren Zitieren Verschiede DB-Bits nacheinader antriggern  

  2. #2
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Hallo Nico,

    hier hat Gebs mal die Lösung gepostet:
    http://www.sps-forum.de/showthread.p...357#post378357

    Jetzt musst du nur noch Byte und Bit aus deinem DB laden und die Datenwörter der DB's in einer Schleife abfragen.

    PS: Wer ist der arme Hund der 6000 Sekunden vor dem Panel sitzen und die Störmeldungen kontrollieren muss?
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  3. #3
    Avatar von Nico99
    Nico99 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard

    Hallo!

    Code von Gebs:
    Code:
    AUF DB [#DB_Nummer]
    L #Byte_Nummer
    SLD 3
    L #Bit_Nummer
    +D
    LAR1
     U Bedingung
    = DBX [AR1,P#0.0]


    Soweit habe ich es auch. ich stehe irgendwie auf dem Schlauch mit dem Zugriff auf die Datenvariablen mit den Adressen und der Schleife.
    Obwohl: eigentlich muss ich von aussen nur die Nummer der DB's vorgeben sowie Anzahl der Variablen.
    Dann die Werte der ersten Variablen laden und zwischenspeichern (temporär). Aus diesen Werten den Pointer bilden unf 1 setzen, anschliessend wieder auf 0, zeitlang warten und dann wieder die Variablen laden, wobei dort bei der Wordadresse ein versatz sein muss.

    Werde es diese Tage ausprobieren. Manchmal sieht man den Wald vor lauter Bäume nicht.

    Wer die meldungen kontrolliert, weiss ich noch nicht. Ich denke mal, das wenn TP im Fehlerindikator genauso viele Meldungen anzeigt, wie im DB stehen, wird es wohl passen [/QUOTE]

  4. #4
    Avatar von Nico99
    Nico99 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard

    Hallo!

    ich habe was gebastelt, vermutlich falsch, denn die CPU geht in STOP wegen Überschreitung der Zykluszeit. Hat jemand einen Rat?

    Code:
    FUNCTION FC 10 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      DBNummer_DB : BLOCK_DB ;    //DB-Nummer mit DB-Nummer-Variablen
      ByteNummer_DB : BLOCK_DB ;    //DB-Nummer mit Byte-Nummer-Variablen
      BitNummer_DB : BLOCK_DB ;    //DB-Nummer mit Bit-Nummer-Variablen
      Verz_Zeit : S5TIME ;    //Verzögerung zwischen den Meldungen
      Anzahl_Variablen : INT ;    //Anzahl der Triggervariablen
    END_VAR
    VAR_TEMP
      DB_Nummer : INT ;    
      Byte_Nummer : INT ;    
      Bit_Nummer : INT ;    
      temp_DBW : INT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Datenanfang vorbereiten
    
          L     #Anzahl_Variablen; 
          L     2; 
          +I    ; 
          T     #temp_DBW; 
    NETWORK
    TITLE =
    
    anf:  NOP   0; 
    
    NETWORK
    TITLE =Trigger-DB-Nummer holen
    
          AUF   #DBNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #DB_Nummer; 
    NETWORK
    TITLE =Trigger-Byte-Nummer holen
    
          AUF   #ByteNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #Byte_Nummer; 
    NETWORK
    TITLE =Trigger-Bit-Nummer holen
    
          AUF   #BitNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #Bit_Nummer; 
    NETWORK
    TITLE =Pointeradresse der Triggervariable zusammensetzen
    
          AUF   DB [#DB_Nummer]; 
          L     #Byte_Nummer; 
          SLD   3; 
          L     #Bit_Nummer; 
          +D    ; 
          LAR1  ; 
          UN    M      1.0; 
          =     DBX [AR1,P#0.0]; 
    
    
    NETWORK
    TITLE =Vergleichen auf letztes DBW
    
          L     #temp_DBW; 
          L     0; 
          <=I   ; 
          SPB   ende; 
          SPA   anf; 
    
    NETWORK
    TITLE =
    
    ende: NOP   0; 
    
    
    END_FUNCTION

  5. #5
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    673
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Hi, du musst die temp_dbw Variable auch runterzählen...
    "arbeite klug, nicht hart" - deutsches Sprichwort

  6. #6
    Avatar von Nico99
    Nico99 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard

    Habe ich korrigiert. jetzt geht zwar die CPU nicht in Stop, aber es wird nur der letzte Eintrag im DB auf TRUE gesetzt.

    Entweder funktioniert das runterzählen der #temp_DBW nicht oder der Pointer DBX [AR1,P#0.0] wird falsch zusammengesetzt. Kann man den eigentlich Online sehen?

    Code:
    FUNCTION FC 10 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      DBNummer_DB : BLOCK_DB ;    //DB-Nummer mit DB-Nummer-Variablen
      ByteNummer_DB : BLOCK_DB ;    //DB-Nummer mit Byte-Nummer-Variablen
      BitNummer_DB : BLOCK_DB ;    //DB-Nummer mit Bit-Nummer-Variablen
      Verz_Zeit : S5TIME ;    //Verzögerung zwischen den Meldungen
      Anzahl_Variablen : INT ;    //Anzahl der Triggervariablen
    END_VAR
    VAR_TEMP
      DB_Nummer : INT ;    
      Byte_Nummer : INT ;    
      Bit_Nummer : INT ;    
      temp_DBW : INT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Datenanfang vorbereiten
    
          L     #Anzahl_Variablen; 
          L     2; 
          +I    ; 
          T     #temp_DBW; 
    NETWORK
    TITLE =
    
    anf:  NOP   0; 
    
    NETWORK
    TITLE =
    
          L     #temp_DBW; 
          L     2; 
          -I    ; 
          T     #temp_DBW; 
    
    NETWORK
    TITLE =Trigger-DB-Nummer holen
    
          AUF   #DBNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #DB_Nummer; 
    NETWORK
    TITLE =Trigger-Byte-Nummer holen
    
          AUF   #ByteNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #Byte_Nummer; 
    NETWORK
    TITLE =Trigger-Bit-Nummer holen
    
          AUF   #BitNummer_DB; 
          L     #temp_DBW; 
          L     DBW [AR1,P#0.0]; 
          T     #Bit_Nummer; 
    NETWORK
    TITLE =Pointeradresse der Triggervariable zusammensetzen
    
          AUF   DB [#DB_Nummer]; 
          L     #Byte_Nummer; 
          SLD   3; 
          L     #Bit_Nummer; 
          +D    ; 
          LAR1  ; 
          UN    M      1.0; 
          S     DBX [AR1,P#0.0]; 
    
    
    NETWORK
    TITLE =
    
          L     #temp_DBW; 
          L     0; 
          ==I   ; 
          SPB   ende; 
          SPA   anf; 
    
    NETWORK
    TITLE =
    
    ende: NOP   0; 
    
    
    END_FUNCTION

  7. #7
    Avatar von Nico99
    Nico99 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard

    Hallo!

    Das Problem scheint in den NW 5 und 6 zu liegen. Denn ich will die #temp_DBW laden, dann denn DBW mit L DBW [AR1,P#0.0] zu laden, wobei im Pointer der Wert von #temp_DBW stehen soll.
    Und das tut es nicht. Muss dort noch etwas rein?

    Anhang 17057

  8. #8
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Probiere mal:
    Zitat Zitat von Nico99 Beitrag anzeigen
    Code:
    FUNCTION FC 10 : VOID
    TITLE =
    VERSION : 0.1
    
    
    VAR_INPUT
      DBNummer_DB : BLOCK_DB ;    //DB-Nummer mit DB-Nummer-Variablen
      ByteNummer_DB : BLOCK_DB ;    //DB-Nummer mit Byte-Nummer-Variablen
      BitNummer_DB : BLOCK_DB ;    //DB-Nummer mit Bit-Nummer-Variablen
      Verz_Zeit : S5TIME ;    //Verzögerung zwischen den Meldungen
      Anzahl_Variablen : INT ;    //Anzahl der Triggervariablen
    END_VAR
    VAR_TEMP
      DB_Nummer : INT ;    
      Byte_Nummer : INT ;    
      Bit_Nummer : INT ;    
      temp_DBW : INT ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Datenanfang vorbereiten
    
          L     #Anzahl_Variablen; 
          L     2; 
          +I    ; 
          T     #temp_DBW; 
    NETWORK
    TITLE =
    
    anf:  NOP   0; 
    
    NETWORK
    TITLE =Trigger-DB-Nummer holen
    
          AUF   #DBNummer_DB; 
          L     #temp_DBW; 
         LAR1
         L     DBW [AR1,P#0.0]; 
          T     #DB_Nummer; 
    NETWORK
    TITLE =Trigger-Byte-Nummer holen
    
          AUF   #ByteNummer_DB; 
          L     #temp_DBW; 
         LAR1
         L     DBW [AR1,P#0.0]; 
          T     #Byte_Nummer; 
    NETWORK
    TITLE =Trigger-Bit-Nummer holen
    
          AUF   #BitNummer_DB; 
          L     #temp_DBW; 
         LAR1
         L     DBW [AR1,P#0.0]; 
          T     #Bit_Nummer; 
    NETWORK
    TITLE =Pointeradresse der Triggervariable zusammensetzen
    
          AUF   DB [#DB_Nummer]; 
          L     #Byte_Nummer; 
          SLD   3; 
          L     #Bit_Nummer; 
          +D    ; 
          LAR1  ; 
          UN    M      1.0; 
          =     DBX [AR1,P#0.0]; 
    
    
    NETWORK
    TITLE =Vergleichen auf letztes DBW
    
          L     #temp_DBW; 
          L     0; 
          <=I   ; 
          SPB   ende; 
          SPA   anf; 
    
    NETWORK
    TITLE =
    
    ende: NOP   0; 
    
    
    END_FUNCTION
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  9. #9
    Registriert seit
    11.05.2005
    Ort
    Baden-Württemberg
    Beiträge
    673
    Danke
    113
    Erhielt 153 Danke für 124 Beiträge

    Standard

    Code:
    NETWORK
    TITLE =Pointeradresse der Triggervariable zusammensetzen
    
          AUF   DB [#DB_Nummer]; 
          L     #Byte_Nummer; 
          SLD   3; 
          L     #Bit_Nummer; 
          OD   ; 
          LAR2  ; 
          UN    M      1.0; 
          =     DBX [AR2,P#0.0];
    Meiner Meinung nach sollte auch das +D durch OD ersetzt werden.
    Das Adressregister kannst in AWL mit Rechtsklick auf z.B. VKE einblenden.

    Ergänzung:
    Lass mal die Änderung vom Paule weg und schreib vor dem Rücksprung +AR1 p#2.0

    Nochmal edit
    Hab noch mal drüber nachgedacht.
    Ist auch Quatsch, da das AR1 ja zwei mal verwendet wird.
    Sollte aber gehen, wenn zum setzen AR2 benutzt wird...
    Geändert von SPSKILLER (28.03.2012 um 06:30 Uhr)
    "arbeite klug, nicht hart" - deutsches Sprichwort

  10. #10
    Avatar von Nico99
    Nico99 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    11.04.2006
    Ort
    Niedersachsen
    Beiträge
    134
    Danke
    76
    Erhielt 12 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi!

    wenn ich in den NW 4-6 die Anweisung LAR1 einfüge geht die CPU in STOP wegen "Ausrichtungsfehler beim Lesen"

    Wenn ich jedoch anstatt LAR1 TAR1 in NW 5-6 (Lesen von Byte- und Bit Adressen aus den DB's schreibe, scheint es zu laufen.

    EDIT: Ich nehme alle szurück: 1 Mal die PLC-Sim beendet (ich simuliere damit) und gestartet, Programm geladen: es tut wieder nicht
    Geändert von Nico99 (28.03.2012 um 18:48 Uhr)

Ähnliche Themen

  1. Biete: Verschiede B&R Neuteile
    Von Beginner09 im Forum Suche - Biete
    Antworten: 0
    Letzter Beitrag: 30.11.2010, 12:00
  2. Bits im DB 42 zählen
    Von tanja im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 24.07.2007, 17:28
  3. Bits mittakten
    Von Paddy im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 04.04.2007, 13:15
  4. Antworten: 11
    Letzter Beitrag: 23.02.2006, 06:40
  5. Bits in temporäres Byte mappen und gesetzte Bits zählen
    Von yetibrain im Forum PC- und Netzwerktechnik
    Antworten: 3
    Letzter Beitrag: 19.02.2005, 16:31

Lesezeichen

Berechtigungen

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