TIA Betriebsstundenzähler mit Taktmerker S7 1214c

diegooo

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Mitglieder,
Ich verwende in meinem Haus zur Überwachung und Steuerung eine S7 1214c in verbindung mit einem TP900 Comfort.
Soweit funktioniert alles tadellos.
Nun möchte ich gerne Betriebsstunden erfassen. Z.b., wie lange läuft der springbrunnen im Garten, wie lange war die Haustür geöffnet, wie lange läuft die umwälzpumpe der Heizung usw.

Ich habe mir also selber einen BS zähler mit Hilfe eines ctu vorwärtszähler gebastelt. Am Eingang des ctu läuft der Taktmerker 0.5 mit 1hz und das entsprechende Teil was gezählt werden soll. Nach 60 Sek. Übergibt der high ausgang eine 1 an den minuten zähler. Somit habe ich Sekunden, Minuten, Tage, und Jahre die mit einem MW als int auf dem panel dargestellt werden können.
Funktioniert auch einwandfrei. Für jede BS Erfassung verwende ich einen separaten FC Baustein.

Leider klappt das aber nur mit einem BS zähler. Sobald mehrere fcs im OB geladen werden, spielen die Zeiten verrückt und zeigen unplausible Werte an.

Hat jemand vielleicht eine Idee woran es liegen kann?

VG
 
Zuletzt bearbeitet:
Hört sich erst mal so an als ob du mit Merkerworten in den FC's arbeitet und diese bei Mehrfachaufruf dann doppelt oder dreifach verwendet werden. Warum verwendet du keinen FB?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hört sich erst mal so an als ob du mit Merkerworten in den FC's arbeitet und diese bei Mehrfachaufruf dann doppelt oder dreifach verwendet werden. Warum verwendet du keinen FB?
Ja richtig, ich beginne mit mw200 für sekunden, dann mw204 für minuten, mw208 für Stunden usw.
Kein MW wird doppelt verwendet....Hoffe ich

Mit der Programmierung von FBs wäre ich jetzt allerdings erstmal etwas ratlos :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bevor man losprogrammiert, sollte man zunächst die Aufgabe etwas durchdenken... ;)

1) Wenn Du für verschiedene Geräte gleichzeitig die Betriebszeit zählen willst, dann brauchst Du logischerweise für jeden Betriebsstundenzähler eine eigene Merkzelle, die sich den Zählerstand merkt.
2) Wie lange sollen die Betriebsstundenzähler zählen können bevor sie voll sind und stehenbleiben, oder wie im richtigen Leben überlaufen (wieder bei 0 anfangen)?
3) Wie merkt und schützt man den Zählerstand, so daß er nicht versehentlich bei Spannungsausfall oder CPU-STOP oder durch das TIA gelöscht wird?

zu 1) Wie hast Du in Deinem Programm (FC ? ) realisiert, daß jedes Gerät einen eigenen Betriebsstundenzähler verwendet bzw. eine eigene Merkzelle hat?
Die einzelnen IEC Counter müssen je Gerät getrennt in eigenen Instanzen angelegt werden, z.B. je IEC Counter ein eigener DB oder alle gemeinsam in einen DB. Oder einen FB für das Zählen programmieren, und den IEC Counter in dem FB deklarieren und dann je Gerät eine eigene FB-Instanz anlegen.
zu 2) CTU-Zähler für Sekunden, Minuten, Tage und Jahre einzeln sind ungünstig. In Deiner Programmierung brauchst Du so je Gerät 4 Zähler und viel Speicherplatz.
zu 3) Die Zählerstände müssen remanent und in einer Struktur abgelegt werden, die sich nie mehr ändert, damit TIA die Struktur nicht irgendwann mal Zwangs-Initialisieren will. Also die Variablen in einem remanenten DB mit genügend Reserve-Variablen ablegen.

Tip: Verwende für den CTU einen UDINT und begrenze den Zählumfang auf eine glatte Zehnerpotenz z.B. 1_000_000_000 s, so daß er von 0 bis 999_999_999 s zählt und dann von vorne beginnt, dann hast Du einen 9-stelligen Betriebszeitzähler, der 31 Jahre ununterbrochen zählen kann bevor er überläuft. Nur für die Anzeige am HMI kann dann der Sekunden-Zählerstand in z.B. Stunden:Minuten:Sekunden zerlegt werden.

Anstatt CTU kann man auch den Zähler aus ADD und einer UDINT-Variable zusammenbasteln und hat dann auch bessere Möglichkeiten, den Zählerstand remanent und geschützt vor Überschreiben/Löschen von TIA zu speichern.

PS: zu langsam getippselt...

Harald
 
In Deinen Bildern ist nur das Betriebszeitzählen eines Gerätes abgebildet. Wie realisierst Du das Betriebszeitzählen der anderen Geräte? Du schriebst in #1 daß Du mehrere FC hast. Verwenden die FC die selben IEC-Counter DB25, DB26 ...? Das wäre falsch, weil die IEC-Counter selber sich den Zählerstand merken und dann verschiedene Geräte die selben Merk-Variablen verwenden.

Harald
 
In Deinen Bildern ist nur das Betriebszeitzählen eines Gerätes abgebildet. Wie realisierst Du das Betriebszeitzählen der anderen Geräte? Du schriebst in #1 daß Du mehrere FC hast. Verwenden die FC die selben IEC-Counter DB25, DB26 ...? Das wäre falsch, weil die IEC-Counter selber sich den Zählerstand merken und dann verschiedene Geräte die selben Merk-Variablen verwenden.

