Erweiterte Programmierung


Alarme in iPlus, sind im Grunde genommen Meldungen vom Typ "gip.core.datamodel.Msg" die im Netzwerk verteilt, angeschaut, quittiert und in der Datenbank archiviert werden. Diese Funktionalität ist in der Klasse PAClassAlarmingBase implementiert, die von ACComponent abgeleitet ist:

 

Wenn Sie eine eigene Klasse mit Alarmfunktionalität benötigen, müssen Sie entweder direkt von PAClassAlarmingBase ableiten oder von irgend einer anderen Klasse die indirekt von PAClassAlarmingBase erbt. 

Das im ersten Kapitel erklärte "Kompositionsprinzip" führt zu rekursiven Baumstrukturen, den sogenannten Anwendungsbäumen. Enthalten Anwendungsbäume Instanzen die alarmfähig sind (also Ableitungen von PAClassAlarmingBase) so ist deren Alarmverhalten automatisch hierarchisch. Das bedeutet, wenn eine Kind-Instanz (in beliebiger Baumtiefe) einen Alarm generiert, so ist dieser auch entlang der Elternbeziehung (nach oben) sichtbar und für den Endanwender auch quittierbar. Umgekehrt bedeutet dies, dass eine Alarmquittierung bei einer Instanz auf höherem Niveau zur Folge hat, dass alle "Unteralarme" automatisch mit quittiert werden können.

Alarme-Ereignisse können mittels Messenger-Instanzen abgegriffen, verarbeitet und das Verarbeitungsergebnis weitergeleitet werden. Die Konfiguration, welche Alarme berücksichtigt werden sollen erfolgt mittels Alarm-Konfigurator.


Alarmabfrage

Die Methode GetAlarms() dient zur Abfrage von Alarmen:

[ACMethodInfo("Alarms", "en{'GetAlarms'}de{'GetAlarms'}", 9999)]
public virtual MsgList GetAlarms(bool thisAlarms, bool subAlarms, bool onlyUnackAlarms)

Sie gibt eine Liste von Msg-Objekten zurück. Die drei boolschen Übergabeparameter dienen zu Filterung. Diese Methode ist netzwerkfähig und kann von Proxy-Seite aus aufgerufen werden. Beispielweise verwendet der Steuerungsdialog die Klasse VBBSOControlPA, die wiederum diese Methode aufruft, um die Alarme der selektierten Komponente anzuzeigen.

 

Quittierungsmethoden

  • void AcknowledgeAlarms() quiitiert nur die Alarme von der Instanz selbst.
  • void AcknowledgeSubAlarms() quittiert nur die Alarme von allen Kind-Instanzen.
  • void AcknowledgeAllAlarms() quittiert alle Alarme von der Instanz selbst und allen Kind-Instanzen.

Alarme werden als Msg-Objekt in einer internen Dictionary<string,Msg> gespeichert. Bei Alarm-Quittierungen wird der Eintrag wieder entfernt.

Der Schlüsselwert dieser Dictionary ist ein Eigenschaftsname von einer beliebigen Netzwerkfähigen Eigenschaft, die der Klasse angehört. Das bedeutet, dass Sie für jede Eigenschaft eine separate Alarmmeldung aktivieren können.

In der Regel wird eine zusätzliche Eigenschaft vom Typ enum gip.core.autocomponent.PANotifyState deklariert. Diese Eigenschaft dient nicht nur als Namens-Index für die interne Alarm-Dictionary, sondern auch für die Signalisierung des Vorhandenseins eines Alarms auf der Benutzeroberfläche. D.h. Ein WPF-Steuerelement wird per WPF-Databinding an diese Alarmeigenschaft gebunden.

Falls Sie für eine Instanz mehrere Alarme gleichzeitig anzeigen wollen, benötigen Sie mehrere Alarmeigenschaften. Ansonsten wird mit jedem neuen Alarm der vorherige Alarm aus der Alarm-Dictionary ersetzt. Somit kann immer nur die letzte Meldung angezeigt werden.

Im folgenden Beispiel wurde eine solche Alarmeigenschaft definiert:

 

Die Id, die Sie der Msg-Instanz übergeben, damit ein übersetzter Text angezeigt wird erhalten Sie indem Sie in der Entwicklungsumgebung einen Alarm bei Ihrer Klasse hinzufügen:

 

Mit der Methode OnNewAlarmOccurred() fügen Sie einen neuen Eintrag in die Alarmliste hinzu. Falls bereits ein unquittierter Alarm mit demselben Meldungstext vorhanden ist, wird kein neuer Eintrag erstellt. Falls der Meldungstext unterschiedlich ist, dann wird die vorhandene quittiert durch die neue Meldung ersetzt. 

Wenn Sie die Alarmmeldung auch in das Logfile schreiben möchten,  dann rufen Sie vorher die Methode IsAlarmActive() auf um zu prüfen, ob dieselbe Meldung noch ansteht. Damit verhindern Sie die unnötige und mehrfache Ausgabe derselben Meldung in das Logfile.

Den Wert der Alarmeigenschaft müssen Sie explizit selbst setzen und rücksetzen, damit das gebundene WPF-Steuerelement das Vorhandensein des Alarms anzeigt. Das Rücksetzen machen Sie in der überschriebenen Methode AcknowledgeAlarms(). Vergessen Sie nicht base.AcknowledgeAlarms() aufzurufen! Ansonsten verhindern Sie die Quittierung von Alarmen.

Mit AcknowledgeAlarms() werden alle Meldungen die zu dieser ACComponent-Instanz gehören quittiert. Mit OnAlarmDisappeared() können Sie gezielt eine bestimmte Alarmmeldung quittieren und die anderen bleiben dabei unberührt. 

Ein Alarm wird in der Statusleiste als blinkendes Warndreieck angezeigt. Per Doppelklick öffnen Sie die Alarmliste und können dann zu der Komponente navigieren das den Alarm ausgelöst hat - vorausgesetzt Sie haben es in der Visualisierung auch hinzugefügt.

Den Alarm können Sei alternativ auch per Kontextmenü quittieren.

Den Beispielcode können sie hier auf gitHub entnehmen.