WinCC Unified Wie manipuliertes Datum+Uhrzeit inS7-300 laden?

Ludewig

Level-3
Beiträge
1.137
Reaktionspunkte
250
Zuviel Werbung?
-> Hier kostenlos registrieren
Umgebung:
Unified MTP 1200
S7313C (über RFC1006 per Deltalogic-Adapter)

Ich frage mich gerade Folgendes:

Wenn ich dieses Skript im Aufgabenplaner sekündlich starte:
Code:
export async function Task_Write_timeanddate_to_PLC_Update() {
Tags("Panel-Zeit").Write(new Date());
}
dann sehe ich in der Ausgabe im Panel die UTC (ist m.W. nicht normkonform, aber nicht Thema)

Starte ich dagegen dieses Skript, dann bleibt die Zeit schon im Panel (in einer Testanzeige) stehen. (Ich will die Zeit nach UTC -6h umrechnen.)
Die Trace-Ausgaben zeigen korrekte Werte in 1970er-Millisekunden. Die letzte Zeile ist aber irgendwie falsch.

1769435098779.png
Was könnte ich besser machen?

Eigentlich ist Date and Time ja bei der 300er BCD-codiert. Die korrekte Wandlung scheint aber nicht das Problem zu sein. Denn sie funktioniert auch beim Lesen aus der Steuerung. Macht also der 300er-Treiber aus der Verbindung?
 

Anhänge

  • 1769433802641.png
    1769433802641.png
    5,8 KB · Aufrufe: 6
dann sehe ich in der Ausgabe im Panel die UTC (ist m.W. nicht normkonform, aber nicht Thema)
Dast Date-Objekt ist immer erst einmal UTC, siehe hier.
Liest du eine HMI-Variable in ein Date-Objekt, wird der Zeitwert erst einmal als UTC interpretiert.
Verwendest du eine Zeitvariable im Scripting, wird beim Lesen & Schreiben der HMI-Variable immer mit der UTC-Zeit gearbeitet.
Lokalzeit, Zeitzonen-Offset usw musst du die über die Methoden des Daten-Objekts holen bzw. korrigieren.
Du musst also leider immer die Zeitzone mit beachten, Beispiel:
Javascript:
//DateTime-Variable (LocalTag in einem Faceplate) lesen
let value = new Date(DateCache.Read(Tags.Enums.hmiReadType.hmiReadCache));
//Korrektur des Datums um die TimezoneOffset, da ansonsten der UTC-Wert (ohne Zeitzone) geschrieben wird.
value.setMinutes(value.getMinutes() - value.getTimezoneOffset());
//Aktualisierte Zeit an Faceplate-Schnittstelle schreiben, Datentyp "DateTime"
Tags("HmiVarDateTimeValue").Write(value, Tags.Enums.hmiWriteType.hmiWriteNoWait);
Beim Lesen aus der HMI-Variable entsprechend das Gleiche, nur anders herum:
Javascript:
let dateNow = new Date();
let dateVar = new Date(DateVar.Read());
dateVar.setMinutes(dateVar.getMinutes() + dateNow.getTimezoneOffset());
DateCache.Write(dateVar, Tags.Enums.hmiWriteType.hmiWriteNoWait);
Eine bessere Methode zum Umgang mit SPS Zeit-Datentypen in Verbindung mit Javascript hab ich leider auch noch nicht gefunden ¯\_(ツ)_/¯
 
Zuletzt bearbeitet:
Zurück
Oben