TIA Zeitmessung S1200

sps_azubi

Level-2
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, folgendes.. ich möchte die Zeit messen, die benötigt wird, einen Behälter mit Hilfe einer Pumpe zu füllen. Dabei soll genau die Zeit zwischen Öffnen des Ventils und dem Auslösen des Füllstandsensors bestimmt werden. Auf der Suche nach einer Lösung bin ich dann auf das Auslesen der Systemzeiten und die Bestimmung der Differenz der beiden Zeiten gestoßen (RD_SYS_T und T_DIFF). Das erscheint mir für so etwas einfaches aber doch sehr umständlich. Gibt es da nicht einen einfacheren Lösungsweg? Falls nicht, was genau muss ich bei RET_VAL eintragen?
 
Ich denke das die Methode mit zwei Zeitstempeln von RD_SYS_T und T_DIFF das genauste Ergebnis liefert.
Ich weiß nicht wie genau du sein musst. Ansonsten kannst du natürlich auch mit einer Flanke vom 1Hz Takt vom Taktmerkerbyte einen Wert inkrementieren, solange der Prozess läuft. Dann hast du am Ende deine Dauer in Sekunden.
RET_VAL gibt dir bei den meisten Bausteinen einen Bearbeitungsstatus zurück. Da kannst du einen temporären INT dran machen. Den Wert benötigst du nur für Diagnosezwecke
 
Ich denke das die Methode mit zwei Zeitstempeln von RD_SYS_T und T_DIFF das genauste Ergebnis liefert.
Technisch gesehen ja...solange bis zur nächsten Zeitumstellung oder Korrektur der SPS-Uhrzeit.

Ich benutze für Vergleiche von Zeitpunkten deswegen meistens TIME_TCK.
Musst nur beachten, dass die Funktion alle T#24D_20H_31M_23S_647MS überläuft und wieder bei T#0ms anfängt (und auch bei jedem SPS-Neustart).
Da musst du dann ne kleine Funktion schreiben, die das berücksichtigt.
Code:
REGION INITIALISATION 
    ENO := TRUE; //keine Fehlerbehandlung notwendig => ENO immer TRUE
END_REGION INITIALISATION 

REGION PROGRAM LOGIC
    IF #iStart <= #iJetzt THEN//kein überlauf
        #tDiffTime := #iJetzt - #iStart;
    ELSE//"ijetzt" ist jünger als "istart" => Überlauf aufgetreten
        #tDiffTime := (#OVERFLOW_VALUE - #iStart) + #iJetzt;
    END_IF;
END_REGION PROGRAM LOGIC

REGION OUTPUTS
    #Compare_TimeTck := #tDiffTime;
END_REGION OUTPUTS
 
jetzt hab ich ein anderes Problem.. das Erfassen der Zeiten klappt soweit schon mal sehr gut, werden auf dem HMI angezeigt usw. Allerdings muss ich den Wert auch irgendwie abspeichern, bevor er sich beim stoppen zurücksetzt. mit dem move Baustein ist das allerdings nicht möglich, da er das Datenformat Time_of_Day nicht raus gibt. gibt es für den Transfer von Zeiten einen anderen baustein bzw kann ich diesem sagen, dass er mir gefälligst eine Zeit als Zeit wegspeichern soll? :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
danke botimperator aber so ausführlich brauche ich es wirklich nicht. die maximale zeitspanne ist ein paar sekunden lang und ich programmiere auch in FUP; SCL ist mir zu umständlich für die kleine Anlage, die ich hier betreue :D
 
jetzt hab ich ein anderes Problem.. das Erfassen der Zeiten klappt soweit schon mal sehr gut, werden auf dem HMI angezeigt usw. Allerdings muss ich den Wert auch irgendwie abspeichern, bevor er sich beim stoppen zurücksetzt. mit dem move Baustein ist das allerdings nicht möglich, da er das Datenformat Time_of_Day nicht raus gibt. gibt es für den Transfer von Zeiten einen anderen baustein bzw kann ich diesem sagen, dass er mir gefälligst eine Zeit als Zeit wegspeichern soll? :ROFLMAO:
Warum funktioniert es nicht mit dem MOVE-Block bei dir?
Das sollte in S7-Classic und auch in TIA funktionieren.
 
