WinCC Unified Meldearchiv exportieren und Trace-Meldungen?

Geisterkarle

Level-2
Beiträge
135
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich experimentiere das erste mal mit einem WinCC Unified Panel herum. Genauer: MTP400 Unified Basic
Soweit so gut und muss sich mit komischen, neuen Eigenschaften herumschlagen, aber gut.
Wo ich aber gerade scheitere ist an einem Meldearchiv!

Soweit ich das sehe sind Meldearchive nur noch über USB-Stick (hier bei diesem HMI) möglich und werden als SQLite abgelegt. Ist also schwieriger so einfach extern angeschaut/ausgewertet zu werden. Aber habe das hier gefunden:
Es gibt anscheinend ein Skript, dass das macht. Aber ich bekomme nicht hin, dass ich eine csv-Datei auf meinem USB-Stick erstelle!

In dieser "Anleitung" werden etliche Dinge einfach hingeschmissen, und man darf selber herausfinden, was man eingibt.
Start/End kapiere ich immernoch nicht 100%.
LanguageID hab ich durch googeln herausfinden können, was ich für "Deutsch" eingeben muss. (1031)
loggedAlarmState hab ich irgendwo im Informationssystem gefunden, was was ist. (Beispiel mit State und Störklasse!? Interessiert wirklich wer näher das bei einem Archiv? Wie wärs mit Meldetext(EventText) und Auslösezeitpunkt(RaiseTime)?)

Mein vermutetes Problem allerdings: fileName!
"Unglaublich toll" mal wieder dieses erstelle Skript! Default steht was von
"D:\\UnifiedArchive\\"
drin. Im Kommentar oben drüber zwei Beispiele
"/home/user1/"
"C:\Users\Public\"
Und wenn ich direkt auf dem HMI mit eingestecktem USB-Stick unter external Devices gehe bekomme ich
"\media\simatic\X61\"
Was ich jetzt mal probiert habe... und
"\\media\\simatic\\X61\\"
und
"/media/simatic/X61/"

Keine der Versuche hat Erfolg gebracht!
Was muss ich hier für mein genanntes HMI eingeben?

Vielleicht würde es mir auch helfen, wenn ich diese "HMIRuntime.Trace" Meldungen anschauen könnte. Wo finde ich diese oder wie kann mir die anzeigen lassen?

Hat mir wer einen Tipp, wie ich hier Fehlersuche mache?
Danke schonmal!

grüße
 
Mahlzeit,

LanguageID hab ich durch googeln herausfinden können, was ich für "Deutsch" eingeben muss. (1031)
Alternativ wäre auch HMIRuntime.Language oder Tags("@CurrentLanguage").Read(Tags.Enums.hmiReadType.hmiReadCache); möglich.
Damit beziehst du dich auf die aktuelle Runtime-Sprache.

Aber:
Clientbezogene Variablen stehen im Aufgabenplaner nicht zur Verfügung und fürhen zu einem Script-Fehler bzw. geben einfach "0" aus.
Das steht aber leider nur sehr indirekt in der Doku.

loggedAlarmState hab ich irgendwo im Informationssystem gefunden, was was ist. (Beispiel mit State und Störklasse!? Interessiert wirklich wer näher das bei einem Archiv? Wie wärs mit Meldetext(EventText) und Auslösezeitpunkt(RaiseTime)?)
Du beziehst dich auf das Export-Snipping?
Also diese hier:
Javascript:
let fileName = "C:\\Users\\Public\\AlarmLogFile.txt";

let start = new Date("2016-11-23T00:00:00Z");
let end = new Date("2016-11-23T23:00:00Z");

let languageID = 1033;

