WinCC Unified Meldungsfenster automatisch öffnen und schließen

KarlMeier

Level-2
Beiträge
337
Reaktionspunkte
62
Zuviel Werbung?
-> Hier kostenlos registrieren
Wieder eine Frage zur Unified Runtime…

Ich hab es nach einer Anleitung von Siemens geschafft mit Hilfe des Aufgabenplaners meine HMI-Meldungen auf „Gekommen“ zu triggern. Das heisst, immer wenn eine neue Meldung kommt, dann wird das Meldungsfenster eingeblendet.

Das Ganze funktioniert so, dass ich ein eigenes Bild mit dem eigentlichen Meldefenster erstellt hab. Dieses Bild lade ich in ein Bildfenster und mit Hilfe einer Hilfsvariable, welche vom Aufgabenplaner angetriggert wird, wird die Sichtbarkeit ein oder ausgeschaltet. Schließe ich das Bildfenster mit X, dann wird auch die Hilfsvariable zurückgesetzt. Das funktioniert einwandfrei.

Ich habe jetzt aber 2 Probleme, welche ich gerne lösen würde.

Problem 1 ist folgendes:
Kommt eine neue Meldung, so erscheint das Meldefenster. Ich schließe dieses Meldefenster, aber die Meldung steht noch an. Nun kommt eine neue zusätzliche Meldung, das Meldefenster öffnet sich wieder, hat sich aber nicht aktualisiert. Ich sehe also beim Wiederöffnen nur die alte Meldung, welche noch ansteht. Erst wenn ich über die Funktionstasten aktualisiere wird auch die aktuelle Meldung angezeigt, welche das Meldefenster wiedergeöffnet hat. Hat hier jemand eine Idee wie ich es hinbekomme, dass das Meldungsfenster automatisch neu ladet, wenn es wieder geöffnet wird?

Problem 2:
Wenn alle Meldungen gegangen sind, dann würde ich gerne das Meldefenster, sowie den Meldeindikator schließen. Beim Aufgabenplaner kann ich die Meldungen auch auf Gekommen/Gegangen abfragen. Eigentlich arbeite ich nur mit nicht quittierpflichtigen Meldungen, aber dann realisiert der Aufgabenplaner offensichtlich nicht dass die Meldung gekommen und gegangen ist. Stelle ich die Meldung auf „einfache Quittierung“ um, dann funktioniert es, aber nur wenn ich zwischen Gekommen und Gegangen nicht quittiert hab. Drücke ich zwischen Kommen und Gehen die Quittiertaste, dann funktioniert das nicht mehr. Mein plan wäre jetzt den Quittierbutton auszublenden und die Meldungen unquittiert zu lassen. Im Meldefenster werden ohnehin nur aktuelle, anstehende Meldungen angezeigt. Kann ich das so machen? Ich finde es etwas „unsauber“. Vielleicht gibt es eine elegantere Lösung?
 
Subscription auf die aktiven Alarme mit Filter auf die, welche als Fehlermeldung benutzt werden.
Dann kann man die aktiven Alarme zählen, die Anzahl in ne HMI-Variable schreiben und davon abhängig die Sichtbarkeit des Fensters/Indikators steuern.

So geht es auch ohne den Aufgabenplaner.
 
Du kannst per Alarming.CreateSubscription() eine Subscription auf das Meldesystem erstellen.
Damit kannst du clientseitig das Alarmsystem überwachen und auf Aktualisierungen mit einer Callback-Funktion reagieren.
Quasi das Gegenstück zur serverseitigen Überwachung per Aufgabenplaner.
Code-Beispiel siehe F1-Hilfe unter "AlarmSubscription.OnAlarm".

Kommt eine neue Meldung, so erscheint das Meldefenster. Ich schließe dieses Meldefenster, aber die Meldung steht noch an. Nun kommt eine neue zusätzliche Meldung, das Meldefenster öffnet sich wieder, hat sich aber nicht aktualisiert. Ich sehe also beim Wiederöffnen nur die alte Meldung, welche noch ansteht. Erst wenn ich über die Funktionstasten aktualisiere wird auch die aktuelle Meldung angezeigt, welche das Meldefenster wiedergeöffnet hat. Hat hier jemand eine Idee wie ich es hinbekomme, dass das Meldungsfenster automatisch neu ladet, wenn es wieder geöffnet wird?
Was genau hast du als AlarmSource angegeben?
Mit "Pending alarms" sollte das Meldefenster eigentlich immer die aktuell anstehenden Meldungen anzeigen.

