TIA DTL +30 Tage berechnen / Eingabeformat bei T_Add?

ChristianVogel

Level-2
Beiträge
401
Reaktionspunkte
53
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

kleines Problem, wo ich mich wieder zu doof anstelle... Den Beitrag https://www.sps-forum.de/simatic/94332-zeitintervall-dtl-berechnung.html habe ich mir bereits durchgelesen, sowas ähnliches habe ich vor, ganz konkret: Ich möchte nach der heutigen Systemzeit, die ich mir aus der CPU 1200er-Serie auslese, per Programmfunktion zum Beispiel 30 Tage aufaddieren, um damit beispielsweise ein Wartungsdatum "Ab Tastendruck" +30 Tage in die Zukunft festzulegen...

Laut Onlinehilfe müsste ich auch bei der 1200er ein DTL-Format berechnen können also 06.06.2019 +30Tage = 06.07.2019

Wie / Was muss ich denn da für ein Format bei dem zweiten Summanden vergeben???
T_Add.PNG
Gruß
Christian
 
ja gut.... habe grade nachgegoogelt...

TIME kann ja nur

Max. T#+24d20h31m23s647ms
Min. T#-24d20h31m23s647ms

aber bei DTL die VOLLEN Tage etc. das geht nicht mit T_Add ???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Christian,


markiere den Baustein mal und drücke auf F1 dann sollte die Hilfe mit Bsp kommen. Würde Spontan sagen am 2ten Eingang musst eine Variable vom Typ Time. Also einfach mal T#10s oder so hinschreiben. Aber Achtung mehr als 24 Tage gehen glaube ich nicht außer es gibt auch ein Time Long was ich nicht auswendig weiß.

Gruß Tia
 
Guten Morgen Herr Namensvetter,

also grundsätzlich kannst du ja zu einem Datum einen Zeitwert addieren (z.B. DTL + TIME), das Ergebnis wäre dann wieder ein Datum. Was aber schlecht geht ist ein Datum mit einem Datum addieren. Da stellt sich das TIA vermutlich quer. Das Problem ist, das Format Time. Das geht wie du ja schon herausgefunden hast nur bis 24 Tage. Auf der 1500er löse ich das mit dem LTIME Format. Das hast du leider bei der 1200 nicht. Da es auf der 1200er laut Datentyptabelle nur das TIME Format gibt wird das jetzt schwierig.

Ich vermute mal 24 Tage reichen dir nicht? Dann fallen mir jetzt auf anhieb zwei unfeine Lösungen ein.
1.) Du addierst hintereinander mehrere TIME Variablen. Damit kannst du dann x mal 24 Tage, wird aber für die Eingabe am HMI unschön.
2.) Du schaust dir an, wie das Format DTL aufgebaut ist und fuscht dann z.B. durch INT (Tage) -> DTL irgendwie rum. Wenn ich mir den Aufbau von DTL so ansehe wird das allerdings recht aufwändig.

Ich hoffe ich konnte weiterhelfen,

Gruß (auch) Christian
 
Guten Morgen Herr Namensvetter,

also grundsätzlich kannst du ja zu einem Datum einen Zeitwert addieren (z.B. DTL + TIME), das Ergebnis wäre dann wieder ein Datum. Was aber schlecht geht ist ein Datum mit einem Datum addieren. Da stellt sich das TIA vermutlich quer. Das Problem ist, das Format Time. Das geht wie du ja schon herausgefunden hast nur bis 24 Tage. Auf der 1500er löse ich das mit dem LTIME Format. Das hast du leider bei der 1200 nicht. Da es auf der 1200er laut Datentyptabelle nur das TIME Format gibt wird das jetzt schwierig.

Ich vermute mal 24 Tage reichen dir nicht? Dann fallen mir jetzt auf anhieb zwei unfeine Lösungen ein.
1.) Du addierst hintereinander mehrere TIME Variablen. Damit kannst du dann x mal 24 Tage, wird aber für die Eingabe am HMI unschön.
2.) Du schaust dir an, wie das Format DTL aufgebaut ist und fuscht dann z.B. durch INT (Tage) -> DTL irgendwie rum. Wenn ich mir den Aufbau von DTL so ansehe wird das allerdings recht aufwändig.

Ich hoffe ich konnte weiterhelfen,

Gruß (auch) Christian


Hallo (auch) Christian ;)

