Showing results 1 to 9 of 9

Thread: Eigener Archivexport von ETM in *.csv

  1. #1

    Default 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...

    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
    Last edited by zero : 17th September 2015 at 12:50
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  2. #2
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: Eigener Archivexport von ETM in *.csv

    es gibt ja im etm eine eigene mdi-funktion welche die angezeigten daten in eine *.csv exportiert? - dieser mdi-button muss halt extra auf das etm-bild gezogen werden....
    (nicht zu verwechseln mit der funktion "archive exportieren".... )

    lg,
    herbert


  3. #3

    Default AW: Eigener Archivexport von ETM in *.csv

    Hallo,

    und danke für die schnelle Antwort.
    Die hatte ich über die Jahre tatsächlich schon verdrängt ,
    und mir tatsächlich heute nur die Funktion Archiv exportieren angeschaut.

    Aber hier gibt es ein paar Dinge die mich damals schon veranlasst haben,eine eigene Funktion zu schreiben, jetzt weiß ich auch wieder was das war
    1. Kein Header
    2. es werden Informationen exportiert die ich nicht brauche (z.B. Status & Kennung)
    3. die Variable die ich exportiere ist Teil eines Struckts, der Name des Sensors oder Zählers ist also nicht der Name der dargestellten Variable. Der Name ist in einer anderen Variable des gleichen Struckts hinterlegt.
    Gerne würde ich natürlich in der Datei z.B. "Raumsensor Besprechung Geb.22" ausgeben und nicht "S0_.OutputsTempSensors[212].rTempSensor" (im Trendaufruf wird der angezeigte Name schon mittels VBA angepasst)
    4. die Reihenfolge in der *.csv Datei würde ich gerne selbstbestimmen. Heißt mit dem Zeitstempel beginnen.
    Ich habe noch einiges Versucht und meine, dass der Filter recht regelmäßig abbricht, wenn ich über 49 Tage exportiere. Ich habe eine Temperaturkurve zum Test verwendet, 49 Tage bedeuten 7.056 Werte....Wenn ich zwei Kurven anzeige und exportiere, überschreite ich diese Anzahl Werte, ich werde das Morgen nochmal versuchen, denn ich meine das hat schon geklappt.
    Auf die fertige Funktion von Copadata wird man vermutlich keinen Einfluss nehmen können, oder?
    Noch zur Info, ich teste alles am WebClient.
    Vielleicht gibt es ja noch mehr Ideen oder Anregungen

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  4. #4
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: Eigener Archivexport von ETM in *.csv

    Die ETM-Funktion "Daten exportieren" ist in der Hilfe hier beschrieben:
    Handbuch -> Erweiterter Trend -> Bedienen zur Runtime -> Daten exportieren

    Nach dem Exportieren der angezeigten Daten könnte ja die Textdatei entsprechend noch angepasst werden
    - header hinzufügen
    - nicht benötigten variableninformation entfernen
    - gewünschte variablennamen ersetzen/einfügen
    - reihenfolge anpassen

    Wegen der Vielzahl der archivierten/exportierten Werte könnte ja Folgearchive/Verdichtungsarchive verwendet werden um eben nur die signifikanten Werteänderungen über einen solch langen Zeitraum anzuzeigen/exportieren zu lassen (also z.b. min/max/avg)...

    gruß,
    herbert


  5. #5

    Default AW: Eigener Archivexport von ETM in *.csv

    Hallo,

    das hab ich mir auch schon überlegt, dann könnte man den Export von Copadata nutzen, dieser geht auch super schnell.
    Ich weiß nur nicht was ich als Trigger benutze um die Datei dann zu bearbeiten, da ich keine Meldung habe, das der Export abgeschlossen ist.
    Auch weiß ich dann nicht wo die Datei liegt und wie sieh heißt.
    Ein zweiter Button um dann die Datei nochmal raus zu suchen um sie zu überarbeiten
    wirkt sehr gebastelt. Das kann man eigentlich keinem ernsthaft vorlegen.
    Für die Trigger-Problematik hab ich eine Idee:
    Man könnte mit Klick auf einen Button ein Skript starten welches den versteckten Button für den Export betätigt und dann noch eine Interne Variable setzt, diese löst über den Grenzwert mit 3 Sek. Verzögerung das Skript zum Überarbeiten aus.
    Wie ich die Datei aber finde kann ist mir noch ein Rätsel....

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  6. #6
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: Eigener Archivexport von ETM in *.csv

    das verzeichnis für das export-verzeichnis ist ja festgelegt.
    nach der wartezeit für das exportieren selbst von z.b. 3 sekunden einfach ein vba makro anstoßen welche dann die änderungen in der datei durchführt und dann diese überarbeitete datei in eignenes verzeichnis verschieben.
    somit ist ja eigentlich immer nur 1 datei im dem export-verzeichnis drinn und um dem namen der datei braucht man sich keine sorgen machen....

    gruß,
    herbert


  7. #7

    Default AW: Eigener Archivexport von ETM in *.csv

    Hallo,

    ich wollte eigentlich die Midi-Funktion vom Trendbild (ETM) benutzen. Deshalb die Unklarheit bei Speicherort und Name.
    Hab es jetzt aber mal wie vorgeschlagen mit der Archivexportfunktion versucht. Leider ist das nicht das Wahre. Meine Archive enthalten recht viele Dateien. Bsp. Temperatur sind 800 Sensoren, wenn ich jetzt einen Export von nur einem Monat mache wird die Datei ziemlich groß (250mb) und braucht auch entsprechend lange um erstellt zu werden. Wirklich schade, dass hier immer das ganze Archiv exportiert wird.
    Bzw. schade, dass die Trend-Exportfunktion nur als bildspezifischen Element und nicht als Runtimefunktion zur Verfügung steht.
    So viele Möglichkeiten und keine ohne Kompromisse.
    Vielleicht kommt man über die letzte vom User erstellte Datei ans Ziel, aber wie ich das in VBA mache, weiß ich noch nicht.

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

  8. #8
    Join Date
    30.05.2007
    Location
    Salzburg
    Posts
    881

    Default Re: Eigener Archivexport von ETM in *.csv

    kleine Anmerkung zu deinem geposteten VBA Code beim Auslesen der aufgezeichneten Werte aus dem jeweiligen Archiv:
    - es gibt den Schalter "ReadOnlyVarsInFilter"
    - siehe Hilfe Doku unter Handbuch -> Programmierschnittstellen -> Objectmodel -> ArchiveFilter -> ArchiveFilter-Properties -> ReadOnlyVarsInFilter
    - folgender Thread: http://www.copadata.com/forums/showthread.php?t=1872

    also vor dem Absetzen der Query
    Set zArvVars = zArvFilter(i).Query
    den Schalter "ReadOnlyVarsInFilter" auf "True" setzen

    gruß,
    herbert


  9. #9

    Default AW: Eigener Archivexport von ETM in *.csv

    Superklasse...
    Genau das was ich gesucht habe!
    Erklärt auch einiges, wenn immer 800Variablen im Filter vorbereitet wurden.
    Der Export funktioniert jetzt problemlos, und auch schnell genug. Jetzt kann ich mir auch die Obergrenze etwas besser erklären, liegt bei etwa 5.7 Millionen Datenpunkten (nicht 7056), da kann man auch mal verstehen, das der Arbeitsspeicher einknickt.
    So hab ich mir das vorgestellt, vielen Dank für die Unterstützung und Geduld

    Gruß Tobi
    Zenon 8.00

    Zenon Server Windows R2016

    Clients WebClientStarter / Windows 10 Enterprise

    ZenonWebserver 8.00



    --trust me i'm an engineer--

Similar Threads

  1. eigener Datentyp mit Adressierung in S7 1200
    By genakust in forum Drivers
    Replies: 4
    Last Post: 30th April 2015, 12:56
  2. CSV-Datei in ein Archiv rücklesen
    By observer1 in forum zenon Service Engine Supervisor
    Replies: 3
    Last Post: 28th March 2012, 08:02
  3. Import Tagname from .csv file
    By jaroslav.kral in forum VBA
    Replies: 2
    Last Post: 1st July 2011, 13:18
  4. Anpassung von Kurvenliste in ETM
    By hp in forum zenon Service Engine Supervisor
    Replies: 1
    Last Post: 30th March 2011, 01:59
  5. Importing CSV file
    By pakman in forum VBA
    Replies: 10
    Last Post: 26th March 2009, 19:26

Posting Rules

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •