TIA Laufzeit messen und Aufaddieren (TONR - Zeit akkumulieren für S7-300)

Krümi

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SIMATIC- Liebhaber ;)
Ich stecke gerade bisschen in der Klemme, da ich morgen zum Kunden muss und zuvor noch folgendes Problem lösen muss:
Ich möchte mittels einer Zeitmessung die Einschaltzeiten eines Motors messen und aufaddieren. Bei erreichen eines Endlagenschalters soll die gemessene Zeit dann auch wieder auf null gesetzt werden.

Ich habe dies bei der S7-1200 immer mit der zur verfügung stehenden Funktion "TONR - Zeit akkumulieren" erfüllen können.
Ich muss diese Aufgabe jedoch nun mit einer S7-300c erfüllen. Ich war regelrecht überrascht, als ich "TONR" dort nicht finden konnte. :confused: Ich habe schon einige alternativen (z.B. mit 2x nacheinander RD-SYS-Time und ermitteln der Differenz etc. jedoch fehlt mir noch das aufaddieren) ausprobiert, bin jedoch noch nicht zu einem zufrieden stellenden Ergebnis gekommen. SCL ist leider nicht so ganz meins.

Vielen Dank an alle, die mich bei der Lösung meines Problems unterstützen können!! (Das ist eine Bitte!) :D

Beste Grüße, Sebastian!

Software: Step7-Pro v12 SP1
 
1. Variante

Du hast ja sicher ein Signal, das dir anzeigt, dass der Motor eingeschaltet ist.
Von diesem Signal bildest du dir 2 Flanken.

Flanke 1 - steigende Flanke beim Einschalten
Flanke 2 - fallende Flanke beim Ausschalten

Mit der steigenden Flanke liest du die Systemzeit aus und speicherst sie, mit der fallenden Flanke liest du sie erneut aus, ziehst die 1. Zeit von der zweiten Zeit ab, addierst diese Zeit auf eine 3. Variable für die Laufzeit und löscht die 1. und 2. Zeit wieder (muß nicht sein, ist aber schöner).
Wenn der Endschalter erreicht wird, löscht du die 3. Variable mit der Laufzeit.

2. Variante, wenn es nicht sooooo genau sein muß

Du nimmst einen Takt und bildest dir draus eine Flanke, z.Bsp. alle 100ms.
Solange der Motor läuft, addierst du bei jeder Flanke eine 1 auf eine Variable (Laufzeit).
In dieser Variable steht dann immer die Laufzeit in Vielfachen von 100ms, also bei einer 31 sind das 3,1 Sekunden.
Bei Erreichen des Endschalters löscht du die Variable.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe dies bei der S7-1200 immer mit der zur verfügung stehenden Funktion "TONR - Zeit akkumulieren" erfüllen können.
Ich muss diese Aufgabe jedoch nun mit einer S7-300c erfüllen. Ich war regelrecht überrascht, als ich "TONR" dort nicht finden konnte. :confused:
Den TONR findest du bei den S7-300 nicht unter den "Zeiten" sondern unter den "weiteren Anweisungen".
Frag' mich aber nicht, warum das so ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1. Variante

Du hast ja sicher ein Signal, das dir anzeigt, dass der Motor eingeschaltet ist.
Von diesem Signal bildest du dir 2 Flanken.

Flanke 1 - steigende Flanke beim Einschalten
Flanke 2 - fallende Flanke beim Ausschalten

Mit der steigenden Flanke liest du die Systemzeit aus und speicherst sie, mit der fallenden Flanke liest du sie erneut aus, ziehst die 1. Zeit von der zweiten Zeit ab, addierst diese Zeit auf eine 3. Variable für die Laufzeit und löscht die 1. und 2. Zeit wieder (muß nicht sein, ist aber schöner).
Wenn der Endschalter erreicht wird, löscht du die 3. Variable mit der Laufzeit.

Hallo vielen Dank für die schnelle und Ausführliche Antwort!
Ich habe mir das nun auch gleich zusammen gebastelt. Folgende weitere Fragen tauchen dabei auf:
- wie genau wird das mit den Speichern bzw. Löschen der einzelnen Werte in den entsprechenden Variablen zu den bestimmten Schaltpunkten realisiert?
- beim Addieren der Zeiten stellt sich mir das Problem, dass ich mit "T-ADD" nur die Datentypen DT mit Time addieren kann und nicht Time mit Time
- ich möchte die Zeit während der Messung hochlaufen sehen, da ich z.b. ab 10sek nach Start ein Bit setzen möchte. Ist das möglich?

Nochmals vielen Dank für die Unterstützung!
Sebastian
 
Du bildest eine Flanke und diese Flanke ist genau 1 Zyklus lang True.

In AWL sieht das dann z.Bsp. so aus:
(Am besten keine Tempvar nutzen, Entwerter Merket, STAT-Var in einem FB oder einen globalen DB)

U Merker_Motor_Läuft
FP Hilfsmerker_FP
= Flankenmerker_FP (Dieser Merket ist genau einen Zyklus lang True)

UN Flankenmerker_FP
SPB WEIP

//hier kommt der Code hinein, der genau ein Mal mit der Flanke ausgeführt werden soll

//Zeit auslesen
//und speichern
...
T #Startzeit



WEIP: NOP 0

//aktuelle Zeit auslesen
//und speichern
T #Aktuelle_Zeit

Du kannst die Differenz zwischen der 1. abgespeicherten Zeit (Startzeit) und der laufenden Zeit ja fortwährend bilden und anzeigen, indem die die aktuelle Zeit immer ausliest.

L Aktuelle_Zeit
L Startzeit
-D
T Laufende_Differenz

Diese Differenz kannst du dir mal ansehen, das sind Millisekunden, also eine 1000 für eine Sekunde
Hier kannst du mit einem Vergleicher nach 10 Sekunden (>10000) einen Merket setzen


Dann noch bei Stop des Motors:

U Merker_Motor_Läuft
FN Hilfsmerker_FN
= Flankenmerker_FN (Dieser Merket ist genau einen Zyklus lang True)

UN Flankenmerker_FN
SPB WEIN

//hier kommt der Code hinein, der genau ein Mal mit der Flanke ausgeführt werden soll

//Zeit auslesen
//und speichern
...
T #Stopzeit

L Stopzeit
L Startzeit
-D
L Merkzeit
+D
T Motorlaufzeit_Gesamt


WEIN: NOP 0

Das ganze geht sicher auch in KOP/FUP, dann kann man mit der Flanke den Enable-Eingang z.Bsp. der Move-Bausteine aktivieren, so dass genau dann die Daten entsprechend kopiert werden.
 
Zurück
Oben