WinCC Unified Meldezeile WinCC Unified

Hallo zusammen,

es ist zwar schon ne Zeitlang her dass hier etwas geschrieben wurde, aber ich habe jetzt auch das Problem mit der Meldezeile.
Ich befasse mich gerade das erstmal mit Unified Panels mit TIA V19.

Ich habe den Code von Antonio aus #15 in ein Skript gepackt, das an einem IO-Feld am Prozesswert hängt.
Das Skript wurde dementsprechend angepasst.
Code:
  var value;
  const alarmFilter = "State <> 2 AND ID < 100000";
  let subs = HMIRuntime.Alarming.CreateSubscription();
  subs.Filter = alarmFilter;
  subs.Language = HMIRuntime.Language;
  subs.OnAlarm = function(Errorcode, SystemNames, ResultSet) {
  let lastAlarm = ResultSet.length-1;
  let alarmClass= ResultSet[lastAlarm].AlarmClassName;
  let alarmTime = ResultSet[lastAlarm].RaiseTime;
  let alarmText = ResultSet[lastAlarm].EventText;

  item.ProcessValue=alarmText+" "+alarmClass;

  //Blinken ermöglichen
  if (item.ForeColor== HMIRuntime.Math.RGB(10, 10, 10, 255)) {
    if (alarmClass=="Warning") {
      item.ForeColor= HMIRuntime.Math.RGB(255, 153, 0, 255);
    }
    if (alarmClass=="Fehler") {
      item.ForeColor= HMIRuntime.Math.RGB(229, 7, 18, 255);
    }
    if (alarmClass=="Notification") {
      item.ForeColor= HMIRuntime.Math.RGB(236, 236, 236, 50);
    }   
  } else {
      item.ForeColor = HMIRuntime.Math.RGB(10, 10, 10, 255)
  }
    if(lastAlarm<1){item.ProcessValue="";}
  };
  subs.Start();
 
  return value;
Info: Warnung und Fehler sind eigene Meldeklassen ohne Quittierung.

Ich habe aber irgendwie das Problem, dass wenn nur 1 Fehlermeldung ansteht, wird diese nicht angezeigt.
Kommt eine Zweite hinzu wird diese angezeigt.
Auch bei allen weiteren Fehlermeldungen wird die Neueste immer angezeigt.
Aber sobald nur 1 Fehlermeldung angezeigt wird bleibt das IO-Feld leer.

Könnt Ihr mir da helfen? Ne bessere Methode gibt es wahrscheinlich noch nicht oder?

Grüße
 
Nein hab ich nicht. Bin bei der Skript Programmierung ganz am Anfang und hab prinzipiell keine Ahnung.
Müsste ich das ResultSet dazu in ein Textfeld ausgeben? Wenn ja, wie?
Oder kann ich mir den Inhalt anderswo anschauen?

Ich habe heute schon probiert den Skript-Debugger nach der Anleitung von Siemens anzuwerfen, allerdings wird da bei mir nichts angezeigt.
 
Ähnlich wie du den Inhalt deines IO-Feldes mit
Code:
item.ProcessValue=alarmText+" "+alarmClass;
setzt, kannst du auch testweise den Wert von ResultSet.length anzeigen lassen.

Alternativ kannst du auch ein zweites IO-Feld anlegen. Wenn du den Pfad relativ zum ersten IO-Feld angibst, kannst du dort auch den Inhalt von ResultSet.length angeben.
 
So jetzt hatte ich Zeit das zu testen.
Sehr interessant und für mich nicht ganz nachvollziehbar ist:

Ich habe jetzt "ResultSet.length" an dem "item.ProcessValue" angehängt.
Auch hier das gleiche Verhalten.
Steht 1 Fehler an wird nichts angezeigt.
Stehen mindestens 2 Fehler an wird die Fehleranzahl angezeigt.
Also 2 bei 2 Fehlern, 3 bei 3 Fehlern usw.

Für mich sieht das irgendwie so aus als würde das Skript bei 1 Fehler nicht ausgeführt werden, Sonst müsste die Länge ja immer angezeigt werden.
Also ja eigentlich auch 0 wenn kein Fehler ansteht oder?

In dem Fenster, in dem das Skript geschrieben wird, ist ja oben dieses Weckersymbol.

1707458622186.png

