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

schwimmer

Level-3
Beiträge
1.660
Reaktionspunkte
574
Zuviel Werbung?
-> Hier kostenlos registrieren
TIA V19 Upd2 / MTP1900 (Image 19.0.0.1)
Hallo Unified-Experten,
plage mich noch immer mit dem Auslesen eines Archives als csv-File.
Ich lese das Archiv über das Snippets aus und das Ergebnis ist ziemlich verwirrend für mich.
Für meinen Versuch lese ich verschiedene Werte aus, die im 10s Takt in das Archiv geschrieben werden. Anders als bei der Comfort-Version werden nun alle Werte einer Variablen geschrieben, dann folgt die nächste Variable mit allen Messwerten, nicht wie bei den Comfortpanels alle Messwerte zum Messzeitpunkt und dann der nächste Messwert.
Zudem ist die Reihenfolge der Variablen immer unterschiedlich und hat nicht damit zu tun wie sie im Snippet aufgerufen werden.
Der TimeStamp hat einen Wert den ich nicht umrechnen kann. Lt. Doku soll mit der Formel = (< Zellenname >/60/60/24/10000000) – 109205 der Zeitstempel umgerechnet werden können, nach der Formel bekomme ich allerdings eine negative Zeitangabe.
Dazu kommt noch, es wird nicht der angegebene Zeitraum ausgelesen, sondern es stehen Werte in der *.csv die deutlich nach dem Ausleszeitraum aufgezeichnet wurden.
Hat von euch schon jemand Erfahrungen damit gesammelt und kann mir weiterhelfen? Danke schon mal vorab.
 
Ich kenne mich mit Unified nicht aus, daher wirft deine Beschreibung bei mir Fragen auf, wo ich mir allerdings vorstellen kann, dass auch ein Unified-Experte vielleicht "Bahnhof" versteht ...

plage mich noch immer mit dem Auslesen eines Archives als csv-File.
Das Archiv ist eine csv-Datei? Oder willst du ein Archiv in eine csv-Datei exportieren?

Ich lese das Archiv über das Snippets aus
Welches Snippets?

und das Ergebnis ist ziemlich verwirrend für mich.
Wie sieht so ein Archiv aus?
Wie sieht das Auslese-Ergebnis aus?

Der TimeStamp hat einen Wert den ich nicht umrechnen kann. Lt. Doku soll mit der Formel = (< Zellenname >/60/60/24/10000000) – 109205 der Zeitstempel umgerechnet werden können, nach der Formel bekomme ich allerdings eine negative Zeitangabe.
Hast du mal ein Beispiel für einen TimeStamp-Wert?

Dazu kommt noch, es wird nicht der angegebene Zeitraum ausgelesen, sondern es stehen Werte in der *.csv die deutlich nach dem Ausleszeitraum aufgezeichnet wurden.
Wieviel oder wie lange ist "deutlich nach"?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Archiv ist eine csv-Datei? Oder willst du ein Archiv in eine csv-Datei exportieren?
Das Archiv wird als *.csv auf die SD-Card exportiert
Welches Snippets?
Das sind so vorgefertigte SIEMENS-Skripte die unter Unified möglichst verwendet werden sollen

Wie sieht so ein Archiv aus?
Wie sieht das Auslese-Ergebnis aus?
Da hätte ich mich etwas präziser ausdrücken sollen.
Was mich daran verwirrt, sind die nachfolgenden Punkte, der Zeitstempel und eben die Tatsache das der Zeitraum der exportiert werden soll nicht stimmt.
Hast du mal ein Beispiel für einen TimeStamp-Wert?
17192204964108000

Wieviel oder wie lange ist "deutlich nach"?
Kann ich nicht genau sagen, da ich im Moment den Zeitstempel nicht deuten kann. Es sieht aber so aus, als würde immer bis zum Ende des Archivs exportiert werden und nicht bis zum angegebenen Zeitpunkt. Mit jedem Versuch den ich mache wird die Datei größer und es werden mehr Werte ausgelesen.
 
Dein TimeStamp-Wert macht für mich keinen Sinn.
Vielleicht postest du mal deine verwendeten Siemens-Scripte - vielleicht kann man sich da dann mehr darunter vorstellen ...
 