let delimiter = ",";
let csvData = "ID" + delimiter + "AlarmClassName" + delimiter + "State\n";
let promise1 = HMIRuntime.AlarmLogging.Read(start, end, "", languageID);
promise1.then((loggedAlarmStateArray) => {
  for (let loggedAlarmState of loggedAlarmStateArray){
     csvData += loggedAlarmState.ID + delimiter + loggedAlarmState.AlarmClassName + delimiter + loggedAlarmState.State + "\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);
});

In der F1-Hilfe sindest du unter dem Eintrag für AlarmLogging.Read folgendes:
1745925007082.png
Dieser Fliegenschiss ist kein Anzeigefehler, sondern zwei eckige Klammern [].
Heißt: das ist ein Array dieses Datentyps.
Die Schriftart in der Hilfe ist diesbezüglich richtig 💩💩, muss man höllisch aufpassen ob Array oder Dreck auf dem Bildschirm.

Die Schleife
Javascript:
  for (let loggedAlarmState of loggedAlarmStateArray){
     csvData += loggedAlarmState.ID + delimiter + loggedAlarmState.AlarmClassName + delimiter + loggedAlarmState.State + "\n";
  }
läuft jedes Element des Arrays durch und weist das Element jeweils loggedAlarmState zu.
Unter Beschreibung "LoggedAlarmStateResult" Findest du alle Eigenschaften des Alarm-Objektes und kannst dir deinen String nach lust&laune zusammenstellen.

Wenn du den delimiter (das Trennzeichen) als sep=; in die erste Zeile der Datei schreibst, erkennt exel übrigens automatisch welches Trennzeichen verwendet wird.

"/home/user1/"
"C:\Users\Public\"
Das eine Ist der Pfad auf dem Panel (Linux), das andere ein Windows-Pfad (PC-Runtime).

Und wenn ich direkt auf dem HMI mit eingestecktem USB-Stick unter external Devices gehe bekomme ich
"\media\simatic\X61\"
Jup, das ist der Panel-Pfad des USBs.
Den musst du angeben wenn du den USB-Stick als Export-Ziel angeben möchtest.

Vielleicht würde es mir auch helfen, wenn ich diese "HMIRuntime.Trace" Meldungen anschauen könnte. Wo finde ich diese oder wie kann mir die anzeigen lassen?
Das ist richtig.
Gewöhn dir an ALLES mit einer try..catch Struktur + Trace auszustatten.
Ansonsten wirst du Irre bei der Fehlersuche im Scripting.
Ohne sowas wie das hier hast du am Ende sehr viel "Spaß" ;)
Code:
    try { //Initialisieren der Umgebungsvariablen
        Tags("LocVar_FaceplateContainerHeight").Write(Faceplate.Parent.Height, Tags.Enums.hmiWriteType.hmiWriteNoWait);
        Tags("LocVar_FaceplateContainerWidth").Write(Faceplate.Parent.Width, Tags.Enums.hmiWriteType.hmiWriteNoWait);
        Faceplate.Items("ioField").OutputFormat = Faceplate.Properties.InitPrmIoFieldOutputFormat;
        Tags("LocVar_StatusIconsAreVisible").Write(true, Tags.Enums.hmiWriteType.hmiWriteNoWait);
    } catch (ex) {
        HMIRuntime.Trace("Faceplate " + Faceplate.Name + " | \n" +
            "FaceplateContainere: " + Faceplate.Parent.Name + "\n" +
            "Fehler beim Initialisieren während des Aufgebaut-Ereignisses.\n" +
            "Fehler: " + ex, HMIRuntime.Trace.Enums.hmiSeverity.Error);
    };


Über den RTILTraceViewer kommst du an die Einträge, siehe Hilfe.
Da läuft erstmal der Komplette Debug-Traffic auf.
Willst du nur deine Trace-Einträge, musst du im RTILTraceViewer unter Filter => Module => ScriptHMIRuntime auswählen.
Wenn du an den Trace des Panels willst, musst du zusätzlich den Viewer an das Panel anbinden, default-mäßig zeigt der auf localhost.
Siehe https://support.industry.siemens.com/cs/document/109777593/

Die Vorgeschlagene Batch-Datei ist aber auch eher...naja.
Ich hab mir dafür ein Powershell-Script zum Verbinden meines Viewers mit dem TraceForwarder des Panels geschrieben.
Das prüft auch gleich ob die Eingabe passt und ob das Panel erreichbar ist.
Code:
# Funktion zur Prüfung auf gültige IP-Adresse
function Is-ValidIPAddress {
    param ([string]$ipAddress)
    return [System.Net.IPAddress]::TryParse($ipAddress, [ref]$null)
}

function Is-ValidIPAddressRegex {
    param ([string]$ipAddress)
    # Regulärer Ausdruck für IPv4-Adressen
    $regex = '^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$'

    return $ipAddress -match $regex
}

