Eigener Archivexport von ETM in *.csv

Eigener Archivexport von ETM in *.csv

Hallo,
ich habe mir vor einiger Zeit einen eigenen Export von Archivdaten in eine *.csv Datei erstellt.
Die von Zenon mitgelieferte Funktion finde ich äußerst unkomfortabel. Ich erstelle Oberflächen im Bereich der Gebäudeleittechnik, hier werden normalerweise Temperaturverläufe, Energieverbräuche oder Druckkurven im ETM dargestellt. Jeder Kunde würde gerne die Daten exportieren die er sich aktuell im ETM anzeigen lässt, denn diese sind für ihn von Interesse, und alles andere nicht. Alles am besten mit einem Klick. Soweit so gut, ist mit VBA auch keine große Herausforderung.
Ich erstelle die Datei und konfiguriere abhängig vom aktuell dargestellten Trend (Startzeit, Endzeit, dargestellte Variable) einen Archivfilter. Dieser wird über den Befehl "Set zArvVars = zArvFilter(i).Query" aktiviert. Danach lese ich die einzelnen Zeiten und Werte einfach nacheinander aus den ArchiveFilterVariables aus und schreibe sie in die Datei. Leider meldet der Filter bei großen Datenmengen oft das er keine Einträge gefunden hat, und auch bei kleinen Datenmengen dauert es recht lange bis der Befehl "Set zArvVars = zArvFilter(i).Query" ausgeführt wird. Das selbe mit dem Befehl "zArvFilter(i).QueryBlock zPvIDs, zValues" ich kann hier keinen Unterschied feststellen. Wann genau der Abbruch kommt kann ich auch nicht feststellen, manchmal schafft es der Filter mehr Daten zu verarbeiten als ein anderes Mal. Vielleicht hat es etwas mit der Größe des Arbeitsspeichers bzw. mit dem freien Arbeitsspeicher zu tun. Ich weiß nicht weiter und würde diese schöne Art des Speichern's von Archivdaten gerne beibehalten. Vielleicht hat jemand eine Idee was man einstellen könnte um den Abbruch zu vermeiden, oder ob man ohne Filter die Daten aus dem Archiv ziehen kann...
VBA Code:

Public Sub LeftClickUp_Archiv_Export(obElem As Element)
'Declarations
Dim obPicture As DynPicture
Dim nKurven As Integer
Dim i As Integer
Dim k As Integer
Dim j As Long
Dim lngMin As Long
Dim TimefilterTyp As Long
Dim zArchive As Archive
Dim zArvFilter(15) As ArchiveFilter
Dim zArvVars As ArchiveFilterVariables
Dim dTime As Double
Dim nArchiveinträge As Integer
Dim sPath As Variant
Dim strOutput As String
Dim Time As Date
On Error GoTo ERROR_HANDLING
'Zugriff auf Bild und damit auf die aktiven Bildfilter
Set obPicture = obElem.Parent.Parent
If (obPicture Is Nothing) Then
MsgBox "Error: Picture-object is invalid..."
Exit Sub
End If
'–ffnet Dialog um Speicherort auszuwählen
sPath = GetOrdner("")
'Falls bei der Funktion GetOrdner kein Ordner ausgewählt wurde -> Abbruch
If sPath = "" Then
MsgBox ("Daten wurden nicht exportiert")
Exit Sub
End If
'Erstelle Dateipfad aus "Export", der aktuellen Zeit und gesamten Dateipfad
sPath = sPath & "\Export_" & Format(Now(), "yyyy_mm_dd_hh_mm_ss") & ".csv"
'Erstellen und öffnen der csv Datei
Open sPath For Output As #1
'Visu Bildschirm wird während der Abarbeitung gesperrt
thisProject.RtFunctions.Item("FU_BU_Hauptfenster_Vorgang_in_Bearbeitung").Start
thisProject.DynPictures.Item("B_Vorgang in Bearbeitung").UpdateAll
'Anzahl der im Diagramm Dargestellten Kurven
nKurven = obPicture.PictureFilter.DynProperties("Curve[-1]")
'Für jede Kurve
Do While i < nKurven
'Suche in welchem Archiv die dargestellte Variable liegt (LongName Archiv Kürzel (z.B. T0))
For k = 0 To thisProject.Archives.Count - 1
If thisProject.Archives.Item(k).LongName = obPicture.PictureFilter.DynProperties("Curve[" & i & "].VarInfo.Archive") Then
'Speichern des richitgen Archives in der Variable zArchive
Set zArchive = thisProject.Archives.Item(k)
End If
Next

'Wenn kein Archiv verfügbar...
If zArchive Is Nothing Then
'... Ausgabe der Meldung
MsgBox ("Kein Archiv gefunden!")
Exit Sub
Else
'Erstellen eines neuen Archivfilters
3 Set zArvFilter(i) = zArchive.ArchiveFilters.CreateArchiveFilter

