Showing results 1 to 10 of 10

Thread: Import historischer Daten in zenon Archiv

  1. #1
    Join Date
    21.12.2016
    Posts
    16

    Frage Import historischer Daten in zenon Archiv

    Hallo,

    aktuell entwickle ich .NET Module (VSTA und WPF) für die zenon 7.60 Umgebung unter Windows 10, die Archivdaten über mehrere Monate auswertet.
    Der Kunde hat noch keine realen Archivdaten verfügbar (CD Kunde seit Anfang des Jahres) und wird die Lösung wiederkehrend in seinen Projekten einsetzen. Erst dort entstehen die Daten dann aus dem Feld. Aber selbst wenn die Archivdaten als CSV vorlägen, könnte ich sie nicht nutzbar verwerten.

    Die Problemstellung ist, dass ich keine Archivdaten für einen Zeitraum von beispielsweise 365 Tagen generieren kann, wobei mindestens 40 Variablen mit je einem Wert täglich belegt sein müssen.
    Über das Bild "Archive Revision" können nur mühsam einzelne Werte manipuliert werden. Das ist für über 14.000 Werte also nicht nutzbar.
    Idealerweise ließe sich eine Excel Tabelle mit geeigneten Daten füllen und diese dann in Archiv(e) importieren. Alternativ können die Werte aber auch programmatisch mit Zufallsvorgaben erzeugt werden.

    Das produktive Zielarchiv setzt sich aus Minutenwerten zusammen und wird täglich auf einen Tagesmittelwert verdichtet.
    Mithin ist das Minutenarchiv dann jeweils bereits geschrieben und Tagesmittelwert-Archive müssen getriggert neu erzeugt werden.
    Für die Entwicklung und Funktionsprüfung ist der Typ des Archivs jedoch unerheblich. Die .NET Module können auf konsolidierten Archiven in derselben Weise arbeiten wie auf zyklischen Archivdaten.

    Hierfür würde ich gern ein C# Modul implementieren wollen, das aus einer CSV Datei in ein Arhciv importiert.

    Für jede Idee bin ich hier dankbar.
    Beste Grüße
    Jens

  2. #2
    Join Date
    28.02.2013
    Posts
    169

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Jens,

    ein paar Hinweise vorweg:

    Sollten die Daten später mal SQL-evakuiert werden, wäre es am einfachsten, die zenon SQL evakuierung einzurichten und die Daten dann gleich in die entsprechenden Tabellen zu importieren.

    Beim Zugriff auf Archivdaten via API muss man bedenken, dass der Datenaustausch via COM relativ langsam ist. Das heißt für 14.000 Werte ist die RT schon etwas beschäftigt und ich würde das nicht auf einem Produktivsystem machen. Die Daten auf einem Testystem zu importieren, und die ARX Dateien dann ins Produktivsystem einzupflegen sollte ein gangbarer weg sein.

    Da du bereits zenon 7.60 im Einsatz hast, schlage ich vor, das via AddIn anzugehen. Das ist unserer aktuelle, zukunftsicherer Technologie für selbstprogrammierte zenon Erweiterungen.
    Ist das für dich ok?

    Schöne Grüße,
    Felix

  3. #3
    Join Date
    21.12.2016
    Posts
    16

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Felix,

    Sollten die Daten später mal SQL-evakuiert werden,
    nein, werden sie nicht.

    das via AddIn anzugehen. ...
    Ist das für dich ok?
    Ja, AddIn ist in Ordnung.

    Beste Grüße
    Jens

  4. #4
    Join Date
    28.02.2013
    Posts
    169

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Jens,

    für den folgenden Zugang nehmen wir mal an, dass es sich um ein spontanes Archiv handelt (so müssen wir nicht prüfen ob die Werte dem Archivzyklus entsprechen).

    Zur Vorbereitung brauchen wir VisualStudio (VS) mit unserem Scada.Addin Package (kann man im Marketplace herunterladen).
    Zusätzlich noch ein Projekt mit der Variablen "Var1" in einem spontanten Archiv "ARCHIVE1".

    Im VS kann man dann ein neues Projekt (Vorlage Editor Wizard) anlegen und die Namespaces
    using System.Linq;
    using Scada.AddIn.Contracts.Historian;
    einbinden.
    Im Code muss man sich dann als erstes das Archivobjekt und die entsprechende Variable holen

    IRuntimeArchive myArchive = (from X in context.RuntimeArchiveCollection where X.Name == "ARCHIVE1" select X).First();


    IRuntimeArchiveVariable myArchiveVariable = (from X in myArchive.VariableCollection where X.Name == "Var1" select X).First();


    Danach kann man einen neuen ArchivFilter für dieses Archiv erzeugen und ihn entprechend konfigurieren

    IRuntimeArchiveFilter myArchiveFilter = myArchive.FilterCollection.Create();


    myArchiveFilter.StartTime = 1508242320;

    myArchiveFilter.EndTime = 1508242320+260000;


    und unsere Archivvariable dem Filter hinzufügen:

    myArchiveFilter.AddVariable(myArchiveVariable);
    Dann muss man die Änderungen übernehmen

    myArchiveFilter.ApplyChanges();

    Und kann das Archiv mit den entsprechenden Filtereinstellungen abfragen
                           
    IRuntimeArchiveFilterVariableCollection myArchiveFilterVariables = myArchiveFilter.Query();

    Die Collection myArchiveFilterVariables enthält dann die Archivkanäle für die den Filterkriterien entsprechenden Kanäle.
    Daraus kann man sich den Kanal für die gesuchte Variable holen

    IRuntimeArchiveFilterVariable myArchiveFilterVariable = (from X in myArchiveFilter.FilterVariableCollection where X.ArchiveVariable.Name == myArchiveVariable.Name select X).First();

    Und in diesem Kanal kann man neue Werte hinzufügen

     IRuntimeArchiveValue myArchiveValue = myArchiveFilterVariable.ArchiveValueCollection.Create();
                                if (myArchiveValue != null)
                                {
                                    myArchiveValue.Value = 5;
                                    myArchiveValue.Time = 1508242320;
                                    myArchiveValue.TimeMilliseconds = 0;
                                    myArchiveValue.HigherState = 01;
                                    myArchiveValue.LowerState = 4325376;
                                    myArchiveValue.SetModified();
                                }

    hier können auch mehrere Werte (z.B wie in deinem Fall von einem CSV geparst) erstellt werden.

    Danach werden die Änderungen angewandt

    myArchiveFilter.ApplyChanges();

    und die Werte so ins Archiv geschrieben.
    Danach sollte man noch aufräumen und die Objekte - auch den Filter - entsprechend zerstören.
    Ich hänge auch noch einen Beispielcode an. Der besseren Übersicht halber, habe ich auf korrekte Fehlerbehandlund etc. verzichtet.



    Attached Files Attached Files

  5. #5
    Join Date
    21.12.2016
    Posts
    16

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Felix,

    vielen Dank für die ausführliche Erläuterung, die mir sehr weiterhilft.
    Ich arbeite im Projekt ja ohnehin intensiv mit dem Archiv und den entsprechenden Archivfiltern - wusste aber nicht, dass man hierüber auch neue Werte hinzufügen kann.

    Vom Support habe ich eine (riesige) Übersicht der API Klassen bekommen. Das hat zusammen mit den Hilfedateien im zenon bislang auch gut bei der Arbeit mit den Archiven weitergeholfen, um die Details der Strukturen und ein paar Beispiele zu finden. Zum Hinzufügen von Werten hatte ich dort aber eben nichts finden können.

    Beste Grüße
    Jens

  6. #6
    Join Date
    28.02.2013
    Posts
    169

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Jens,

    gerne!

    Bitte das Ganze halt entspechend testen. Gerade bei zyklischen Archiven kann man sich damit, also wenn man z.B. Werte die nicht dem Zyklus entsprechen einfügt, das ganze Archiv ruinieren.

    Ich gebe dir aber recht, dass das nicht ganz selbsterklärend ist. Allerdings ist dieses Thema relativ speziell und unsere Leute die die Doku schreiben sind auch mit den umfangreichen Standardthemen ganz gut beschäftigt.

    Aber für solche Fälle habe wir ja das Forum hier...

    Melde dich einfach, wenn es wo Unklarheiten gibt.

    Viel Erfolg!
    Felix

  7. #7
    Join Date
    21.12.2016
    Posts
    16

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Felix,

    verstehe ich (die Dokumentationsabteilung).
    Dann noch zwei Zusatzfragen zu den zyklischen Archiven - wo Du es ansprichst.

    (1)
    Angenommen, das zyklische Archiv wird per Definition stündlich mit Werten geschrieben.
    Nun werden über die API manuell Werte hinzugefügt.
    Welchen Zeitstempel sollten diese Werte haben oder auch keinesfalls haben? Genügt es, sicherzustellen, dass nur ein Wert je Stunde geschrieben wird?

    (2)
    Können per API Werte vor im Archiv bereits vorhandenen Werten geschrieben werden? Und müssen alle Werte chronologisch sortiert eingefügt/angehängt werden?

    Nochmals Dank.
    Beste Grüße
    Jens

  8. #8
    Join Date
    21.12.2016
    Posts
    16

    Ausrufezeichen Re: Import historischer Daten in zenon Archiv

    Hallo Felix,

    beim Nachbauen deines Beispiels für das AddIn zum Befüllen von Archivvariablen bekomme ich eine Compiler-Fehlermeldung, die ich leider nicht auflösen kann:

    Quote Originally Posted by felixst View Post
    IRuntimeArchive myArchive = (from X in context.RuntimeArchiveCollection where X.Name == "ARCHIVE1" select X).First();


    Error    CS1061    'IEditorApplication' does not contain a definition for 'RuntimeArchiveCollection' and no extension method 'RuntimeArchiveCollection' accepting a first argument of type 'IEditorApplication' could be found (are you missing a using directive or an assembly reference?)

    Hast Du hierzu eine Idee?

    Viele Grüße
    Jens

  9. #9
    Join Date
    28.02.2013
    Posts
    169

    Default Re: Import historischer Daten in zenon Archiv

    Hallo Jens,

    ich vermute, dass du die falsche VS-Vorlage erwischt hast.

    Generell unterscheiden wir zwischen Wizards und Services.
    Wizards werden einmal durchlaufen und dann alles wieder "zerstört", Services bleiben im Hintergrund geladen und reagieren dann auf Events, etc.

    Beide Varianten gibt es sowohl für den Editor als auch die Runtime. Und in beiden stehen teilweise unterschiedliche Objekte zur Verfügung.
    Einen Archivwert an sich gibt es z.B. im Editor nicht. Der hat ja nur in der Runtime eine Daseinsberechtigung.

    So wie ich die Fehlermeldung lese, hast du eine EditorWizardExtension (also für den Editor) angelegt und versuchst darin auf Runtime-Objekte zuzugreifen. Das geht daher schief.
    Bitte lege eine neues VS-Project nach der Vorlage "RuntimeWizardExtensiion" an und probiere es dort...

    Liebe Grüße,
    Felix

  10. #10
    Join Date
    21.12.2016
    Posts
    16

    Cool Re: Import historischer Daten in zenon Archiv

    Quote Originally Posted by felixst View Post
    Hallo Jens,

    ich vermute, dass du die falsche VS-Vorlage erwischt hast.

    Hallo Felix,

    ja, Du hast Recht. Ich habe es gerade auch gefunden - Du warst aber schneller.
    Mit IProjectWizardExtension geht es natürlich.

    Vielen Dank. Schöne Weihnachtstage
    Jens

Similar Threads

  1. SCD Import to Zenon
    By mehrdad66 in forum zenon Energy Edition
    Replies: 2
    Last Post: 14th February 2017, 16:42
  2. Import variables from TIA V13 to Zenon 6.51
    By professor_hubert_farnsworth in forum zenon Operator
    Replies: 0
    Last Post: 14th November 2016, 14:16
  3. Replies: 4
    Last Post: 4th November 2014, 19:59
  4. PDiag import into zenOn
    By craigh2 in forum Drivers
    Replies: 3
    Last Post: 12th June 2012, 13:50
  5. Replies: 0
    Last Post: 20th August 2007, 14:00

Tags for this Thread

Posting Rules

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