Aktive Alarme in einer benutzerdefinierten Listenansicht
Systemvoraussetzungen:
- CodeGear C++Builder 2009;
- TwinCAT v2.11 B2228 oder höher;
- Die Typbibiothek der TcEventLogger.exe muss importiert werden (TCEVENTLOGGERLib_OCX.h);
Das Beispiel zeigt die aktiven Alarme in einer benutzerdefinierten C++Builder Listenansicht (TListView-Control).
Folgende Schritte müssen ausgeführt werden, um das Beispiel zu erstellen:
- Erstellen Sie eine neue VCL-Formularanwendung.
- Ziehen Sie von der Komponentenpalette die TTcEventLog und TStatusBar-ActiveX-Komponenten auf die Form.
- Implementieren Sie die Methoden: FormCreate(), FormClose(). In FormCreate() wird die Verbindung zum EventLogger konfiguriert/ hergestellt und in FormClose() getrennt;
- Implementieren Sie die Ereignisroutinen: OnNewEvent, OnResetEvent. Das Beispielprojekt unterstützt dadurch Alarme die nicht quittiert werden müssen. Um Ereignisse für quittierungspflichtige Alarme empfangen zu können müssen Sie weitere Ereignisroutinen implementieren: OnSignalEvent() und OnConfirmEvent();
- Implementieren Sie die Ereignisroutine OnShutdown(). Diese Routine wird aufgerufen wenn die Instanz des Eventloggers (z.B. beim Herunterfahren des Systems) komplett entladen wird;
- Implementieren Sie die Hilfsmethoden: AddNewEvent() und DisplayActiveAlarms(). Diese Methoden werden benutzt um die aktiven Meldungen zu lesen und in der Liste anzuzeigen;
- Implementieren Sie die Hilfsmethode: GetEventPosByID(). Diese Methode sucht in der Listenansicht nach einer bestimmten Meldung anhand der SourceId und ID und liefert beim Erfolg die Zeilennummer (itemIndex). Mit Hilfe der Zeilennummer kann die Meldung aus der Liste entfernt werden;
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "TCEVENTLOGGERLib_OCX"
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
const char ColH[6][10] = { "SrcId", "Id", "Class", "Source", "Date/Time", "Message" };
//---------------------------------------------------------------------------
// This method is called when the form is loaded
void __fastcall TForm2::FormCreate(TObject *Sender)
{
bool bRemote = true;
if (bRemote) {
TcEventLog1->ConnectKind = ckRemote;
TcEventLog1->RemoteMachineName = "172.17.60.234";
TcEventLog1->AutoConnect = true;
}
langID = 1033;// language id // initialize ListView
ListView1->ViewStyle = vsReport;
ListView1->GridLines = true;
ListView1->RowSelect = true;
// init/add column header
ListView1->Columns->Clear();
for (int i = 0; i < 6; i++)
{
TListColumn *pCol = ListView1->Columns->Add();
if (pCol)
{
pCol->Caption = ColH[i];
pCol->AutoSize = true;
}
}
long v = 0, r = 0, b = 0;
TcEventLog1->GetVersion(&v, &r, &b);
StatusBar1->SimplePanel = true;
StatusBar1->SimpleText = Format( "Machine name: \"%s\", version: %d.%d.%d", ARRAYOFCONST((TcEventLog1->RemoteMachineName, v, r, b)));
DisplayActiveAlarms();
}
//---------------------------------------------------------------------------
// Display all active alarms
void TForm2::DisplayActiveAlarms()
{
// Clear the ListView
ListView1->Items->Clear();
// Get collection of active events
ITcEnumEventsExPtr spEnumEvts = TcEventLog1->EnumActiveEventsEx();
if (spEnumEvts)
{
if (spEnumEvts->Count > 0)
{
for (long i = 0; i < spEnumEvts->Count; i++)
{
// Here we get one event from the collection
ITcEventPtr spEvent;
HRESULT hr = spEnumEvts->Item(i, &spEvent);
if (SUCCEEDED(hr))
{
// Add event to the ListView
AddNewEvent( spEvent );
}
}// for (long i = 0 ...
}// if (spEnumEvts->Count ...
}// if (SUCCEEDED(hr))
}
//---------------------------------------------------------------------------
// This method adds new event to the list
void TForm2::AddNewEvent( ITcEventPtr spEvent )
{
TListItem *pItem = ListView1->Items->Add();
if (pItem) {
// Save Id to Data property for later use
pItem->Data = (void*)spEvent->Id;
// Get event SrcId
pItem->Caption = spEvent->SrcId;
// Get event Id
pItem->SubItems->Add( spEvent->Id );
// Get event Class
pItem->SubItems->Add( spEvent->Class );
// Get source SourceName
BSTR srcName = 0;
HRESULT hr = spEvent->get_SourceName( langID, &srcName );
if (SUCCEEDED(hr)) {
pItem->SubItems->Add( srcName );
SysFreeString( srcName );
}
// Get event creation date/time
DATE dtCreated = 0;
hr = spEvent->get_Date(&dtCreated);
if (SUCCEEDED(hr)) {
pItem->SubItems->Add( FormatDateTime( L"dddd, mmmm d, yyyy ' at ' hh:mm:ss", dtCreated ) );
}
// Get the event message text
BSTR msgString = 0;
hr = spEvent->GetMsgString( langID, &msgString );
if (SUCCEEDED(hr)) {
pItem->SubItems->Add( msgString );
SysFreeString( msgString );
}
}// if (pItem) ...
}
//---------------------------------------------------------------------------
// This method returns ListView event index
// Return value: true => Success, false => event entry not found in the list
bool TForm2::GetEventPosByID( long SrcId, long Id, int &itemIndex )
{
itemIndex = 0;
TListItem *pItem;
int startIndex = 0;
do{
// search for the event in the list (by SrcId + Id)
pItem = ListView1->FindCaption(startIndex, SrcId, true, true, true );
if (pItem) {
startIndex = pItem->Index + 1;
if ( Id == (long)pItem->Data )
{
itemIndex = pItem->Index;
return true;
}
}
}while (pItem);
return false;
}
//---------------------------------------------------------------------------
// This method is called when a new alarm is issued
void __fastcall TForm2::TcEventLog1NewEvent(TObject *Sender, LPDISPATCH srcObj)
{
AddNewEvent( srcObj );
}
//---------------------------------------------------------------------------
// This method is called when a alarm is reset
void __fastcall TForm2::TcEventLog1ResetEvent(TObject *Sender, LPDISPATCH srcObj)
{
ITcEventPtr spEvent = srcObj;
int itemIndex = 0;
if( GetEventPosByID( spEvent->SrcId, spEvent->Id, itemIndex ) )
ListView1->Items->Delete(itemIndex);//removes event from the list
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
TcEventLog1->Disconnect();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::TcEventLog1Shutdown(TObject *Sender, Variant shutdownParm)
{
TcEventLog1->Disconnect();
}
Sprache / IDE | Beispielprogram auspacken |
---|---|
CodeGear C++Builder 2009 |