Ähm... Du weißt schon das WinCC einen DATE_AND_TIME komplett auf Gültigkeit prüft oder?
Das einfache erhöhen einer Stunde geht eigentlich immer, solange der Wert zwichen 0..23 bleibt, geht.
Code:
CALL "READ_CLK" //Systemzeit CPU - UTC (gültig und vollständig)
RET_VAL:=#iINT
CDT :="DbSysTime".DT_A //DB1.DBB0
//Stunde
L DB1.DBB 3 //Geht solange die CPU-Stunde <= 22
BTI //Das Datum bleibt bei überschreiten von 23 logischerweies unverändert
+ 1
ITB
T DB1.DBB 3
Das geht bei mir im Simulator mit ner 315 und nem MP370 Problemlos.
In deinem kurzen Code-Beispiel, wo du was ähnliches zeigst, kann ich leider nicht sehen wo die restlichen Teile herkommen.
Im Simulator sehe ich dann auch das der Zeitstempel als "######" angezeigt wird, sobald irgend ein Teil davon nicht mehr passt.
Das andere Beispiel in dem du einfach versuchst den Tag im Datum zu ändern, kann nicht gehen.
Denn dann passt der in Byte8 eingetragene Wochentag nicht mehr dazu.
Code:
CALL "READ_CLK" //Systemzeit CPU - UTC
RET_VAL:=#iINT
CDT :="DbSysTime".DT_A //DB1.DBB0
//Datum-Tag
L 12 //Geht so gut wie nie
ITB //Das Datum pass nicht mehr zum Wocchentag im Byte8
T DB1.DBB 2
L DB1.DBB 8 //Wenn man den Wochentag entsprechend korrigiert, dann passt es wieder
UW W#16#F0
L 6 //Der 12.08.2016 war ein Freitag
OW
T DB1.DBB 8
Aber was hilft dir das?
Du möchtest ja einen DATE_AND_TIME von UTC auf CEST bringen.
Das heißt dass nicht nur die Stunde addiert werden muss, sondern eventuell auch eine Anpassung von Tag, Monat oder Jahr erforderlich ist.
Den Wochentag zum passenden Datum musst du auch errechnen. Schon kompliziert.
Wenn man was zu nem DT addieren will nimmt man die fertige Funktion "AD_DT_TM" aus der Standard-Bibliothek welche all das richtig macht.
Code:
CALL "READ_CLK" //Systemzeit CPU - UTC
RET_VAL:=#iINT
CDT :="DbSysTime".DT_A
CALL "AD_DT_TM"
T :="DbSysTime".DT_A //UTC
D :=T#2H
RET_VAL:="DbSysTime".DT_B //UTC+2
Um damit aus deiner NTP-Zeit (UTC und gleich CP-Systemzeit) die CEST zu bekommen, musst du natürlich wissen ob jetzt Sommerzeit ist oder nicht.
Meiner Meinung nach, zumindest was ich verstanden habe, ist folgendes der einfachste Weg für dich.
- 2 DT-Variablen einmal für die UTC und einmal für die CEST.
- Die UTC-Variable wird zyklisch vom READ_CLK mit Systemzeit (UTC) beschrieben.
- Diese Variable fütterst du dann in den Baustein BT_LT_3 von PN/DP (gibt's hier zum Download)
- Am Ausgang kommt die Zeit richtig als CEST raus, welche du dann auf die zweite DT-Variable schreibst.
Der Baustein von PN/DP berechnet auf Grund des Eingangszeitstempels in UTC ob gerade Sommer- oder Winterzeit herrscht, addiert dann mit AD_DT_TM entweder T#1h oder T#2h und schiebt den Zeitstempel auf den Ausgang.