WinCC Unified Alarmquittierung mit externem Taster

Hallo Norbert,

wenn du die Meldungsverwaltung auf deiner Steuerung machts, also durch einen Resettaster die Bits auf 0 gesetzt werden, dann musst du im Panel eine neue Meldeklasse anlegen z.B. "Störung". Hier wählst du aus "Meldung ohne Quittierung".
Die Störmeldungen dann dieser Klasse zuordnen.

Wenn du jetzt quittierst und die Störung nicht mehr ansteht wird sie aus dem Panel gelöscht.

Gruß Whitefox
 
JA, da war ich wohl etwas schluderig:

WinCC Unified V19, MTP1200, Bitmeldeverfahren.
Das funktioniert ja auch alles soweit, nur möchte der Kunde nicht die Mini-Taste in der Alarmanzeige drücken, sondern den HW-Taster
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es denn keine einfache Funktion, in der der externe Taster, die Funktion des Buttons "Sichtbare Alarme quittieren" in der Alarmanzeige, sozusagen parallel ausführen kann?
Die Meldungen sollen schon quittierpflicjhtig bleiben und auch in der Alarmanzeige quittiert werden können, aber zusätzlich halt auch mit dem externen Taster :(
 
Hat jemand hiermit Erfahrung, bzw funktioniert das:
Pfad Bildobjekt müsste dann das Fenster mit der Meldeanzeige sein, oder?
1756893226667.png
 
Ich hätte den Hardware Eingang einfach einer Variablen zugewiesen und über diese Variable dann im HMI die Quittierung geregelt. Das HMI kann ja dann auch die gleiche Variable ansteuern. Das sollte über den Punkt im Bild gehen. Einfach die Quittiervariable überall eintragen.
1756893701409.png
(Ich habe das in der Praxis noch nie ausprobiert, nehmt es mit Salz!)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jemand hiermit Erfahrung, bzw funktioniert das:
Pfad Bildobjekt müsste dann das Fenster mit der Meldeanzeige sein, oder?
Jup, das quittiert aber NUR alle aktuell angezeigten Alarme.
Ist die Meldeanzeige nicht sichtbar passiert (überraschung) nichts.
Zudem musst du eine Subscription auf die SPS-Triggervariable im Scriptkontet der HMI-Bilder erzeugen, wenn diese Aktion bei Wertänderung der Variable ausgelöst werden soll.

Ich hätte den Hardware Eingang einfach einer Variablen zugewiesen und über diese Variable dann im HMI die Quittierung geregelt. Das HMI kann ja dann auch die gleiche Variable ansteuern. Das sollte über den Punkt im Bild gehen. Einfach die Quittiervariable überall eintragen.
1756893701409.png

(Ich habe das in der Praxis noch nie ausprobiert, nehmt es mit Salz!)
Das funktioniert bestens, quittiert aber ALLE anstehenden Alarme sobald die betreffenden Quittierbits auf TRUE gesetzt werden (also unabhängig von der Sichtbarkeit/Anzeige).
Damit riskierst du z.B. einen quitierpflichtigen Alarm mit Zustand "Gekommen/Gegangen" gar nicht erst zu bemerken.
Ob das relevant ist, muss jeder für seine Anwendung selbst entscheiden ¯\_(ツ)_/¯
 
Die Meldungen sollen schon quittierpflicjhtig bleiben und auch in der Alarmanzeige quittiert werden können, aber zusätzlich halt auch mit dem externen Taster :(
Was macht es für einen Sinn, einen Taster anzubauen, mit dem alle "quittierpflichtigen" Meldungen am Stück "quittiert" werden können, und man dazu keine einzige Meldung sehen/lesen muss?
Wenn schon ein Hardware-Taster zur Schonung des Touchbildschirms, dann dürfte der nur die aktuell markierte Meldung löschen. Doch da bekommt man bei Unified Panels zusätzlich das Problem, dass dazu der Benutzer-Kontext beachtet werden muss.
 
Die Anfrage ist bei uns allerdings schon öfter gekommen mit quittierungen der angezeigten, aber nicht mehr anstehenden Meldungen per Taster. Da geht es hauptsächlich um die Bedienbarkeit mit Handschuhen, Dreck auf dem HMI usw. etc. Bei uns stehen anstehende bzw noch nicht quittierte Meldungen direkt auf dem HMI. Dafür muss keine Seite gewechselt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was macht es für einen Sinn, einen Taster anzubauen, mit dem alle "quittierpflichtigen" Meldungen am Stück "quittiert" werden können, und man dazu keine einzige Meldung sehen/lesen muss?
Wenn schon ein Hardware-Taster zur Schonung des Touchbildschirms, dann dürfte der nur die aktuell markierte Meldung löschen. Doch da bekommt man bei Unified Panels zusätzlich das Problem, dass dazu der Benutzer-Kontext beachtet werden muss.
Bei uns ist es so, dass die Störmeldung erst angesehen wird, wenn nach dem dritten Druck auf "Quittieren" oder "RESET" immer noch stehen bleibt. Die meisten unserer Anlagen reden deshalb gar nicht mit dem Bediener, sondern geben nur Störungen aus. Meldeanzeige leer = Alles OK.

Bei der neuesten Anlage habe ich dann Meldungen eingebaut, welche Hinweise geben, warum ein Automatikbetrieb nicht möglich ist. Hilft super beim debuggen, aber dennoch wurden die Instandhalter immer wieder angerufen. In der Produktion hat es erst was gebracht, als "Meldung + Startversuch = quittierpflichtige Störung" eingeführt wurde.
 
Doch da bekommt man bei Unified Panels zusätzlich das Problem, dass dazu der Benutzer-Kontext beachtet werden muss.
In dem Fall tatsächlich nicht direkt.
Die Bedienung der Meldeanzeige und darüber das Triggern der Quittierung ist Client-spezifisch.
Das Meldesystem an sich ist wieder serverseitig für alle Clients einheitlich.
Quittierst du auf einem Client, wird die betreffende Meldung auch bei allen anderen Clients auf "quittiert" gesetzt.

Wenn ich grade so drüber nachdenke ist es vllt. möglich über den Aufgabenplaner direkt auf die Alarmobjekte zuzugreifen...
So aktualisiere ich z.B. den Zähler meines Meldeindikators.
Also Aufgabe mit Variablentrigger => Quittierscript auslösen.

Für das Durchzählen der Alarme benutze ich folgendes Script:
Javascript:
export async function UpdatePendingAlarmsInfo(errorCode, systemName, alarmResultArray, state) {
    /*
    Dieses Script ist für den Aufruf im Aufgabenplaner gedacht.
    Für jeden Meldungszustand muss eine eigene Aufgabe angelegt werden.
    Darüber erfolgt dann die Unterscheidung welches Ereignis in den Alarmen aufgetreten ist.

    Das von der Aufgabe generierte "alarmResultArray" enthält nur die geänderten Meldungen, während GetActiveAlarms() alle aktiven Alarme ausgibt.
     */

    //"Enumeration" zur Unterscheidung des Triggerevents im Aufgabenplaner
    const stateG = 1; //Meldung_Gekommen
    const stateGQ = 2; //Meldung_GekommenQuittiert
    const stateGG = 3; //Meldung_GekommenGegangen
    const stateGQG = 4; //Meldung_GekommenQuittiertGegangen
    const stateGGQ = 5; //Meldung_GekommenGegangenQuittiert
    const stateSYS = 6; //Meldung_SystembedingtEntfernt
    const stateN = 7; //Meldung_Normal
    //Sonstige Variablen
    let countOfpendingAlarms = -1;

    try {
        const currentLCID = 127; //127 = invariant culture, da im Aufgabenplaner ein Zugriff auf die localMachine nicht möglich ist.
        let promiseGetActiveAlarms = HMIRuntime.Alarming.GetActiveAlarms(currentLCID)
        .then((hmiAlarmResult) => {
            //Anzahl aller anstehenden Alarme aktualisieren
            countOfpendingAlarms = hmiAlarmResult.length;
        })
        .catch((ex) => {
            countOfpendingAlarms = 0; //Wenn keine Alarme aktiv sind, wird der .catch() ausgelöst
            HMIRuntime.Trace("SystemName: " + systemName + "\n" +
                "Parameter errorCode: " + errorCode + "\n" +
                "Fehler bei GetActiveAlarms. Promise-Handler .catch wurde ausgelöst.\n" +
                "Fehlercode: " + ex + "\n" +
                "Fehlerbeschreibung: " + HMIRuntime.GetDetailedErrorDescription(ex),
                HMIRuntime.Trace.Enums.hmiSeverity.Error);
        });
        await Promise.all([promiseGetActiveAlarms]);
        //Anzahl der gezählten Alarme ausgeben
        Tags("AlarmsCntAll").Write(countOfpendingAlarms, Tags.Enums.hmiWriteType.hmiWriteNoWait);
        //Event-Bit invertieren => kann für nachfolgende Reaktionen genutzt werden
        let hmiTagChangeEventBit = Tags("AlarmsUpdate");
        hmiTagChangeEventBit.Write(!hmiTagChangeEventBit.Read(Tags.Enums.hmiReadType.hmiReadCache), Tags.Enums.hmiWriteType.hmiWriteNoWait);
    } catch (ex) {
        HMIRuntime.Trace("SystemName: " + systemName + "\n" +
            "Parameter errorCode: " + errorCode + "\n" +
            "ALlgemeiner Fehler beim Auswerten des Ereignisses.\n" +
            "Fehler: " + ex,
            HMIRuntime.Trace.Enums.hmiSeverity.Error);
    };
}
In meinem Fall rufe ich dieses Script bei jeder Änderung eines Alarmzustandes über den Aufgabenplaner aus, etwa so:
(Die doppelte Deklaration der State-Konstanten ist nur notwendig, da ich keine globalen Enums anlegen kann)
1756904547478.png
Für jeden Meldezustand einzeln eine Aufgabe anzulegen ist für mich nur notwendig, da ich teilweise unterschiedlich auf Zustandsänderungen reagiere.
Hier beim Gekommen-Ereignis beispielsweise mit dem Zustandswechsel einer Triggervariable, die dann wiederum Client-seitig per Subscription ein Popup öffnet.

@REBSNB du könntest das "UpdatePendingAlarmsInfo"-Script etwas erweitern um, je nach Meldezustand, das Alarmobjekt über dessen Acknowledge()-Methode zu quittieren.
Damit liesen sich alle Meldungen gleichzeitig bearbeiten, ohne extra Quittierbits anlegen zu müssen.
=> Funktioniert dann auch für Meldesysteme ohne Bit-Alarm
 
Was macht es für einen Sinn, einen Taster anzubauen, mit dem alle "quittierpflichtigen" Meldungen am Stück "quittiert" werden können, und man dazu keine einzige Meldung sehen/lesen muss?
Wenn schon ein Hardware-Taster zur Schonung des Touchbildschirms, dann dürfte der nur die aktuell markierte Meldung löschen. Doch da bekommt man bei Unified Panels zusätzlich das Problem, dass dazu der Benutzer-Kontext beachtet werden muss.
Der Sinn ist der, dass der Quittiertaster 200m weiter im Leitstand ist. Die Alarme werden parallel auch über Bus zur übergeordneten Steuerung gesendet und dort angezeigt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das funktioniert bestens, quittiert aber ALLE anstehenden Alarme sobald die betreffenden Quittierbits auf TRUE gesetzt werden (also unabhängig von der Sichtbarkeit/Anzeige).
Damit riskierst du z.B. einen quitierpflichtigen Alarm mit Zustand "Gekommen/Gegangen" gar nicht erst zu bemerken.
Ob das relevant ist, muss jeder für seine Anwendung selbst entscheiden ¯\_(ツ)_/¯
Das wäre ja ok für mich, aber ich habe gar keine Spalte "HMI Quittierung" (die gab es im alten WinCC). Im WinCC Unified habe ich die Spalte "Zustandsvariablenadresse Quittierung". Wenn ich dort eine Variable hinterlege, funktioniert auch die Quittierung mit der Taste der Meldeanzeige. Wenn ich diese Adresse aber in der SPS setze, wird hier nix quittiert.
 
Das wäre ja ok für mich, aber ich habe gar keine Spalte "HMI Quittierung" (die gab es im alten WinCC). Im WinCC Unified habe ich die Spalte "Zustandsvariablenadresse Quittierung". Wenn ich dort eine Variable hinterlege, funktioniert auch die Quittierung mit der Taste der Meldeanzeige. Wenn ich diese Adresse aber in der SPS setze, wird hier nix quittiert.
Ne F1-Taste hast du aber?
Artikel "Alarmquittierung an die Steuerung senden", da wird beides haarklein erklärt (mit Bildchen).

Anpassung der sichtbaren Spalten in der Tabelle, wie in jeder Tabellenansicht von TIA, durch Rechtsklick oben rechts auf die Spaltenüberschrift.
1756984850073.png

Triggervariable:
die Auslösende Variable der Meldung
Zustandsvariable Quittierung:
Statusbit HMI => SPS ob die Meldung quittiert wurde.
Wird einmal beim Quittieren der Meldung auf TRUE geschrieben.
Wird FALSE sobald Triggervariable auf TRUE wechselt.
Quittierung Steuervariable:
Steuerbit SPS => HMI
Wechselt diese auf TRUE, wird die Meldung im HMI quittiert.
 
Danke Botimperator,
dann ist es ja doch exakt so wie im alten System. Verstehe dann nur nicht warum das Data2Unified Tool dies dann nicht so migriert. Aber es hat ja auch die Ereignisse bei "Taste drücken" migriert, obwohl es die Funktion bei dem Panel ja gar nicht mehr gibt.
Jetzt läuft es auf jeden Fall wieder so wie gewünscht.
Euch allen ein Dankeschön und schönes Wochenende.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jemand hiermit Erfahrung, bzw funktioniert das:
Pfad Bildobjekt müsste dann das Fenster mit der Meldeanzeige sein, oder?
Anhang anzeigen 90425
Wir machen das betriebsintern so, dass wir in einem globalen DB ein "Reset-Signal" haben. In den einzelnen FBs und FCs werden dann die Störungsbits gesetzt und mithilfe dieses Reset Signals auf 0 zurückgesetzt. Und an dem Reset knüpfen wir vorhandene externer HW Taster oder Buttons auf dem Panel dran, wie wir es brauchen.
 
Naja wir haben quasi für feste "Stationen" unserer Anlagen FBs und FCs und zu jeder Funktion oder Station haben wir RetVals integriert die aus einem Wort bestehen. Und in dem Initialisierungs NW der Buastein steht immer:

if firstScan or reset THEN
RetVal := 0;
END_IF;

Und wir fassen die Rückgabewerte jedes Baustein in den Stationen zusammen zum Station Error und die Stationen fassen wir dann zur Maschinen störung zusammen. So kann man wunderbar nachverfolgen, wo das herkommt.
 
Zurück
Oben