:rolleyes: Gibt es bei ganz Siemens nur ein einziges "Snippets"?
Nochmal: wie heißt das von dir verwendete "Snippet"? Wo hast du das her? Oder poste mal dein Skript, wie es jetzt aussieht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt zwar mehrere Snippets, aber nur eins zum Export von Archiven in ein csv-File Export tag log as CSV und das habe ich verwendet und entsprechend angepasst.
Javascript:
export function Schaltfläche_2_OnDown(item, x, y, modifiers, trigger) {
// DateiName zusammenstellen
let Anr = Tags("inteAuftragsNummer").Read(); //AuftragsNr aus HMI lesen
let StartTime = Tags("inteStartTimeStamp").Read(); //StartZeit [String] aus HMI lesen
let fileName = "/media/simatic/X51/"+ StartTime +"_"+ Anr +".csv";

//let start = new Date(Tags("inteReportArchivStart").Read());
//let end = new Date(Tags("inteReportArchivEnde").Read());
let start = new Date("2024-06-24T08:00:00Z");
let end = new Date("2024-06-240T08:10:00Z");

HMIRuntime.Trace("TraceStart" + start);
HMIRuntime.Trace("TraceEnd" + end);


let delimiter = ";";
let csvData = "Name" + delimiter + "Timestamp" + delimiter + "Value" + delimiter + "Quality\n";
let TagArray = HMIRuntime.TagLogging.CreateLoggedTagSet(["inteReportArchivStart:ArvStart","inteReportArchivEnde:ArvEnd","inteMitarbeiter:User","inteNotizen:Notizen","MTP1900_ActValueArchiv_ThermoCouple_HandMessung1:TE_HandMessung_1","MTP1900_ActValueArchiv_ThermoCouple_MessLanze:TE_Messlanze"]);


for(let LoggTag of TagArray){
HMIRuntime.Trace("Tag Name : " + LoggTag.Name);

  let tagValue = LoggTag.Read(start, end, 0);
  tagValue.then((loggedTagResult) => {
    let error = loggedTagResult.Error;
    let ResultArray = loggedTagResult.Values;

    for (let loggedTag of ResultArray){
      csvData += LoggTag.Name + delimiter + loggedTag.TimeStamp + delimiter + loggedTag.Value + delimiter + loggedTag.Quality + "\n";
      }
 
 
}).catch ((errCode)=> {
  HMIRuntime.Trace("Read failed, Error: " + errCode);
});
}
HMIRuntime.Timers.SetTimeout(()=>{
HMIRuntime.FileSystem.WriteFile(fileName, csvData, "utf8").then(
  function() {
    HMIRuntime.Trace("Write file finished successfully");
  }).catch(function(errCode) {
    HMIRuntime.Trace("Write failed, Error: " + errCode);
  });
},200);
}
 
Moin
Ist das nicht möglich, mal zu schreiben, wo du das Snippet her hast? Kann man das im SIOS downloaden oder ist das schon in WinCC Unified V19 enthalten?

Sind in deinem geposteten Script Syntax-Errors? Hast du Code weggelassen? Beim Überfliegen scheint mir, dass die Anzahl öffnender Klammern und die Anzahl schließender Klammern nicht gleich ist. Ich habe aber nicht genau gezählt. Auch die Einrückungen der schließenden Klammern sind gewöhnungsbedürftig. Auch scheint mir Code bei der Datenbankabfrage zu fehlen - ich habe allerdings gar keine Ahnung vom Java Script in WinCC Unified... Kann man der Datenbankabfrage mitgeben, dass/wie die Werte im Ergebnis-Array sortiert sein sollen?

Was bedeuten die rot markierten Zeichen in dem Code?
let start = new Date("2024-06-24T08:00:00Z");
let end = new Date("2024-06-240T08:10:00Z");

Könnte es sein, dass zumindest die Zeitangabe in der zweiten Zeile fehlerhaft und ungültig ist und deshalb mehr Werte geliefert werden als du erwartest?
Kann es sein, dass die Datenbank die Zeitangaben in UTC erwartet?

Die Timestamps sind die Anzahl Millisekunden seit 1.1.1970 0:00 Uhr UTC (also Unixzeit * 1000)
1719220496410800 = 2024-06-24 09:14:56 UTC
 
Zuletzt bearbeitet:
Diese Snippets sind im TIA für die Unified Panels hinterlegt und sollen lt. SIEMENS StyleGuide genutzt werden, da sie die beste Performance bieten, zumindest verstehe ich es so.
Es ist mein erstes Unified-Projekt und auch meine ersten Schritte mit Java und ich habe da auch nicht wirklich Ahnung. Was die Klammern und die Einrückungen betrifft, so wird das Skript oder Snippets von TIA zur Verfügung gestellt und beim anwählen eingebunden, da habe ich nichts verändert.
Für mich scheint es so, dass ab dem Startzeitpunkt ausgelesen wird, nur der Zeitpunkt end wird nicht richtig ausgewertet. Das könnte an der von dir markierten 0 im Datum liegen, denn den 240ten Tag gibt es ja nicht. Werde das gleich mal ausprobieren und euch dann ein Feedback geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
let end = new Date("2024-06-240T08:10:00Z");
Du hast ins Schwarze getroffen, die 0 bei 240T war zuviel. Ohne sie werden die Daten richtig ausgelesen. Danke schön.

Kannst du mir vielleicht auch einen Tipp geben, wie ich aus einer DTL Variablen (Eingabe vom Bediener am HMI) zu diesem Vorgabeformat für die zeit komme?
 
Vielleicht in einem Skript einfach aus der DTL-HMI-Variable in eine String-Variable kopieren oder etwas in der Art let start = new Date( Tags("inteStartTimeStamp").Read() );, um die Details kümmert sich dann Javascript?

Braucht die Datenbankabfrage überhaupt die Zeiten als String-Format? Weil dann wird man womöglich von den regionalen Einstellungen des Unified Panels abhängig. Kann man da nicht vielleicht auch besser den seriellen Zeitwert (Unixzeit * 1000) angeben?
 
Vielleicht in einem Skript einfach aus der DTL-HMI-Variable in eine String-Variable kopieren oder etwas in der Art let start = new Date( Tags("inteStartTimeStamp").Read() );, um die Details kümmert sich dann Javascript?
So hatte ich es jetzt probiert,
Javascript:
const UTC = new Date();
const Locale = new Date(UTC.getTime() - UTC.getTimezoneOffset()*60*1000);
Tags("inteReportArchivStart").Write(Locale);

die Variable inteReportArchivStart ist eine interne HMI-Variable im Format DateTime.
Wenn ich es so probiere bekomme ich allerdings nur eine leere Datei (es sind nur die SpaltenÜberschriften drin)
 
So hatte ich es jetzt probiert,
Javascript:
const UTC = new Date();
const Locale = new Date(UTC.getTime() - UTC.getTimezoneOffset()*60*1000);
Tags("inteReportArchivStart").Write(Locale);
Sollte der Offset nicht addiert werden?
Ergänzung: wie wird der Offset zurückgegeben, in Stunden oder Millisekunden?

Die getTime() Methode der Javascript-Objekt Date Instanz liefert die Zeit in Millisekunden seit 1.1.1970 0:00 UTC.
Die getTimezoneOffset() Methode liefert die Differenz zwischen UTC und Lokalzeit in Minuten, z.B. -120
Der obige Code von @schwimmer stellt eine Umrechnung von UTC zu Lokalzeit dar.
 
Die Timestamps sind die Anzahl Millisekunden seit 1.1.1970 0:00 Uhr UTC (also Unixzeit * 1000)
17192204964108000 = 2024-06-24 09:14:56 UTC
Probiere jetzt schon ewig rum, kriege aber die Umrechnung in Excel einfach nicht hin.
Ich schreibe die Lokalzeit aus der CPU ins Archiv, die 17199978922064800 Variable ist als DTL konfiguriert und es steht auch der richtige Zeitwert drin.
In Excel kommt dann 17199978922064800 an und egal welche Formel ich versuche, es kommt kein darstellbarer Zeitwert raus.
Kann mir bitte mal jemand auf die Sprünge helfen? Irgendwie bin ich zu blöd dazu. Danke
 
Zurück
Oben