TIA Timer, selbst gebastelt. Bitte schreibt Eure Meinung, danke.

row-k

Level-1
Beiträge
49
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle!

Mir passte der Umgang mit den Timern (als Taktgeber) im TIA nicht so recht und wahrscheinlich habe ich die, obwohl schon erfolgreich unter FUP eingesetzt, auch nicht wirklich verstanden. Gelesen zum Timer-Thema habe ich viel im I-Net und natürlich hier, aber wie gesagt, gefiel mir das alles nicht.
Darum habe ich mir im MAIN-Baustein einfach per SCL welche mit eingebastelt. Sie funktionieren sehr gut und unabhängig voneinander, sind einstellbar, geben bei Ablauf ein periodisches Signal in eine Variable und machen also, was ich will.

Aber!! Ist das, wie soll ich sagen, "richtig", bloß weil es praktisch funktioniert? Was sagt Ihr dazu als Fachleute?
Viele Grüße von Björn

Hier der Code in SCL dazu, wie gesagt, läuft der im MAIN einfach so mit (EDIT: KommentareGrün gefärbt):
Code:
"Alle_Maschinen".Systemzeitwert1_2 := "Alle_Maschinen".Systemzeitwert2_2 := "Alle_Maschinen".Systemzeitwert3_2 := TIME_TCK() ; [COLOR=#008000]// Zeiten 1_2, 2_2, 3_2 usw. werden ständig synchronisiert
// Die "_1er Zeiten" (1_1, 2_1 usw.) bleiben "stehen" auf dem Synchr.-Wert aus (zu Anfang OB100) und danach wegen IF-Bedingung[/COLOR]
IF "Alle_Maschinen".Systemzeitwert1_2 - "Alle_Maschinen".Systemzeitwert1_1 >= "Alle_Maschinen".Taktzeit_Maschinen THEN [COLOR=#008000]// Taktzeit_Masch.wird in OB100 vorgegeben und später ggf. verändert[/COLOR]
    "Alle_Maschinen".Systemzeitwert1_1 := TIME_TCK(); [COLOR=#008000]// jetzt, wenn Vorgabezeit abgelaufen ist, wird die "_1er Zeit" neu gesetzt[/COLOR]
    "Alle_Maschinen".Zeitablauf1 := TRUE; [COLOR=#008000]// Variable, die als Takt-Signal in anderen Bausteinen verwendet werden kann[/COLOR]
END_IF;


IF "Alle_Maschinen".Systemzeitwert2_2 - "Alle_Maschinen".Systemzeitwert2_1 >= "Alle_Maschinen".Taktzeit_Lieferer THEN
    "Alle_Maschinen".Systemzeitwert2_1 := TIME_TCK() ;
    "Alle_Maschinen".Zeitablauf2 := TRUE;
END_IF;


IF "Alle_Maschinen".Systemzeitwert3_2 - "Alle_Maschinen".Systemzeitwert3_1 >= "Alle_Maschinen".Taktzeit_Lief_Foe THEN
    "Alle_Maschinen".Systemzeitwert3_1 := TIME_TCK() ;
    "Alle_Maschinen".Zeitablauf3 := TRUE;
END_IF;
[COLOR=#008000](* für den nächsten Zähler
IF "Alle_Maschinen".Systemzeitwert4_2 - "Alle_Maschinen".Systemzeitwert4_1 >= "Alle_Maschinen".Taktzeit_XXXX THEN
    "Alle_Maschinen".Systemzeitwert4_1 := TIME_TCK() ;
    "Alle_Maschinen".Zeitablauf4 := TRUE;
END_IF;
*)[/COLOR]
 
Zuletzt bearbeitet:
Timer selber basteln ist grundsätzlich erst mal nicht falsch, allerdings sollte der Code fehlerfrei funktionieren und (Fach-)Kollegen sollten den Code verstehen können ... Wer einen Siemens-Lehrgang besucht oder die TIA-Dokumentation gründlich liest wird die Standard-Timer verstehen und anwenden können. (Gibt es zu Deinen innovativen Timern einen Lehrgang oder eine verständliche Beschreibung? ;) )

S7-1200 kennen die Anweisung TIME_TCK() nicht. Da sind Deine Timer so nicht anwendbar.
Bei S7-300/400/1500 hat TIME_TCK() nach 24 Tagen einen Überlauf von ca. 2147483647 zu ca. 0 und liefert wieder Werte ab 0, dann ist (Systemzeitwertx_2 - Systemzeitwertx_1) negativ und Deine IF sind mindestens 24 Tage lang (oder für immer) nicht erfüllt und die Timer werden nicht TRUE.

(Wenn TIME_TCK() mehrmals im Zyklus aufgerufen wird, dann kann/wird TIME_TCK() verschiedene Werte liefern und die Zeitdifferenz (ms) zum TIME_TCK() vom Anfang von MAIN kann größer oder kleiner als 0 sein.)

Wie soll Dein MAIN und Dein OB100 aussehen, wenn Du 200 Timer brauchst? Du solltest den Timer-Code in FB mit simpler/übersichtlicher Schnittstelle kapseln.

Wie werden Deine Timer gestartet? Wann gehen Deine Timer wieder auf FALSE (Zeitablaufx = FALSE)?
Können Deine Timer durch Bool-Signale (wie z.B. VKE) einfach gesteuert werden (dann ist einfacher/übersichtlicher Einsatz in FUP/KOP möglich)?
Warum schreibst Du "Takt"zeit? Sollen diese Timer periodische Signale wie ein Zeittakt liefern? Wo/wie re-starten Deine Timer?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erst mal vielen Dank für Deine Mühe, Harald.
Wer ... die TIA-Dokumentation gründlich liest wird die Standard-Timer verstehen und anwenden können.
Hast ja Recht. Da muss ich wohl mehr und gründlicher lesen. Mach ich, versprochen.

S7-1200 kennen die Anweisung TIME_TCK() nicht. Da sind Deine Timer so nicht anwendbar.
Bei S7-300/400/1500 hat TIME_TCK() nach 24 Tagen einen Überlauf von ...
Schade, daran hatte ich nicht gedacht. Ich brauche sie aber nur für kurze Zeitdauern und da geht's ...

Wie soll Dein MAIN und Dein OB100 aussehen, wenn Du 200 Timer brauchst? Du solltest den Timer-Code in FB mit simpler/übersichtlicher Schnittstelle kapseln.
Stimmt auch.

Wie werden Deine Timer gestartet? Wann gehen Deine Timer wieder auf FALSE (Zeitablaufx = FALSE)?
SIe starten von allein, weil nur die beiden Systemzeiten verglichen werden (siehe auch weiter unten und in den Kommentaren des Codes).
Zeitablaufx ist nur eine Variable, die ich dann in anderen Funktionen auf FALSE setze, wenn ich sie benutzt habe.

Können Deine Timer durch Bool-Signale (wie z.B. VKE) einfach gesteuert werden (dann ist einfacher/übersichtlicher Einsatz in FUP/KOP möglich)?
Codezeile dazu; das geht. Je nach Anforderung kann ich sie auch mit anderen Variablen anderer Datentypen steuern.

Warum schreibst Du "Takt"zeit? Sollen diese Timer periodische Signale wie ein Zeittakt liefern? Wo/wie re-starten Deine Timer?
Ja, sie liefern unterschiedlich lange Signale, ganz wie gewünscht.
Sie starten immer wieder von allein, denn eine der Zeiten (die _1er) bleiben "stehen", die _2er laufen weiter. Ist die Differenz der beiden entsprechend, tritt die IF-Bedingung ein und die _1er Zeit wird wieder synchronisiert (Differenz ist also wieder kleiner).

... innovativen Timern ...
"Innovativ" sind sie nicht. Ich komme derzeit eben besser damit zurecht.

Nochmals danke und Gruß.
Björn, als TIA-Anfänger noch demütiger geworden :???:
 
Schade, daran hatte ich nicht gedacht. Ich brauche sie aber nur für kurze Zeitdauern und da geht's ...
Es geht bei Dir am Schreibtisch solange Du Lust zum Testen hast ;)

Das Problem ist nicht, ob man lange oder kurze Zeiten messen will, sondern wie lange die SPS-CPU ohne Ausschalten läuft.
Beispiel: Wenn die SPS nicht ausgeschaltet wird und am 25. (oder 50. oder 75. ...) Tag nach Einschalten wird 10 Sekunden vor dem TIME_TCK-Überlauf ein TIME_TCK-basierender Timer gestartet der 30 Sekunden laufen soll, dann wird der nie zur Endzeit (AktuelleZeit - StartZeitpunkt >= 30s) kommen, weil 20 Sekunden vor Ende der TIME_TCK wieder auf 0 springt.

Aber sei nicht betrübt. Du bist in guter Gesellschaft. ;) Das Problem haben auch schon Siemens-Programmierer nicht beachtet ... :roll:

Für die S7-1200 (und S7-1500) hat man übrigens eine ähnliche Stolperfalle eingebaut. Da hat man die tolle RUNTIME()-Funktion neu eingeführt, die ebenfalls regelmäßig überläuft, doch anstatt klip und klar zu dokumentieren was man da zusammengefrickelt hat, wird einfach in der Dokumentation geschrieben, daß man die "bis zu einmal pro Minute" kommenden Überläufe und dadurch resultierenden negativen Zeitdifferenzen einfach ignorieren "kann" (soll) - was aber keine Lösung ist. Und weil es so schlampig realisiert und dokumentiert ist, verhalten sich S7-1200-PLCSIM und echte S7-1200 da auch noch unterschiedlich, was den Zeitpunkt des Überlaufs betrifft ...

Harald
 
Danke PN/DP. Der Sache mit dem Runtime war ich mir noch gar nicht bewusst...
Hilfe zu RUNTIME schrieb:
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.
 
Zurück
Oben