Du hast das Problem korrekt erkannt, die 1200er ist da nicht so flexibel wie die 1500er. Der Knackpunkt ist der, dass ich meinen "Standard-Baustein" mit "Standardfunktionen" so programmieren will, dass er IMMER funktioniert, egal ob ich eine 1200er oder 1500er habe.
Dieser Baustein soll auch einen "Maintainance"-Bereich enthalten, der mir ein paar "Wartungsintervalle" für Heizung, Klimagerät, Lüfter (z.B. Filtertausch) bereitstellt und der Werker/Instandhalter per Button auf der HMI, den nächsten Intervall vorgeben kann -> quasi Tastendruck = Aktuelle Datum/Zeit + vorgegebene Zeitdauer.
Diese Dauer kann aber sehr variieren, grade beim Beispiel Filterlüfter habe ich einen Kunden, der muß MINDESTENS wöchentlich nach seinen Filtern schauen, weil es dort eben aussieht wie Sau, ein anderer Kunde muß nur alle 90 Tage mal nachschauen, dort kann man vom Boden essen...

Ich hatte die Hoffnung, dass es da einen "Rechentrick" oder exotische "Eingabemöglichkeit" gibt. Zwischenzeitlich habe ich mir bei Siemens so eine Standardbibliothe runtergeladen, da ist anscheinend sowas enthalten:
PDF: https://cache.industry.siemens.com/...4511/v1/78788733_s7-1200_dtl_timer_v10_de.pdf
Beitrag: https://support.industry.siemens.co...ormat-dtl-programmiert-werden-?dti=0&lc=de-WW

Da ich meinen Baustein aber auch schlank und Kompakt halten wollte, wird mir das schon ein wenig zu kompliziert... Da muss ich erstmal nachlesen, was die da wieder alles zusammengestellt haben...

Gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin ChristianVogel,

kannst Du nicht einfach einen "Tageszähler" hinzufügen?
Also, wenn 24h abgelaufen sind ein int-Wert hochzählen und time wieder bei 0 beginnen lassen?
Oder selber einen Zeitzähler basteln, der mit einem Lint funktioniert?
Dann könntest Du auch einfach Sekunden zählen und es reicht ein Dint...
Oder brauchst Du unbedingt das DTL-Format für andere Anzeigen/Funktionen?

VG

MFreiberger
 
So langsam werde ich wach ;) Ich habe mal einen Wartungsplan ähnlich wie deinem für neue und alte Welt programmiert. Für die alte Welt die ja auch nur TIME hat habe ich dann nur in ganzen Tagen (nur als INT) gerechnet. Das Datum habe ich über Tage seit 01.01.1990 (Date Format?) gelöst. Da man dann bei Tagen das Problem hat, dass die Wartungsanforderung immer um 0:00 Uhr aufploppen würde habe ich zusätzlich noch eine Uhrzeit (z.B. 6 Uhr) angegeben zu der an den entsprechenden tagen die Meldung aufploppen soll. Vielleicht hilft dir das ja weiter.
 
DTL ist ja ein Struct aus Jahr, Monat, Tag, Wochentag usw., welche jeweils als UINT oder USINT definiert sind

Du kannst auf die einzelnen Member direkt zugreifen, z.B. #MyDate.Day.
Somit kannst Du zum Tag direkt Deine 30 Tage durch einfache Addition hinzufügen, in etwa:
Code:
#MyDate.Day := #MyDate.Day + INT_TO_USINT(30);
(PS: Vielleicht funktioniert es sogar ohne die Typwandlung bei der 30, solange sie am Ende der Addition kommt)

Mit:
Code:
#MyDate := DATE_TO_DTL(DTL_TO_DATE(#MyDate))
korrigiert die S7-1200 nicht passende Einträge, wie z.B. den Wochentag (mache ich z.B. bei der Berechnung der aktuellen KW).
Vermutlich betrifft das auch zu große Tagesangaben, also den nötigen Übertrag in Monat und eventuell ins Jahr. Würde ich einfach mal ausprobieren.
Wenn nicht kann man diese Überträge ja auch selber behandeln. Allerdings finde ich da SCL dann etwas geeigneter für als FUP/KOP.


PS:
Eine Überlegung ist dann vlt. noch, ob man der Einfachheit halber den Monat mit 1 addiert.
Allerdings ist der Zyklus dann je nach Monatslänge etwas "wackeliger".
Und in den letzten Monatstagen ist diese Addition u.U. auch nicht ganz unkritisch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MFreiberger und Stoky,

