WinCC Unified Archiv als *.csv - unerwartetes Ergebnis beim Auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es dafür eine fertige Javascrpt-Methode oder kann man dafür getTimezoneOffset() verwenden? Ich weiß jetzt nicht, ob getTimezoneOffset() den zum Datum passenden Offset liefert oder den gerade aktiven Offset. Das müsste man ausprobieren. Wenn das hier niemand weiß, dann kanst du ja wieder im Siemens-Forum oder den Siemens Support fragen.
Daran hatte ich auch schon gedacht, bzw, damit einen Test gemacht. Allerdings mache ich da wohl irgendetwas falsch, denn wenn ich
Javascript:
getTimezoneOffset()
verwende, werde mir keine Werte mehr ausgelesen. Da werde ich wohl noch etwas experimentieren müssen.....
 
Versuche mal
Javascript:
loggedTag.TimeStamp.setTime(loggedTag.TimeStamp.getTime() - loggedTag.TimeStamp.getTimezoneOffset() * 60 * 1000));
csvData += LoggTag.Name + delimiter + loggedTag.TimeStamp.toString() + delimiter + loggedTag.Value + delimiter + loggedTag.Quality + "\n";
oder besser nicht direkt loggedTag.TimeStamp manipulieren, sondern über ein zweites Date-Objekt gehen:
Javascript:
const Locale = new Date(loggedTag.TimeStamp.getTime() - loggedTag.TimeStamp.getTimezoneOffset() * 60 * 1000));
csvData += LoggTag.Name + delimiter + Locale.toString() + delimiter + loggedTag.Value + delimiter + loggedTag.Quality + "\n";
Oder anstatt toString() die Methode toLocaleString() verwenden? Hmm, eigentlich sollte toString() aber schon Lokalzeit liefern??? :unsure:
siehe JavaScript Date object, da wird auch was zu Timezones erklärt
PS: siehe auch getTimezoneOffset(), da sind auch Programmbeispiele
 
Zuletzt bearbeitet:
Vielleicht mache ich auch etwas verkehrt, wenn ich loggedTag.TimeStamp.toString() beim Export eines Archives in ein csv-File verwende, steht bei mir die UTC-Zeit in der Tabelle. Der Zeitstempel beim Schreiben der Werte ist ja auch UTC, ohne weiteren Parameter kann toString() die Differenz zwischen TUC und Lokalzeit gar nicht wissen oder liege ich da falsch?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn ich loggedTag.TimeStamp.toString() beim Export eines Archives in ein csv-File verwende, steht bei mir die UTC-Zeit in der Tabelle. Der Zeitstempel beim Schreiben der Werte ist ja auch UTC
tja, ich weiß nicht, was die toString()-Doku genau meint mit "interpreted in the local timezone". Immerhin steht da "interpreted" und nicht "converted". Das lässt Spielräume. Und Doku kann auch mal falsch sein, z.B. Siemens-Doku seit TIA ;)
Aber egal, dann rechne einfach den TimezoneOffset dazu, und aus der UTC-Zeit wird Lokalzeit.
Oder nimm die Methode toLocaleString(), die kann man umfangreich wie gewünscht parametrieren (Zeitstring-Format, Zeitzone).

ohne weiteren Parameter kann toString() die Differenz zwischen TUC und Lokalzeit gar nicht wissen oder liege ich da falsch?
Das Javascript Date-Objekt kennt die Zeitdifferenz der Laufzeit-Umgebung zu UTC.
 
ExcelNotepad++
17199979522128701719997952212.877
171999794220718001719997942207.1816
Die unterschiedliche Länge der Zahl kommt also nicht von Excel
Hallo,
Ich bin heute quasi zum gleichen Problem gekommen und ich habe einfach ein Math.round gemacht:

also timestamp / 1000 und dann Math.round

Javascript:
let pk_timestamp = loggedTag.TimeStamp;
let VarDate_inbetween = (pk_timestamp / 1000 );
let VarDateStamp = Math.round(VarDate_inbetween);

csvData +=   VarDateStamp + delimiter + loggedTag.TimeStamp + delimiter + loggedTag.Value.toLocaleString("de-DE") + delimiter + loggedTagtime + "\n";
// to locale String macht aus 604.5 -> 604,5 also Dezimaltrennzeichen Komma statt Punkt, sodass EXCEL dies als Zahl interpretiert
 
Hallo ich möchte für alle, die es auch betrifft: Meinen Code Teilen:
TIA V19, Update 3:
Herauskommt folgende CSV-Datei:
Screenshot 2025-03-04 234504.jpeg
Javascript:
let time= new Date();
let timeStamp =  "_" + time.getHours() +  time.getMinutes() + time.getSeconds();


let dateStamp = new Date().toLocaleDateString("en-CA", {timeZone: "Europe/Vienna"}); //.replace(/[/]/g, "_");
//let path = "C:\\Users\\Public\\Export_" + dateStamp + "_" + timeStamp + ".csv";

// ************************ wichtig **********************
//let fileName = "/media/simatic/X51/"+ StartTime +"_"+ Anr +".csv";


let fileName = "C:\\Users\\Public\\TagLogFile_" + dateStamp + timeStamp + ".csv";

let start = new Date(); //now
let end = new Date(start.getTime() - 1000 * 60 * 60 * 24 * 60);//last 24h * 60  Days

let delimiter = ";";
//let csvData = "Name" + delimiter + "Timestamp" + delimiter + "Value" + delimiter + "Quality\n";
let csvData =  "Timestamp" + delimiter + "Value\n";
let tag1 = HMIRuntime.TagLogging.LoggedTags("Menge_m3:Archivvariable_2");
HMIRuntime.Trace("Tag Name : " + tag1.Name);
let tagValue = tag1.Read(start, end, 0);
tagValue.then((loggedTagResult) => {
  let error = loggedTagResult.Error;
  let tagArray = loggedTagResult.Values;





  for (let loggedTag of tagArray)
{
    let pk_timestamp = loggedTag.TimeStamp;
    let VarDate_inbetween = (pk_timestamp / 1000 );
    let VarDateStamp = Math.round(VarDate_inbetween);
    let loggedTagString = new Date(pk_timestamp).toLocaleString("de-DE",{timeZone: "Europe/Vienna"});
 
    //csvData +=   loggedTagString + delimiter + loggedTag.TimeStamp + delimiter + loggedTag.Value.toLocaleString("de-DE")  + "\n";
    csvData +=   loggedTagString + delimiter + loggedTag.Value.toLocaleString("de-DE")  + "\n";
 
  }

  HMIRuntime.FileSystem.WriteFile(fileName, csvData, "utf8").then(
  function() {
    HMIRuntime.Trace("Write file finished successfully");
  }).catch(function(errCode) {
    HMIRuntime.Trace("Write failed, Error: " + errCode);
  });
 
}).catch ((errCode)=> {
  HMIRuntime.Trace("Read failed, Error: " + errCode);
});
 
Zurück
Oben