'Variable an Archivfilter übergeben
4 zArvFilter(i).AddArchiveVariable zArchive.ArchiveVariables.Item(obPicture.PictureFilter.DynProperties("Curve[" & i & "].VarInfo.VarName"))

'Zeitfiltertyp für Bestimmung der Berechnung von Start- und Endzeit des Archivfilters
TimefilterTyp = obPicture.PictureFilter.DynProperties("TimeAxe.TimeFilter.TimeFormat")
'Timefilter = 10 bedeutet Relativer Zeitraum
If TimefilterTyp = 10 Then
'Berechnung Start und Endzeit des Archivfilter bei Relativem Zeitraum
'Bestimmen der Länge des dargestellten Zeitraums (z.B. 1440min für Letzte 24h)
lngMin = DateDiff("n", obPicture.PictureFilter.DynProperties("TimeAxe.TimeFilter.ARVTime2"), obPicture.PictureFilter.DynProperties("TimeAxe.TimeFilter.ARVTime1"))
'Startzeit des Filters ist aktuelle Zeit - Zeitraum (in Long)
dTime = System2zenOn(CDbl(CDate(DateAdd("n", -lngMin, Now))))
zArvFilter(i).StartTime = dTime
'Endzeit des Filter ist aktuelle Zeit (in Long)
dTime = System2zenOn(CDbl(Now))
zArvFilter(i).EndTime = dTime

Else
'Timefilter <> 10 = bedeutet absoluter Zeitraum
'œbergabe der Start und Endzeit des Archivfilters, direkt aus PictureFilter (in Long)
dTime = System2zenOn(CDbl(obPicture.PictureFilter.DynProperties("TimeAxe.TimeFilter.ARVTime1")))
zArvFilter(i).StartTime = dTime
dTime = System2zenOn(CDbl(obPicture.PictureFilter.DynProperties("TimeAxe.TimeFilter.ARVTime2")))
zArvFilter(i).EndTime = dTime

End If

End If

'Aktiviere des aktuellen Archivfilter
5 Set zArvVars = zArvFilter(i).Query

'Prüfung ob Werte aus dem Archiev geslesen wurden, oder ob ein Fehler beim Filtern auftrat
6 If zArvVars.Item(0).ArchiveValues.Count = 0 Then
MsgBox ("keine Daten Verfügbar")
'Schließt Anzeige für laufende Bearbeitung
thisProject.RtFunctions.Item("FU_SchabloneSchließen_Popup_GLT_Erweitert").Start
Close #1
Exit Sub
End If

'Test Name des Zähler/Sensors ist der GraphName
VarName = obPicture.PictureFilter.DynProperties("Curve[" & i & "].GraphName")
'œbergabe der Archivwerte an *.csv Datei
'œberschrift pro Exportierter Variable
7 Print #1, ";" & "Name: " & VarName & ";" & "Einheit: " & obPicture.PictureFilter.DynProperties("Curve[" & i & "].Titel") & "/" & obPicture.PictureFilter.DynProperties("Curve[" & i & "].YAxe.Titel")
8 Print #1, "Uhrzeit" & ";" & "Variable" & ";" & "Wert"
'Print Funktion wird für jeden Archiveintrag der Variable durchgeführt
For j = 0 To zArvVars.Item(0).ArchiveValues.Count - 1
'Emittelt die Speicherzeit im DateFormat
9 Time = CDate(zenOn2System(zArvVars.Item(0).ArchiveValues.Item(j).Time))
'String der in die Datei geschrieben wird (Zeit, Variablenname, Archivwert)
10 strOutput = Format(Time, "dd.mm.yyyy hh:mm") & ";" & VarName & ";" & zArvVars.Item(0).ArchiveValues.Item(j).Value
'schreiben
Print #1, strOutput
Next j

'Increment Index für nächste Kurve
i = i + 1
Loop
'Datei nach Export schließen
Close #1
'Schließt Anzeige für laufende Bearbeitung
thisProject.RtFunctions.Item("FU_SchabloneSchließen_Popup_GLT_Erweitert").Start
Exit Sub
ERROR_HANDLING:
'Schließt Anzeige für laufende Bearbeitung
thisProject.RtFunctions.Item("FU_SchabloneSchließen_Popup_GLT_Erweitert").Start
'Fehlerausgabe
MsgBox ("Export nicht erfolgreich! " & vbCrLf _
& "Fehlernummer: " & Err.Number & _
vbCrLf & "Fehlerbeschreibung: " & Err.Description & _
vbCrLf & "Fehler Line: " & Erl())
Close #1
End Sub

Gruß Tobias

This is a migrated post! Originally posted on 17.09.2015 by user zero. Please be aware that information can be outdated.