Harald
Nein, jeder FC verwendet verschiedene Counter DB.
In den Bildern ist tatsächlich nur einer der 5 FCs dargestellt. alle anderen sind gleichermaßen aufgebaut, nur eben mit anderen counter db
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, jeder FC verwendet verschiedene Counter DB.
Leider klappt das aber nur mit einem BS zähler. Sobald mehrere fcs im OB geladen werden, spielen die Zeiten verrückt und zeigen unplausible Werte an.
Sind verwendete Merker mehrfach verwendet?
Wie sieht der Aufruf der FCs aus? Rufst Du vielleicht den selben FC mehrfach auf?
Kannst Du genauer erklären oder zeigen was Du mit verrückt spielen und unplausible Werte meinst?
Wird noch in anderen Programmteilen auf die Counter DB zugegriffen?
Schreibt das HMI-Panel in die Counter DB? Trenne das HMI mal vom Netz - wird es da besser?

Welche TIA-Version verwendest Du? Welche 1214 CPU genau? Welche Firmwareversion hat die?

Harald
 
Erstmal vielen Dank für die tolle Hilfe und Unterstützung hier!!!

Tatsächlich, habe gerade nochmal jeden einzelnen FC überprüft...in jedem FC werden die gleichen IEC-Counter DB aufgerufen.
Ich werde es gleich mal abändern und erneut versuchen.

Vielen Dank
 
Hier mal eine Beispiel für einen Betriebszeitzähler in einem FB, den man mehrfach verwenden kann. Sorry SCL ist meine favorite Sprache bei Siemens PLCs.
BetriebszeitZaehler.PNG

Code:
UNCTION_BLOCK "BetriebszeitZaehler"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      Active : Bool;
      Reset : Bool;
      Clock_1HZ : Bool;
   END_VAR

   VAR_OUTPUT
      Year : DInt;
      Day : DInt;
      Houre : DInt;
      Minute : DInt;
      Second : DInt;
   END_VAR

   VAR
      statSecond : DInt;
      statMinute : DInt;
      statHoure : DInt;
      statDay : DInt;
      statYear : DInt;
      statRtrigClock {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
   END_VAR

   VAR_TEMP
      tempRetVal : Int;
      tempSysT {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
      tempTimeDiff : Time;
   END_VAR


BEGIN
    REGION Reset
        IF #Reset THEN
            #statSecond := 0;
            #statMinute := 0;
            #statHoure := 0;
            #statDay := 0;
            #statYear := 0;
            #Year := 0;
            #Day := 0;
            #Houre := 0;
            #Minute := 0;
            #Second := 0;
        END_IF;
    END_REGION
    
    REGION Flankenerkennung Clock Signal
        #statRtrigClock(CLK := #Clock_1HZ);
    END_REGION
    
    REGION Addiere eine Sekunde, wenn eine Sekunde vergangen
        IF (#Active AND #statRtrigClock.Q) THEN
            #statSecond += 1;
        ELSE
            RETURN;
        END_IF;
    END_REGION
    
    REGION Zähle Minuten
        IF (#statSecond > 59) THEN
            #statMinute += 1;
            #statSecond := 0;
        END_IF;
    END_REGION
    
    REGION Zähle Stunden
        IF (#statMinute > 59) THEN
            #statHoure += 1;
            #statMinute := 0;
        END_IF;
    END_REGION
    
    REGION Zähle Tage
        IF (#statHoure > 23) THEN
            #statDay += 1;
            #statHoure := 0;
        END_IF;
    END_REGION
    
    REGION Zähle Jahre
        IF (#statDay > 364) THEN
            #statYear += 1;
            #statDay := 0;
        END_IF;
    END_REGION
    
    REGION Setzte Ausgänge
        #Year := #statYear;
        #Day := #statDay;
        #Houre := #statHoure;
        #Minute := #statMinute;
        #Second := #statSecond;
    END_REGION
    
END_FUNCTION_BLOCK
 
Hier mal eine Beispiel für einen Betriebszeitzähler in einem FB, den man mehrfach verwenden kann.
Wenn Speicherplatz keine Rolle spielt, dann kann man auch so ein Big Data Ungetüm verwenden ;) (braucht geschätzt circa 50 Byte Datenspeicher je Instanz, wo eigentlich nur 4 Byte reichen würden)

Sorry SCL ist meine favorite Sprache bei Siemens PLCs.
Mit dem sicherlich gut gemeinten RETURN holt man sich unkalkulierbar schwankende Zykluszeiten (*) ins Programm und die prickelnde Unsicherheit, falls mal fieserweise hundert Geräte mit Zeitmessungen gleichzeitig laufen, daß die dann in manchen Zyklen verlängerte Zykluszeit irgendwelche Probleme macht.

(*) geschätzt: bei aktiv und Taktflanke braucht der Code 3x so lange wie sonst, und falls gerade ein Tag oder Jahr voll wird, dann sogar 4x so lange.
Mit FUP/KOP programmiert würde der Programmierer vermutlich nicht auf die Idee mit dem RETURN kommen und die Ausführungszeit würde nicht so stark schwanken.

Ich programmiere meine Betriebszeitmessungen als FC und habe alle Instanzen der Betriebszeit-Strukturen (Betriebszeit DINT + DATE Zählerreset) in einem globalen DB liegen und übergebe diese Struktur an den FC.

Harald
 
Zurück
Oben