Problem 2:
Wenn alle Meldungen gegangen sind, dann würde ich gerne das Meldefenster, sowie den Meldeindikator schließen. Beim Aufgabenplaner kann ich die Meldungen auch auf Gekommen/Gegangen abfragen. Eigentlich arbeite ich nur mit nicht quittierpflichtigen Meldungen, aber dann realisiert der Aufgabenplaner offensichtlich nicht dass die Meldung gekommen und gegangen ist. Stelle ich die Meldung auf „einfache Quittierung“ um, dann funktioniert es, aber nur wenn ich zwischen Gekommen und Gegangen nicht quittiert hab. Drücke ich zwischen Kommen und Gehen die Quittiertaste, dann funktioniert das nicht mehr. Mein plan wäre jetzt den Quittierbutton auszublenden und die Meldungen unquittiert zu lassen. Im Meldefenster werden ohnehin nur aktuelle, anstehende Meldungen angezeigt. Kann ich das so machen? Ich finde es etwas „unsauber“. Vielleicht gibt es eine elegantere Lösung?
Hast du mal versucht auf "alarm state = normal" abzufragen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du dafür auch ein genaues Beispiel oder eine Beschreibung wie das geht?
Mir sagt es jetzt auf Anhieb gar nichts…
Ich bin mir recht sicher, dass ich die Lösung von einer Siemens-Seite habe, aber die hab ich jetzt auch nicht mehr gefunden.

Disclaimer: Das ist das erste Projekt, dass ich mit Unified mache.

Kontext:
Ich habe im HMI eine Hauptseite mit Header, Footer und einem Bildfenster in dem ich dann den tatsächlichen Inhalt der Seite anzeige. Diese Hauptseite ist also immer angezeigt (Ausnahme: Vollbild Schalt-/Pneumatikpläne im PDF-Viewer, weil nur MTP700).

Ich zieh mir sowohl Warnungen als auch Fehler raus.
Die Variablen activeErrors und activeWarnings sind interne HMI-Variablen.

In das Aufgebaut-Ereignis der Hauptseite kommt bei den Globalen Definitionen:
Code:
let subAlarms;
Dann in das Ereignis selbst:
Code:
//Get number of active errors/warnings to display Error-/Warning-window/-button
  try {
    //Subscribe to changes of alarms with classname 'CustomWarning' | 'CustomError'
    subAlarms = HMIRuntime.Alarming.CreateSubscription();
    subAlarms.Filter = "AlarmClassName = 'CustomWarning' OR AlarmClassName = 'CustomError'";
    subAlarms.Language = HMIRuntime.Language;
 
    subAlarms.OnAlarm = (errorCode,systemName,alarmResultArray) =>{
      try {
        //When an alarm changes state: Get all active alarms (returns ALL alarms, not filtered)
        let activeAlarms = HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language).then((alarms)=>{
          let activeWarnings = 0;
          let activeErrors = 0;
          //Check all active alarms for correct AlarmClassName and count them
          for (let index = 0; index < alarms.length; index++) {
            HMIRuntime.Trace("AlarmClassName_" + (index + 1) + "=" + alarms[index].AlarmClassName + " ###");
            if (alarms[index].AlarmClassName == 'CustomWarning')
              activeWarnings++;
            if (alarms[index].AlarmClassName == 'CustomError')
              activeErrors++;
          }
          Tags("ActiveWarnings").Write(activeWarnings);
          HMIRuntime.Trace("Current active warnings: " + activeWarnings + " ###");
          Tags("ActiveErrors").Write(activeErrors);
          HMIRuntime.Trace("Current active errors: " + activeErrors + " ###");
        }).catch((err)=>{
          HMIRuntime.Trace("Error during GetActiveAlarms() -> likely no active alarms, check error: " + err + "\n" +
            HMIRuntime.GetDetailedErrorDescription(err));
        });
      } catch (ex) {
          HMIRuntime.Trace("Alarm subscription: "+ ex , HMIRuntime.Trace.Enums.hmiSeverity.Info);
      }
    }
    subAlarms.Start();
    HMIRuntime.Trace("Setting up alarm subscription OK" + " ###", HMIRuntime.Trace.Enums.hmiSeverity.Info);
  } catch (ex) {
    HMIRuntime.Trace("Setting up alarm subscription NOK: "+ ex , HMIRuntime.Trace.Enums.hmiSeverity.Info);
  }