jetzt hab ich ein anderes Problem.. das Erfassen der Zeiten klappt soweit schon mal sehr gut, werden auf dem HMI angezeigt usw. Allerdings muss ich den Wert auch irgendwie abspeichern, bevor er sich beim stoppen zurücksetzt. mit dem move Baustein ist das allerdings nicht möglich, da er das Datenformat Time_of_Day nicht raus gibt. gibt es für den Transfer von Zeiten einen anderen baustein bzw kann ich diesem sagen, dass er mir gefälligst eine Zeit als Zeit wegspeichern soll? :ROFLMAO:
Das müsste eigentlich klappen. Sind die Datentypen gleich?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mit dem move Baustein ist das allerdings nicht möglich, da er das Datenformat Time_of_Day nicht raus gibt.
1725362889552.png

Also bei mir mault er nicht beim Moven von Time_of_Day¯\_(ツ)_/¯

Oder beziehst du dich darauf, dass RD_SYS_T kein Time_of_Day ausgibt?
Musst den Zeitwert dann eben konvertieren.
Was spricht gegen DTL oder ähnliches? sollte für dein Vorhaben auch funktionieren.
T_DIFF müsste auch DTL können.
...die maximale zeitspanne ist ein paar sekunden...
Und bei Umstellung Winter- auf Sommerzeit wird daraus eine Stunde und ein paar Sekunden ;)
Sowas kann einen ganz böse foppen, wenn im Betrieb irgendwann nicht reproduzierbare Fehler zufällig auftauchen...

SCL ist mir zu umständlich für die kleine Anlage, die ich hier betreue
Ich find FUP für solche kleinen Zustandsautomaten immer etwas....mühsam und unübersichtlich.
FUP ist für reine Logikschaltungen und die "oberste Schicht" der Programmierung OK.
Kleinere "Schrittketten" bzw Zustandsautomaten gehen in SCL sehr viel übersichtlicher, wenn man sich mal an die Sprache gewöhnt hat.
Nichts anderes hast du ja: Startereignis => Startzeit speichern => warten => Endereignis => Zeitdifferenz zu Start berechnen
Wenn du mal Muße hast, kannst du dir die Siemens-LGF Bibliothek anschauen.
Da gibts einige Templates dazu wie man so etwas effizient mit Status-/Fehlercodes allem aufziehen kann.
 
die maximale zeitspanne ist ein paar sekunden lang und ich programmiere auch in FUP
Dann zähle doch einfach die Sekunden oder addiere Millisekunden ...
Vermutlich wäre für dich die Anweisung RUNTIME (Laufzeitmessung) am besten geeignet, die liefert die gemessene Laufzeit in Sekunden als LREAL, (also mit Sekundenbruchteilen). siehe TIA Hilfe mit Beispielprogramm. Hinweis aus der TIA Hilfe:
Die Anweisung "Laufzeitmessung" verwendet einen internen hochfrequenten Zähler um die Zeit zu berechnen. Wenn der Zähler überläuft, gibt die Anweisung Werte <= 0.0 zurück. Dies kann für S7-1200-CPUs mit Firmware Stand <V4.2 bis zu einmal pro Minute vorkommen. Diese Runtimewerte sind zu ignorieren.

Ich benutze für Vergleiche von Zeitpunkten deswegen meistens TIME_TCK.
Musst nur beachten, dass die Funktion alle T#24D_20H_31M_23S_647MS überläuft und wieder bei T#0ms anfängt (und auch bei jedem SPS-Neustart).
Da musst du dann ne kleine Funktion schreiben, die das berücksichtigt. (...)
Den Überlauf von TIME_TCK kann man sehr simpel herausrechnen: wenn die Differenz Jetzt - Vorher negativ ist, dann einfach L#-2147483648 auf die Differenz addieren.
 
also bei mir sieht es so aus. hab ich da vielleicht einen fehler drin?
DTL nimmt er auch gar nicht erst für Merkerdoppelworte.
vielleicht mache ich es auch zu umständlich aber bis auf das speichern funktioniert ja alles
 

Anhänge

  • 5.PNG
    5.PNG
    5,3 KB · Aufrufe: 26
  • 6.PNG
    6.PNG
    4,2 KB · Aufrufe: 25
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Wert wird bei dir online nur in HEX angezeigt.
Die Anzeige der kann man mit einem rechtsklick auf die Variable ändern.
Jetzt weiß ich jedoch nicht ob man da manuell TOD auswählen kann.

Dein Ergebnis sollte aber passen, da einfach ein Doppelword in ein anderes Doppelword gemoved wird.
Sind im Prinzip alles nur einzelen Bits/Bitfolgen.
 
Zurück
Oben