Beispiel für das Einfügen einer benutzerdefinierten Spalte
Dieses Kapitel beschreibt, wie Sie eine benutzerdefinierte Spalte zu dem Alarm- und Ereignisschirm hinzufügen und wie Sie eine DLL, die einen Wert in der benutzerdefinierten Spalte anzeigt, implementieren.
In diesem Beispiel werden die Inhalte der Spalten "Richtung" und "Quittierungszustand" kombiniert. Die benutzerdefinierte Spalte soll den Text "Alarm aktiv - nicht quittiert", "Alarm aktiv - quittiert" usw. zeigen.
Um die Spalte hinzuzufügen, gehen Sie wie folgt vor:
- Installieren Sie zuerst die WinCC OA API, falls die noch nicht installiert wurde (siehe API-Installation).
- Kompilieren Sie die <wincc_oa_path>/api/SampleTabUtil.cxx (siehe Implementierung unterhalb) und <wincc_oa_path>/api/
SampleTabUtil.hxx um eine DLL zu erstellen.
Anmerkung: Für das nachfolgende Beispiel wird eine Katalog Datei "MYAES.cat" benötigt. Diese Datei mit entsprechenden Beispieleinträgen befindet sich unter <wincc_oa_path>/api/SampleTabUtil und muss in das /msg Verzeichnis des Projektes kopiert werden.
- Implementieren Sie die Funktion in der
SampleTabUtil.cxx
, welche die zwei Funktionen verbindet. Die Funktion erwartet die folgenden zwei Argumente:
_ack_state = Quittierungszustand einer Meldung
und
_direction = Melderichtung. Der folgende Code zeigt die implementierte Funktion:
TABUTIL_EXPORT int tabUtilTranslateDirection( const DynVar &in, DynVar &out)
// Argumente, die an die Funktion weitergegeben werden
//Rückgabewert der Funktion
{
//Lokale Daten
IntegerVar *pAckStateValue; //Das erste Argument ist _ack_state
BitVar *pDirectionBit; //Das zweite Argument ist _direction
int t; /* Zähler, der die, an diese Funktion weitergegebenen Argumente durchgeht */
char szBuffer[ 100 ]; //Buffer, der die Antwort formatiert
CharString strActive; /* Der Text, der angezeigt wird wenn ein Element aktiv/inaktiv ist */
CharString strAcked; /* Der Text, der angezeigt wird wenn ein Element quittiert wird */
bool bFound;
//Es werden 2 gültige Werte erwartet
/* Versichern, dass gültige Zeiger mit gültigem Datentyp zurückgegeben werden */
for( t=1; t <= 2; t++)
{
if( !in[t] ) //beenden wenn es keinen gültigen Pointer gibt
return -1;
if( in[t]->isA() != ANYTYPE_VAR ) /* Alle Argumente sollten ANYTYPE_VAR sein */
return -1; //nur beenden
}
/* Konvertiere das erste Argument in ein INTEGER_VAR. Das wird _ack_state sein */
if( ((AnyTypeVar *)in[1])->getVar()->convert( INTEGER_VAR, (Variable *&) pAckStateValue ) != Variable::OK )
{
return -1;
}
/* Konvertiere das zweite Argument in ein BIT_VAR. Dies ist die "KAM" oder "GING"-Richtung */
if( ((AnyTypeVar *)in[2])->getVar()->convert( BIT_VAR, (Variable *&) pDirectionBit ) != Variable::OK )
{
/* Wenn die Konvertierung scheitert,müssen die vorher belegte Argumente gelöscht werden */
delete pAckStateValue;
return -1;
}
/* der richtige Text wird für "Aktiv/Inaktiv" und "Quittiert/Unquittiert" benötigt */
strActive = StrUtil::catgets("MYAES",(PVSSshort)*pDirectionBit ? "Aktiv" : "Inaktiv", bFound );
if( !bFound )
strActive = "Catalogue file ?";
strAcked = StrUtil::catgets("MYAES",(PVSSshort)*pAckStateValue ? "Quittiert" : "Unquittiert", bFound );
if( !bFound )
strAcked = "Catalogue file ?";
/* Formatiere den aktuellen String, den wir im Alarm- und Ereignisschirm sehen wollen */
sprintf( szBuffer, "%s - %s",(const char *)strActive, (const char *) strAcked );
//Belege den String, der zurückgegeben wird
out.append( new AnyTypeVar (new TextVar( szBuffer )));
//Befreie beliebige belegte Variablen.
delete pDirectionBit;
delete pAckStateValue;
return 1;
}
Der fett gedruckte Codeteil zeigt wie die zwei Argumente verbunden werden und in einem String zurückgegeben werden.
- Kopieren Sie SampleTabUtil.cxx and <wincc_oa_path>/api/ SampleTabUtil.hxx in Ihr Projekt <project-path>/bin.
- Eine benutzerdefinierte Spalte muss erstellt werden. Die Spalte ruft z.B. die Funktion “tabUtilTranslateDirection”, die in der DLL dargestellt wird.
- Registrieren Sie die DLL-Funktion (C++). Öffnen Sie die Tabellenkonfiguration des Alarm- und Alarmschirms über System Management -> AE Zeile/Schirm. Öffnen Sie hier die Alarme-Registerkarte und drücken Sie die Funktionen konfigurieren-Schaltfläche. Geben Sie hier den Funktionsnamen "tabUtilTranslateDirection" ein. Wählen Sie die Argumente "_alert_hdl.._ack_state" und "_alert_hdl..._direction" für die Funktion über die "..."-Schaltfläche.
- Fügen Sie eine neue Spalte über die Schaltfläche ein. Doppelklicken Sie auf die neue Spalte. Das Panel Spaltenkonfiguration wird geöffnet.
Selektieren API Funktionen und Ihre Funktion tabUtilTranslateDirection aus der Combobox. Selektieren Sie doAcknowledge aus der Auf Klick()-Combobox. Das bedeutet, dass ein Alarm über Klick auf die Spalte quittiert wird.
- Erstellen Sie eine neue KonfigurationMyAES über System Management -> Einstellungen -> AE Zeile/Schirm da die Standardkonfiguration nicht des Alarm- und Ereignisschirms nicht konfiguriert werden soll.
- Die neue Konfiguration erstellen Sie über die Neue Konfiguration-Schaltfläche auf der Registerkarte Allgemeine Einstellungen:
- Setzen Sie die MyAES-Konfiguration als default und klicken Sie Konfiguration abspeichern.
- Wählen Sie die Checkbox Aktiv für die untere Tabelle ab da das AES-Panel nur Alarme anzeigen sollte.
- Klicken Sie auf die "Eigenschaften der oberen Tabelle"-Schaltfläche um neue Eigenschaften zu definieren. Im Eigenschaften-Panel klicken Sie die Eigenschaft neu anlegen-Schaltfläche und definieren Sie einen Namen für Ihre Eigenschaften.
- Setzen Sie die Spalte sichtbar über die Sichtbarkeit-Registerkarte des Eigenschaftenpanels:
- Speichern Sie die Eigenschaften über die Eigenschaft speichern-Schaltfläche (siehe Abbildung oberhalb.
- Öffnen Sie den Alarmschirm über System Management ->Diagnostik -> Alarmschirm.
- Generieren Sie einen Alarm. Der Quittierungszustand und Melderichtung werden in der neuen Spalte angezeigt.