ich habe mir durchaus Gedanken gemacht, dass ich Tage und Stunden eingebbar machen könnte und dann im Hintergrund mit dem 1Hz-Taktmerker hochzähle und bei "größergleich" eben Meldungen auslösen könnte, da bin ich ganz Eurer Meinung.

-> Mein Hintergedanke war der, ein "Reales Datum" anzeigen zu können, wo eben ein Instandhalter nachkucken kann, wann er denn das nächste Mal an die Maschine muß, bzw. er nachschauen kann wann das letzte mal jemand an der Maschine eine Wartung etc durchgeführt hat.

2019-06-07.jpg

Über ein anderes Fenster wo eben nicht jeder hinkommt, hätte ich dann gerne diese Wartungsintervalle vorgegeben, dass derjenige lediglich per Taste den nächsten Prüfintervall vorgibt.
 
DTL ist ja ein Struct aus Jahr, Monat, Tag, Wochentag usw., welche jeweils als UINT oder USINT definiert sind

Du kannst auf die einzelnen Member direkt zugreifen, z.B. #MyDate.Day.
Somit kannst Du zum Tag direkt Deine 30 Tage durch einfache Addition hinzufügen, in etwa:
Code:
#MyDate.Day := #MyDate.Day + INT_TO_USINT(30);
(PS: Vielleicht funktioniert es sogar ohne die Typwandlung bei der 30, solange sie am Ende der Addition kommt)

Mit:
Code:
#MyDate := DATE_TO_DTL(DTL_TO_DATE(#MyDate))
korrigiert die S7-1200 nicht passende Einträge, wie z.B. den Wochentag (mache ich z.B. bei der Berechnung der aktuellen KW).
Vermutlich betrifft das auch zu große Tagesangaben, also den nötigen Übertrag in Monat und eventuell ins Jahr. Würde ich einfach mal ausprobieren.
Wenn nicht kann man diese Überträge ja auch selber behandeln. Allerdings finde ich da SCL dann etwas geeigneter für als FUP/KOP.


PS:
Eine Überlegung ist dann vlt. noch, ob man der Einfachheit halber den Monat mit 1 addiert.
Allerdings ist der Zyklus dann je nach Monatslänge etwas "wackeliger".
Und in den letzten Monatstagen ist diese Addition u.U. auch nicht ganz unkritisch.


Hallo Hucki,

vielen Dank für die Info, nun ich muss mal schauen, was das Ergebniss ist wenn ich einfach den Tageswert +30 eingebe, es wird warscheinlich nicht der 42. August dabei rauskommen, aber die CPU wird schon meckern nehme ich an...
 
, was das Ergebniss ist wenn ich einfach den Tageswert +30 eingebe, es wird warscheinlich nicht der 42. August dabei rauskommen, ...
Wie gesagt, nicht zum angegebenen Datum passende Wochentage werden mit der Wandlung in DATE und zurück zu DTL korrigiert.
Das sollte auch auf zu große Tagesangaben zutreffen. Einfach mal ausprobieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren

ich habe mir durchaus Gedanken gemacht, dass ich Tage und Stunden eingebbar machen könnte und dann im Hintergrund mit dem 1Hz-Taktmerker hochzähle und bei "größergleich" eben Meldungen auslösen könnte, da bin ich ganz Eurer Meinung.

-> Mein Hintergedanke war der, ein "Reales Datum" anzeigen zu können, wo eben ein Instandhalter nachkucken kann, wann er denn das nächste Mal an die Maschine muß, bzw. er nachschauen kann wann das letzte mal jemand an der Maschine eine Wartung etc durchgeführt hat.

Bloß nicht mit Taktmerker, das ist so ungenau wie sonstwas, mach es besser über das DATE Format (gibts das überhaupt bei 1200?) oder wie hucki ausführte durch Manipulation von DTL.
 
Mal schnell in PLCSIM (1200er) getestet. Grenze für Date = 65535 (UInt).

Anhang anzeigen 46073

Hallo k@ktus,

hättest Dich auch früher melden können :p ...LÄUFT! So mach ich's...

Ich muss noch das ganze Programm (ein FB) auf meinen CPU's mal durchtesten, ob diese auch in Echt auf den 1200er UND 1500er 1:1 funktionieren, sieht aber mal gut aus!!!

Vielen Dank und allen ein schönes langes Wochenende!

Gruß Christian
 
Zurück
Oben