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

Ergebnis 1 bis 4 von 4

Thema: S7-300 Ereigniszähler

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich bin noch ziemlich unerfahren mit Step7. (Schaffe seit zwei Wochen damit). Im moment bastle ich mir ein Grundkonzept für die wichtigsten Funktionen.
    Zu diesen Funktionen gehören u.a. Ereignis- und Betriebsstundenzähler.
    Insbesondere die Ereigniszähler bereiten mir ein Problem, dass sich aber bei den Betriebsstundenzähler vermutlich in ählicher Form zeigen wird.
    Die Ereigniszähler sollen einen Wertebereich von 0 bis 9.999.999 bekommen.
    Nun hatte ich mir vorgestellt, den SFB0 "CTU" zu verwenden, der (das weiß ich schon) nur mit INT als Zählwert umgehen kann, allo bei 32.768 schlappmacht.
    Also wollte ich den SFB0 in einem FB in zwei Instanzen laufen lassen.
    Der erste Zähler bekommt einen Rücksetzimpuls über Q bei PV>=10000
    Gleichzeitig ist dieser Impuls (INST_1.q) Zählimpuls für den zweiten Zählerblock, der dann bis 1000 zählt.
    Das Hauptproblem besteht jetzt in der Umwandlung der Zahlenformate.
    Der Zählwert soll als DINT an das PLS übermittelt werden.
    Gleichzeitig liegt der Rückstellwert des Gesamtzählers als DINT vom PLS vor. Wenn ich nun diesen DINT-Wert in ein BCD-DWORD (DTB) umwandle,
    diesen Wortweise nach an die Zähler weitergebe (nach Umwandlung per BTI) fehlt mir eine Dezimalstelle. Das gleiche passiert bei der Umwandlung des Gesamtzähltwertes aus niederwertigem Zähler per ITB und höherwertigem Zähler per ITB, dann Umwandlung des entstehenden DWORD per BTD.
    HAt jemand eine Idee oder weiss, wie das einfacher geht?
    Zitieren Zitieren S7-300 Ereigniszähler  

  2. #2
    Registriert seit
    10.10.2006
    Ort
    Krefeld
    Beiträge
    101
    Danke
    0
    Erhielt 10 Danke für 10 Beiträge

    Standard

    Hallo,

    klingt alles etwas aufwendig für ne einfache Zählfunktion. Ich würde in Deinem Fall

    a) zwei "Worte" vom Typ DINT in einem DB deklarieren.
    b) das erste (Zählerwert) in Abhängigkeit vom Ereignis (Flanke) INCrementieren.
    c) prüfen, ob des erste grösser/gleich dem zweiten (Rückstellwert) ist und wenn ja, das erste auf 0 setzen.

    Hier mal nen Beispiel:

    Code:
          U   E 0.0           // Ereignis, welches gezählt werden soll
          FP  M 0.0           // Positive Flanke
          =   M 0.1           // Flankenmerker des Ereignisses
     
          UN  M 0.1           // Wenn kein Ereignis anliegt
          SPB END1            // Überspringe das Zählen
          L    DB11.DBD 0     // Zählerwert aus DB laden
          INC 1               // Wert um 1 erhöhen
          T    DB11.DBD 0     // Zählerwert zuück in DB schreiben
     
    END1: L    DB11.DBD 4     // Rückstellwert aus DB laden
          >=R                 // Vergleiche ob Zählerwert grösser/geich Rückstellwert 
          =    M 0.2          // Wenn Zählerwert grösser/gleich Rückstellwert, dann VKE=1
     
          UN   M 0.2          // Wenn Rückstellwert kleiner als Zählerwert
          SPB END2            // Überspringe das Rücksetzen des Zählers
          L    0              // Lade den Wert 0
          T    DB11.DBD 0     // Schreibe den Wert 0 in den DB
     
    END2: NOP 0               // Weiter im Programm

    Gruss,
    Jörg
    Nobody is perfect ... so don't call me Nobody
    Wer glaubt, dass Abteilungsleiter Abteilungen leiten, der glaubt auch, dass Zitronenfalter Zitronen falten.

  3. #3
    Registriert seit
    24.09.2003
    Beiträge
    122
    Danke
    0
    Erhielt 8 Danke für 7 Beiträge

    Standard

    Hallo Jörg,

    zu Deinem Beispiel zwei kleine Anmerkungen.
    Das Beispiel ist im Prinzip ok, jedoch funktioniert der
    Befehl 'INC' nur bis zum Wert 255. Danach beginnt die Zählvariable
    wieder bei Null, es findet kein Übertrag statt.[siehe Hilfe STEP7]
    Wenn man eine DINT-Variable incrementieren will, schreib man besser:

    Code:
    L DB11.DBD0
    + L#1
    T DB11.dbd0
    dann ist im Beispiel noch der Vergleich auf '>=R'. Der sollte
    bei einer Varialblen vom Typ DINT '>=D' sein.

    mfg.
    Rolf

  4. #4
    Registriert seit
    10.10.2006
    Ort
    Krefeld
    Beiträge
    101
    Danke
    0
    Erhielt 10 Danke für 10 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Rolf,

    Zitat Zitat von RolfB Beitrag anzeigen
    jedoch funktioniert der
    Befehl 'INC' nur bis zum Wert 255. ... [siehe Hilfe STEP7]

    ...

    dann ist im Beispiel noch der Vergleich auf '>=R'. Der sollte
    bei einer Varialblen vom Typ DINT '>=D' sein.
    Oops, is mir doch glatt durchgegangen . Tja, wer lesen kann, ist klar im Vorteil .
    Danke für Deine Hinweise!!
    Nobody is perfect ... so don't call me Nobody
    Wer glaubt, dass Abteilungsleiter Abteilungen leiten, der glaubt auch, dass Zitronenfalter Zitronen falten.

Lesezeichen

Berechtigungen

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