Erweiterte Programmierung


Wie Sie bereits gelernt haben sind die Eigenschaften von ACComponent Klassen die IACPropertyBase implementieren. IACPropertyBase besitzt die Eigenschaft PropertyLogListInfo LiveLog. PropertyLogListInfo wiederum ist eine Eigenschaft, die eine Serie von Eigenschaftswerten speichern kann.

Sobald Sie das erste Mal auf LiveLog zugreifen, wird automatisch ein Eigenschaftsprotokollierungsmechanismus in Gang gesetzt. Jedes Mal, wenn sich der Eigenschaftswert ändert, wird der neue Wert in einen Ringpuffer geschrieben. Auf die Werte dieses Ringpuffers greifen Sie per Eigenschaft LiveLogList zu. Die Standardkapazität des Ringpuffers beträgt 500 Werte. Sie können allerdings diesen Wert in der iPlus-Entwicklungsumgebung im Feld "Größe des Log-Puffers" ändern:

 

Die gespeicherten Werte im Ringpuffer sind vom Typ PropertyLogItem.

public class PropertyLogItem
{
  public DateTime Time { get; set; }
  public object Value { get; set; }
}

Die LiveLogList-Eigenschaft ist vom Typ PropertyLogRing:

public class PropertyLogRing : PropertyLogRing<PropertyLogItem>
{
public PropertyLogRing() : this(500) { }
}

Der Ringpuffer implementiert das Interface INotifyCollectionChanged, damit Wertänderungen anderen Klassen per Event mitgeteilt werden können:

public class PropertyLogRing<T> : INotifyCollectionChanged, IList<T>
{
}

Das Steuerelement VBChartControl ist beispielsweise solch eine Klasse, die auf Wertänderungen reagiert und die protokollierten Werte auf der GUI als Liniendiagramm darstellt.

Hier noch einmal die Klasse PropertyLogListInfo:

public class PropertyLogListInfo : INotifyPropertyChanged
{
public PropertyLogRing LiveLogList {get;}
public IList<PropertyLogItem> PropertyLogList {get;}
}

PropertyLogListInfo kann nicht nur Live-Werte speichern, sondern auch archivierte Werte aus einem Langzeitarchiv bereitstellen. Verwenden Sie daher die Eigenschaft PropertyLogList, um die Eigenschaftswerte zu lesen, weil PropertyLogListInfo entweder Livewerte oder archivierte Werte darüber zugänglich macht.


Eigenschaftswerte können auch in Langzeitarchiven abgelegt werden. Dafür muss in der iPlus-Entwicklungsumgebung die Aktualisierungsrate eingestellt werden (siehe Bild oben). Im Feld "Log Filter" stellen Sie einen Schwellwert ein, damit nicht jede marginale Wertänderung persistiert wird. Dies ist vorallem bei Double- und Float-Werten sinnvoll.

Archivierte Eigenschaftswerte werden mittels Methode

PropertyLogListInfo GetArchiveLog(DateTime from, DateTime to)

abgefragt, die im Interface IACPropertyNetBase definiert ist. Der Rückgabewert ist eine Instanz von PropertyLogListInfo, die sie im Abschnitt zuvor bereits kennengelernt haben.

Langzeitarchive sind mittels PersistentDictionary realisiert, die wiederum die hoch performante ESENT database engine verwenden. Die PersistentDictionary ist im Grunde genommen eine binäre Datei. Deswegen muss in für jedes Anwendungsprojekt festgelegt werden, in welchem Verzeichnis die ESENT-Dateien abgelegt bzw. gespeichert werden sollen. Geben Sie den Pfad in der iPlus-Entwicklungsumgebung bei dem Wurzelelement in der Eigenschaft "ArchivePath" ein:

Archive werden für drei Monate aufgehoben. Ältere Monate werden automatisch gelöscht, damit der Festplattenverbrauch konstant bleibt. Falls Sie längere Archivierungszeiträume benötigen, können Sie dies mittels der Eigenschaft "DeletePropLogAfterXMonths" im Abschnitt "LoggingConfiguration" in der Konfigurationsdatei einstellen.

Langzeitarchive können per Steuerelement VBChartControl als Liniendiagramm angezeigt werden.