S7-300 Ereigniszähler

urlicht

Level-2
Beiträge
104
Reaktionspunkte
4
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?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hallo Rolf,

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 :rolleyes: . Tja, wer lesen kann, ist klar im Vorteil ;) .
Danke für Deine Hinweise!! :s1:
 
Zurück
Oben