# Funktion zur Abfrage einer gültigen und erreichbaren IP-Adresse
function Get-ReachableIPAddress {
    do {
        $ip = Read-Host "Bitte eine gueltige IP-Adresse eingeben"

        if (-not (Is-ValidIPAddressRegex -ipAddress $ip)) {
            Write-Host "Ungueltige IP-Adresse. Bitte erneut versuchen." -ForegroundColor Red
            continue
        }

        if (-not (Test-Connection $ip -Count 2 -Quiet)) {
            Write-Host "IP-Adresse $ip ist nicht erreichbar. Bitte erneut versuchen." -ForegroundColor Red
            continue
        }

        return $ip
    } while ($true)
}

# Hauptablauf
$ipAddress = Get-ReachableIPAddress
Write-Host "IP-Adresse $ipAddress ist gueltig und erreichbar." -ForegroundColor Green

# Optionaler Start von RTILtraceViewer
$antwort = Read-Host "Moechten Sie RTILtraceViewer starten? (ja/nein)"
if ($antwort -match '^(ja|j)$') {
    $programm1 = "C:\Program Files\Siemens\Automation\WinCCUnified\bin\RTILtraceViewer.exe"
    if (Test-Path $programm1) {
        Start-Process -FilePath $programm1
        Write-Host "RTILtraceViewer wurde gestartet: $programm1" -ForegroundColor Green
    } else {
        Write-Host "RTILtraceViewer nicht gefunden: $programm1" -ForegroundColor Red
        read-Host -Prompt "Press any key to continue"
    }
} else {
    Write-Host "RTILtraceViewer wurde nicht gestartet." -ForegroundColor Yellow
}

# Start von RTILtraceTool
$programm2 = "C:\Program Files\Siemens\Automation\WinCCUnified\bin\RTILtraceTool.exe"
if (Test-Path $programm2) {
    Start-Process -FilePath $programm2 -ArgumentList  "-mode receiver -host $ipAddress -tcp"
    Write-Host "RTILtraceTool wurde gestartet: $programm2" -ForegroundColor Green
} else {
    Write-Host "RTILtraceTool nicht gefunden: $programm2" -ForegroundColor Red
    read-Host -Prompt "Press any key to exit"
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für diese ausführliche Antwort!

Mit Hilfe der Traces bin ich tatsächlich auf das Problem gestoßen! Oder zwei.
Zuerst hab ich mir selber ein Bein gestellt. Dieser Syntaxtest scheint absolut sinnfrei zu sein; denn ich hatte irgendwie nen schlechtes C+P gemacht und nen einfachen Text mittendrin gehabt und ich nicht gesehen und dann hat er nen Fehler geschmissen damit.

Desweiteren musste ich tatsächlich meinen Pfad anpassen (Write failed, Error: 2156935121). Falls es jemand interessiert bzw. mal hier ne Suche macht und das hier findet:
Code:
/media/simatic/X61/
So muss der Pfad zum USB-Stick (an Port 1) aussehen auf einem MTP400!

Ansonsten stelle ich fest, dass es nicht so einfach ist, vernünftiges Zeitstempel-Datum zu bekommen... muss ich mal noch etwas mit dieser Unix(?)zeit herumbasteln!

Danke erstmal!
 
Ansonsten stelle ich fest, dass es nicht so einfach ist, vernünftiges Zeitstempel-Datum zu bekommen... muss ich mal noch etwas mit dieser Unix(?)zeit herumbasteln!
Alle Datum/Zeit Geschichten werden in Unified intern in ein Javascript Date-Objekt gewandelt.
Damit stehen dann alle Eigenschaften und Methoden dieses Objekts zur Verfügung.
Siehe:
https://www.w3schools.com/jsref/jsref_obj_date.asp
ChatGPT & co kommen sehr gut mit Fragen zu Javascript Basteleien klar, falls du keine Lust hast selber die Doku zu lesen ;)

Gleiches gilt übrigens auch für alle anderen Objekte, also z.B. Strings & Arrays.
Das wird in der TIA Hilfe nicht extra ausgeführt was das ECMAScript von Haus aus mitbringt.
 
Zurück
Oben