Da kann ich doch die Aktualisierungsrate des Skriptes einstellen.
Hier steht bei mir T1s. Versteh ich so dass jede Sekunde der Trigger für das Skript ausgelöst wird.

1707458643635.png

Oder hab ich das falsch verstanden?
 
Ok meine neueste Erkenntnis ist folgende:

Wenn ich die Zeile
Code:
if (lastAlarm < 1){item.ProcessValue = "";}
auskommentiere, dann wird mir auch 1 Fehler angezeigt.
Allerdings wird bei 0 Fehlern natürlich auch das Feld nicht geleert.

Ich weiß jetzt nicht ob die OnAlarm Funktion hier ein Problem beim Aufruf hat.
Wenn ich mir ResultSet.length ausgeben lasse und 1 Fehler ansteht wird auch 1 ausgegeben.
Nehme ich den Fehler weg müsste "length" eigentlich ja wieder auf 0 springen. Es wird dann aber mit 2 ausgegeben.

Habe ich 2 Fehler anstehend wird "length" mit 2 angegeben und setze ich die Fehler dann wieder auf 0, zeigt "length" plötzlich 4 an.
Es wird also verdoppelt. Ich weiß jetzt nicht ob das ein Anzeigefehler ist oder ein anderes Problem.

Das
Code:
if (lastAlarm < 1){item.ProcessValue = "";}
funktioniert auf jeden Fall nicht. Auch nicht mit "lastAlarm = 0" oder wenn ich "ResultSet.length < 1" abfrage.

Entweder es passiert garnix oder es wird bereits bei 1 anstehend Fehler abgelöscht.

Ich hab mir jetzt so geholfen dass ich am Anfang das Feld ablösche. Dann funktionierts im Moment.
Code:
  var value;
  const alarmFilter = "State <> 2AND ID < 100000";
  item.ProcessValue = "";
  let subs = HMIRuntime.Alarming.CreateSubscription();
  subs.Filter = alarmFilter;
  subs.Language = HMIRuntime.Language;
  subs.OnAlarm = function(Errorcode, SystemNames, ResultSet) {
    let lastAlarm = ResultSet.length-1;
    let alarmClass= ResultSet[lastAlarm].AlarmClassName;
    let alarmTime = ResultSet[lastAlarm].RaiseTime;
    let alarmText = ResultSet[lastAlarm].EventText;
 
    item.ProcessValue = Errorcode+"  ResultLength: "+ResultSet.length+"  Alarmmeldung: "+alarmText;

    /*//Blinken ermöglichen
    if (item.ForeColor== HMIRuntime.Math.RGB(10, 10, 10, 255)) {
      if (alarmClass=="Warning") {
        item.ForeColor= HMIRuntime.Math.RGB(255, 153, 0, 255);
      }
      if (alarmClass=="Fehler") {
        item.ForeColor= HMIRuntime.Math.RGB(229, 7, 18, 255);
      }
      if (alarmClass=="Notification") {
        item.ForeColor= HMIRuntime.Math.RGB(236, 236, 236, 50);
      }  
    }
    else
    {
      item.ForeColor = HMIRuntime.Math.RGB(10, 10, 10, 255)
    }*/
  };

  subs.Start();
 
  return value;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Eduard Schleich,

ich habe es so umgesetzt:

Code:
export async function Txt_Meledezeile_Text_Trigger(item) {

  // initialisation
  item.BackColor = HMIRuntime.Math.RGB(255,255,255);
  item.BorderWidth = 1;
  item.ForeColor = HMIRuntime.Math.RGB(0,0,0);
  item.BorderColor = HMIRuntime.Math.RGB(255,255,255);
  item.Text = " ";
  Tags("iAlarmIndicator").Write(0);

  const filter = "";

  HMIRuntime.Alarming.GetActiveAlarms(HMIRuntime.Language, filter)  //GetActiveAlarms reads our Alarmdata
  .then(function(ResultSet) {

    // ensure we always display the last alarm
    let index = ResultSet.length -1;
    let currentAlarm = ResultSet[index];

    // Assign alarm properties to screen object
    item.BackColor = currentAlarm.BackColor;
    item.BorderWidth = 1;
    item.ForeColor = currentAlarm.TextColor;
    item.BorderColor = currentAlarm.TextColor;
    item.Text = currentAlarm.EventText;

    Tags("iAlarmIndicator").Write(1);
  });

}

1708437188805.png
 
Zurück
Oben