Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: Schnelle Datenübertragung, Datenspeicherung und Datenvisualisierung

  1. #1
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Freunde der Hochsprachenprogrammierung.

    Ich habe mit der DotNetSiemensPLCToolBoxLibrary eine Applikation entwickelt, mit der ich Daten aus der Siemens S7-SPS lesen, die aktuellen Werte anzeigen und in Dateien abspeichern kann.

    Ich moechte nun waehrend die Erfassung laeuft, die die Werte in einem DataGridView anzeigen. Ich stelle mir das so vor, dass sich das GridView dann kontinuierlich mit Zeilen fuellt.

    In einem Background-Thread werden die Werte von der S7 gelesen und in eine DataTable geschrieben. Alle 30 Millisekunden faellt eine neue Zeile in der DataTable an. Sehr schnell habe ich an die 100.000 Zeilen in der Tabelle.

    Im GUI-Thread habe ich ein DataGridView mit Binding-Source an diese DataTable verbunden.

    Im Debugger laeuft das ganze irgendwie. Aber wenn ich die Exe ohne Debugger starte, dann friert das Programm manchmal ein. Ich habe ein wenig experimentiert und eine Exe erzeugt die ohne Einfrieren laeuft, aber wenn ich dann weitere Aenderungen am Programm durchfuehre, habe ich wieder Probleme.

    Ich bin auf der Suche nach einem grundsaetzlichen Hinweis, wie man bei solchen Problemstellungen vorgeht, denn ich glaube ich habe hier ein grundsaetzliches Architektur-Problem in der Herangehensweise.

    Wie werde grosse Datenmengen, die in einem Background-Thread anfallen am besten gespeichert. Ist die DataTable hier das richtige Instrument? Wie Zeige ich diese Daten dann am besten im UI-Thread an?
    Zitieren Zitieren Schnelle Datenübertragung, Datenspeicherung und Datenvisualisierung  

  2. #2
    Registriert seit
    07.01.2011
    Ort
    Rhein-Neckar
    Beiträge
    36
    Danke
    1
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo Burkhard,

    was spricht den Deine Konsole (Vermutlich Visual Studio?) beim Ausführen des Programms im Debugging Modus? (Irgendwelche Exceptions?) Ist der "Invoke" zwischen den Threads sauber gelöst?

    Bevor Du das Programm als Stand-Alone Exe betreibst erstelle es mal als "Release"! - Führst Du das Programm auf der gleichen Maschine aus wie beim Debuggen? Sind alle Verweise als Lokale Kopie gesetzt?

    Für einfaches Abspeichern gibt es evtl. schönere Lösungen als ein DataSet. Grundsätzlich sollte es aber funktionieren.

    Gruß aus der Pfalz
    http://domes-finest.de - Mein kleiner Blog

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.402 Danke für 2.001 Beiträge

    Standard

    Hallo,
    ich würde das gar nicht über einen DataTable und Binding lösen - wobei ich gestehen muss, dass ich einen DGV in diesem Zusammenhang und in dieser Form noch nie verwendet habe.
    Hast du mal versucht, jeden neuen Datensatz als neue Row hinzuzufügen ?
    Hast du in deinem Thread am Ende ein Thread.Sleep(0) oder größer damit die Applikation selbst auch noch die Chance hat, ihre Events durchzubekommen ?

    Was mich hier allerdings auch noch interessieren würde :
    Wie bekommst du zuverlässig alle 30 ms auf diese Weise Daten von der SPS ? Das kann ich mir irgendwie so gar nicht vorstellen. Es könnte von da her also auch genauso sein, dass dir dein Programm deswegen einfriert.

    Gruß
    Larry

  4. #4
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Ich glaube auf jeden Fall nicht das es flüssig laufen wird wenn man einer DGV alle 30ms eine Zeile hinzufügt! Vlt. gehts mit WPF einem DataGrid und einer Observable Collection wenn die Ui Virtualisierung aktiv ist! Aber auch nur Vlt! Ich glaubs irgenwie nicht! du kannst doch die daten auch puffern und nur alle z.B. 500ms als block hinzufügen?
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #5
    Burkhard ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Daumen hoch

    Hallo,

    also das Lesen der Daten alle 30ms funktioniert, das habe ich ja bereits in einem anderen Thread gezeigt, lieber LarryLaffer. Auch das Schreiben der Daten in die Datei funktioniert verzögerungsfrei, mit Schwankungen zwischen 20 und 35 ms.

    Ich habe mich entschieden die 4 Threads die die Daten aus der SPS lesen nicht zu syncronisieren. Sonst wuerde ja der langsamste Thread immer den Takt vorgeben. Die Schreiben ganz unabhaengig von einernder ihre Daten in eine Erebnis-Tabelle. Das klappt soweit auch ganz gut.

    Morgen werde ich nach mal Zeitmessungen machen um zu kontrollieren ob auch das Schreiben der Daten in die DataTable genau so verzögerungsfrei funktioniert wie das Schreiben in die Datei. Ich baue alle 30ms eine Row mit einem Zeitstempel zusammen und füge dann die Row der Datetable hinzu. Nach 10 Minuten Aufzeichnungszeit kontrolliere ich den Jitter der Zeitstempel.

    Beim Datenbinden an das DataGridview gibt es immer mal wieder Schwankungen um die 200ms. Ich habe nachgedacht und finde sowieso, dass diese riesige Datenmenge in einem DGV sowieso niemand anschauen kann und will.

    Wichtiger ist die grafische Darstellung der Daten in Charts, denn ein Bild sagt mehr als tausend Worte, bzw. Zahlen. Darum ist der nächste Schritt die Bindung der Datatable an ein Chart.

    Hat einer von euch Erfahrungen mit Echtzeit-Charts, wenn Daten alle 30ms anfallen? Ich habe früher mit dem Scope-View-Analyzer von Beckhoff gearbeitet und die arbeiten da auch mit Puffern, das sieht man daran wie sich die Diagramme aufbauen. Auch mit dem Autem PLC-Analyzer habe ich gerarbeitet und da sieht man, dass die grafische Darstellung auf das allernötigste reduziert wurde um genug Performance für die Erfassung und Speicherung der Daten zu haben.

    Gibt es da vielleicht eine OpenSource Library für die Echtzeitdarstellung von Messwerten?
    Angehängte Dateien Angehängte Dateien
    Geändert von Burkhard (02.10.2015 um 20:01 Uhr)

  6. #6
    Burkhard ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hast du in deinem Thread am Ende ein Thread.Sleep(0) oder größer damit die Applikation selbst auch noch die Chance hat, ihre Events durchzubekommen ?
    Ja, ich habe einen Thread.Sleep(20) in meinem Haupt-SPS-Thread drin. Der UI-Thread ruft pro SPS den SPS-Thread auf, dieser wiederum ruft pro Connection einen Connection-Thread auf.

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Wie bekommst du zuverlässig alle 30 ms auf diese Weise Daten von der SPS ? Das kann ich mir irgendwie so gar nicht vorstellen.
    Doch frag ma den Jochen, mit der Toolboxlibrary geht das. Die Zykluszeit der Erfassung schwankt zwischen 20ms und 35 ms. Dabei nutzt man soviele Connections zur S7 wie eben frei sind und liest über jede Connection pro Lesezyklus eine PDU.

  7. #7
    Burkhard ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von dolo280 Beitrag anzeigen
    Hallo Burkhard,

    was spricht den Deine Konsole (Vermutlich Visual Studio?) beim Ausführen des Programms im Debugging Modus? (Irgendwelche Exceptions?) Ist der "Invoke" zwischen den Threads sauber gelöst?
    IM Debugging-Mode gibt es keine Exzeptions. Die Delegates für die Cross-Thread Operations beim Zugriff auf Controls des UI-Threads sind auch alle OK. Für eine Cross-Thread-Operation beim Schreiben in ein Data-Set brauche ich kein Delegate/Invoke, da reicht ein SycLock m.E. aus.

    Zitat Zitat von dolo280 Beitrag anzeigen
    Bevor Du das Programm als Stand-Alone Exe betreibst erstelle es mal als "Release"! - Führst Du das Programm auf der gleichen Maschine aus wie beim Debuggen? Sind alle Verweise als Lokale Kopie gesetzt?
    Ja, als Release habe ich es jetzt auch kompiliert und ich teste es auf der gleichen Maschine. Alle Referenzen sind ins Release Verzeichnis kopiert. Es ist wirklich bei der Multi-Thread-Programmierung so, dass es da Merkwürdigkeiten gibt, die auch der Debugger nicht erkennt.

    Wenn einer von euch mal Zeit hat, kann er sich ja mein Projekt mal runterladen und anschauen. Probiert mal bitte die Sub "ShowDataGridView2(...)" aus der in frmMain untersten Sub "ToolStripButtonUpdate_Clicked" in die darueberliegende Sub "EventOperation2FinishedRaised" zu kopieren, so dass sie direkt unter "ShowDataGridview1(...)" steht.

    Dann wieder einen Build machen. Im Debugger läuft es, aber die Standalone-Exe friert ein, sobald der Datenaustausch mit der S7 startet und das Event kommt. Ich kapier nicht wieso es laueft wenn ich das Event manuell über den Button zeitversetzt steuere.
    Geändert von Burkhard (03.10.2015 um 01:03 Uhr)

  8. #8
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Ja, als Release habe ich es jetzt auch kompiliert und ich teste es auf der gleichen Maschine. Alle Referenzen sind ins Release Verzeichnis kopiert. Es ist wirklich bei der Multi-Thread-Programmierung so, dass es da Merkwürdigkeiten gibt, die auch der Debugger nicht erkennt.
    Ja absolut - deine Applikation hat im Debug-Modus/und auch innerhalb/ausserhalb der IDE ein anderes Zeitverhalten
    damit bekommst du z.B. mehr/weniger Events durch oder Fehler in deiner Synchronisation werden damit verborgen/kasschiert

    so eine Frage, deine Einfrierproblem und dein Datenweg über einen DataTable+Bindings lassen mich irgendwie an der Stabilität deiner 30ms-Aussagen zweifeln
    hab schon genug Mit-Threads-ist-es-schneller-Beispiele gesehen die schneller aber instabiler liefen - nach Korrektur der Synchronisation waren diese wieder auf erwartetem Niveau unterwegs

    Ein Benchmark der nicht stundenlang mit hoher Wiederholrate, gemittelt und ohne IO wie Console,GUI,Dateiausgabe ausserhalb der IDE gefahren wurden ist bedeutungslos - weil es einfach zu viel Rauschanteil in der Messung gibt

    ein nackter C/C++ Test mit AGLink(in meinen Messungen bisher immer am schnellsten) + eine Liste deiner Variablen/und wie du sie auf n Verbindungen splittest (nicht der Algorithmus sonder nur welche Variablen in welcher Reihenfolge auf welche Verbindung) würde da eine gute Testgrundlage bieten

  9. #9
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.746
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Für Charts würd Ich dir z.B. unter WPF das von mir gepflegte WPF Toolkit empfehlen (https://github.com/dotnetprojects/WpfToolkit) oder http://oxyplot.org/
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  10. #10
    Burkhard ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    28.11.2007
    Beiträge
    123
    Danke
    19
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Da muss ich ja WPF lernen. Damit habe ich noch nie gearbeitet. Ich habe heute einfach mal das Chart-Control von Microsoft ausprobiert. Was fuer Vorteile hat den das Chart-Control aus deinem WPF-Toolkit gegenueber den Standard-Chart von MS?

Ähnliche Themen

  1. Antworten: 29
    Letzter Beitrag: 29.09.2015, 23:20
  2. Antworten: 17
    Letzter Beitrag: 29.09.2015, 07:18
  3. Antworten: 18
    Letzter Beitrag: 17.09.2009, 10:22
  4. USB Datenspeicherung
    Von Domi55 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 24.02.2009, 21:53
  5. Datenspeicherung??
    Von Jiri82 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 31.08.2007, 20:06

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •