TIA TiA SCL Time() ?

excelite

Level-1
Beiträge
158
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen,

in Codesys verwende ich für Wartezeiten oder Timeouts in Schrittketten die Funktion "TIME()". Hier ist die Zeit seit einschalten der SPS gespeichert. Das Ganze sieht dann so aus:
Code:
DEKLARATION:
tWaittime : TIME() t#0s;

CODE: 
CASE iStep OF
0:
tWaittime := TIME() + t#5s;
iStep := 10;

10:
IF TIME() > tWaittime THEN
// mache irgendwas
END_IF;

END_CASE;
So kann ich sehr einfach Timeouts oder Wartezeiten in der Schrittkette behandeln. Gibt es sowas auch in SCL/S7 Tia? Ich möchte nicht mit diesen TON/TOF oder Impulsen arbeiten.

Hat jemand einen Tipp?

Danke

Gruß
 
Time_TCK

Aus der Hlfe dazu:

Mit der Anweisung "TIME_TCK" lesen Sie die Systemzeit der CPU. Die Systemzeit ist ein Zeitzähler, der von 0 bis max. 2147483647 ms zählt. Bei einem Überlauf der Systemzeit wird wieder ab "0" gezählt. Das Zeitraster und die Genauigkeit der Systemzeit beträgt 1 ms. Die Systemzeit wird nur von den Betriebszuständen der CPU beeinflusst. Die Systemzeit können Sie zum Beispiel nutzen, um die Dauer von Vorgängen durch Differenzbildung der Ergebnisse von zwei "TIME_TCK"-Aufrufen zu messen. Die Anweisung stellt keine Fehlerinformationen zur Verfügung.
 
in Codesys verwende ich für Wartezeiten oder Timeouts in Schrittketten die Funktion "TIME()". [...]
So kann ich sehr einfach Timeouts oder Wartezeiten in der Schrittkette behandeln. Gibt es sowas auch in SCL/S7 Tia? Ich möchte nicht mit diesen TON/TOF oder Impulsen arbeiten.
Warum möchtest Du nicht mit TON/TOF arbeiten? Das sind nun mal die bewährten Standard-Lösungen bei SPS. Du magst lieber eigene, für andere Programmierer zunächst ungewohnte Lösungen, welche auch noch alle ca. 49 Tage zu Fehlfunktionen führen können, weil der TIME-Wert da überläuft? (Codesys-TIME() und S7-TIME_TCK() haben beide dieses Problem)

Welche CPU hast Du? Bei S7-1200 gibt es TIME_TCK nicht, da müsstest Du RUNTIME() verwenden. RUNTIME() hat diesen Überlauf nur bei Zeitdauer/Zeitmessungen "am Stück" von über 49 Tagen.

Harald
 
... welche auch noch alle ca. 49 Tage zu Fehlfunktionen führen können, weil der TIME-Wert da überläuft? (Codesys-TIME() und S7-TIME_TCK() haben beide dieses Problem)

Ich hab da mal das Vergnügen gehabt bei einer Anlage so einen Fehler zu suchen ...
Da kommt richtig Freude auf :sm17:

Auch wenn es eine elegante Methode ist, so steckt der Teufel da halt im Detail.
 
Hallo Harald,
Du meinst wirklich "ABS Absolutwert einer Gleitpunktzahl"? Was für eine Lösung hast Du Dir vorgestellt?
ich konnte jetzt nicht in der Step 7 Doku nachsehen, aber im Codesys Universum gibt die Funktion den Absolutwert einer Zahl zurück und zwar sowohl von Gleitkomma- als auch von Ganzzahlen.
Wenn der TE kein TON nutzen möchte nimmt er einfach die Differenz von zwei Zeiten (Bei Codesys kommt da auch beim Variablentyp Time ein Wert in ms raus), ermittelt den Absolutwert und hat seine Dauer, deswegen mein Kommentar "ABS ist dein bester Freund".

Von irgendwas mit Internetzugang gesendet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn der TE kein TON nutzen möchte nimmt er einfach die Differenz von zwei Zeiten (Bei Codesys kommt da auch beim Variablentyp Time ein Wert in ms raus), ermittelt den Absolutwert und hat seine Dauer, deswegen mein Kommentar "ABS ist dein bester Freund".
Bei Step7 ist ABS nur auf Gleitpunktzahlen anwendbar.
Aber auch bei Codesys wäre die Anwendung von ABS nicht korrekt. Wenn beim Berechnen eines Zeitpunktes oder einer Zeitdauer über den TIME#Maxwert hinweg gerechnet wird (Überlauf), dann kommt nicht einfach nur eine negative Differenz heraus wo man nur das Vorzeichen umdrehen muß, sondern der Betrag ist um TIME#Maxwert verschoben, z.B. T1 = 1s vor TIME#Maxwert, + 5s kommt T2 = 4s raus, die Differenz beträgt ca. -49 Tage
Code:
//Codesys
  T2 := T1 + TIME#5s; //bei T1 = (TIME#Maxwert - TIME#1s) + TIME#5s ---> T2 = TIME#4s
Diff := T2 - T1;      //Diff = TIME#4s - (TIME#Maxwert - TIME#1s) ---> -TIME#Maxwert+TIME#5s
Bei Step7 ist der Wertebereich von TIME# anders definiert (T#-24D_20H_31M_23S_648MS bis T#24D_20H_31M_23S_647MS) als bei Codesys (T#0ms bis T#49d17h2m47s295ms), das Problem bleibt aber genauso, daß beim Überlauf aus einer Zeitdifferenz von 5 s ca. 49 Tage werden. Das lässt sich nicht mit einfach nur ABS korrigieren

Die Lösung des TE beruht darauf, auf das Überschreiten eines vorberechneten absoluten Zeitpunktes zu warten. Beim Berechnen des Zielzeitpunktes über den TIME#Maxwert hinweg kommt ein Zeitpunkt heraus, der vor dem aktuellen Zeitpunkt liegt und der Vergleich Jetzt() > Zielzeitpunkt ist sofort erfüllt. Das müsste bei jeder Verwendung relativ aufwendig korrigiert werden - dieses "einfache" Verfahren ist untauglich. Es muß auf ein Verfahren mit relativer Zeitdauer umgestellt werden oder bei jeder Verwendung der Spezialfall behandelt werden, daß der berechnete Zielzeitpunkt vor dem Startzeitpunkt liegt. Verwendung von TON/TOF wäre wirklich einfacher.

Harald
 
Code:
CODE: 
CASE iStep OF
0:
tWaittime := TIME() + t#5s;
iStep := 10;

10:
IF [COLOR="#FF0000"]TIME() > tWaittime[/COLOR] THEN
// mache irgendwas
END_IF;

END_CASE;
So kann ich sehr einfach Timeouts oder Wartezeiten in der Schrittkette behandeln.
Außer dem Fehler beim Überlauf von TIME() enthält der Code noch einen weiteren Fehler: wenn bei der Berechnung von tWaittime genau T#49d17h2m47s295ms rauskommt, dann wird die Bedingung nie erfüllt.

Harald
 
Hallo Harald,
das ABS ist (leider) insofern Blödsinn, als bei Codesys Variablen vom Typ Time unsigned sind und soweit Codesys da keine implizite Umwandlung macht das Ergebnis immer positiv ist und ABS nichts bringt.
Ich muss mir echt angewöhnen erstmal gründlich über meine Vorschläge nachzudenken ehe ich sie mache. Das hab ich alles nicht bedacht gehabt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
Du meinst wirklich "ABS Absolutwert einer Gleitpunktzahl"?
mal abgesehen davon, dass meine Idee leider Blödsinn war, wie kommst Du darauf, dass ABS nur bei Gleitpunktzahlen gilt? Ich konnte gerade mal einen Blick in die Doku von TIA V15.1 und da (und ich meine auch schon früher) kann ABS auch auf Ganzzahlen angewendet werden.
 
In Step7 V5.x kann die Anweisung ABS nur für Gleitpunktzahlen verwendet werden. (AWL/FUP/KOP)
Was in TIA V?? eingeführt wurde weiß ich nicht bzw. habe ich auch nicht nachgeschaut. ABS für Gleitpunktzahlen und ABS für Ganzzahlen funktioniert im Detail völlig verschieden.

PS: habe mal in eine TIA-Doku geschaut: das ist CPU-abhängig, ABS für Ganzzahlen gibt es nur für S7-1200/1500. S7-300/400 können ABS nur für Gleitpunktzahlen.
PPS: habe nochmal geschaut, weil der TE sucht die Lösung wohl für SCL: in SCL gibt es ABS für alle CPU für Gleitpunktzahlen und Ganzzahlen (ANY_NUM)

Harald
 
Zuletzt bearbeitet:
Zurück
Oben