Ich benutze eigene Meldeklassen "CustomWarning"/"CustomError", weil ich das bei "altem" WinCC so gemacht habe. Mittlerweile sollte ich wahrscheinlich eine der existierenden benutzen, man hat ja jetzt mehr Auswahl als vorher. Aber das Prinzip vom Code bleibt ja gleich.

Auf der Hauptseite habe ich dann 2 Meldefenster (einmal Fehler, einmal Warnungen) und im Footer 2 Buttons, um 2 weitere HMI-Booleans umzuschalten (ShowWarningWindow + HideErrorWindow). Die Footer-Buttons werden nur angezeigt, wenn ActiveWarnings/-Errors > 0 sind.

Das Warnungs-Fenster hat bei der Sichtbarkeit die Formel:
Code:
('ActiveWarnings' > 0) AND ( 'ShowWarningWindow' )

Bei dem Fehler-Fenster benutze ich für die Sichtbarkeit die Formel:
Code:
('ActiveErrors' > 0) AND NOT ( 'HideErrorWindow' )

Für das Fehlerfenster hab ich dann doch den Aufgabenplaner benutzt. Ich trigger auf die Wertänderung von ActiveErrors:
Code:
  if(Tags("ActiveErrors").Read() == 0)
    Tags("HideErrorWindow").Write(false);
Das stellt sicher, dass das Fehler-Fenster von alleine wieder angezeigt wird, wenn ein neuer Fehler auftritt.


Endresultat:
Wenn ich mindestens eine aktive Warnung habe, zeigt mein Footer einen Button um das Warnungs-Meldefenster auf- und zuklappen zu können.
Wenn ich mindestens einen aktiven Fehler habe, öffnet sich das Fehler-Meldefenster von alleine, kann aber über den erscheinenden Button im Footer wieder eingeklappt werden. Der Fehler muss aber über ACK separat quittiert werden.
 
Vielen Dank für die ausführliche Beschreibung!

Ich hab es jetzt nochmal etwas anders gelöst als eingangs beschrieben. Meine Lösung ist so ähnlich wie deine und funktioniert bei mir erstmal einwandfrei.

Ich hab die Meldungsüberwachung beim Aufgabenplaner gelöscht und frage stattdessen zyklisch (1s) die Anzahl der Fehlermeldungen, sowie gesondert die Hinweismeldungenab. Das mache ich auch über den Aufgabenplaner und schreibe dann in zwei HMI-Variablen (int) die Zahl der anstehenden Fehler und Meldungen. Mit einer dritten zyklisch aufgerufenen Aufgabe überwache ich ob ein Fehler oder Hinweis anliegt und blende dann das Meldefenster ein oder aus.
Ich kann das Meldefenster auch manuell über das X schließen, dann wird eine HMI-Variable gesetzt, welche ein wiederöffnen des Fensters ohne neue Meldung unterbindet. Stattdessen bleiben auf meinem Hauptbild zwei Indikatoren für Fehler und für Hinweis, mit der Anzahl der anliegenden Meldungen sichtbar. Das wird automatisch ausgeblendet wenn die Meldungen verschwunden sind und dann wird auch alles zurückgesetzt.

Paar feine Anpassungen muss ich noch vornehmen, aber so gefällt es mir erstmal ganz gut und finde es auch noch halbwegs übersichtlich.

Allerdings habe ich nach wie vor das Problem mit der Meldungsaktualisierung. Wenn ein Fehler kommt öffnet sich das Fenster, ich schließe es wieder mit dem X. Anschließend kommt ein neuer, zusätzlicher Fehler, das Fenster öffnet sich wieder, aber es steht nur die letzte Meldung drin, welche ich vorher schon weggedrückt hab. In meinem Meldeindikator stehen allerdings 2 anstehende Meldungen. Erst wenn ich im Meldefenster auf „Meldearchiv“ umschalte und dann wieder zurück auf „Aktuelle Meldungen“ aktualisiert sich das Ganze und ich sehe alle Meldungen. Hat da jemand eine Idee???
 
Zurück
Oben