none
(Mess-)Werte grafisch darstellen - Oszimodus - Wie geht das in C#? RRS feed

  • Frage

  • Tag,

    ich möchte gemessene Werte (float) in einer Grafik darstellen.

    Quasi wie auf einem Oszilloskop, fortlaufend. Nun habe ich schon ne lange zeit Google durchsucht, aber leider nichts apssendes gefunden.

    Vom Pronzip her wird es (laut meiner Vorstellung) nicht sonderlich schwer sein, da es ja nur darum geht mit Hilfe von X & Y den Wert in eine Grafik einzutragen. Das soll dann am ende so sein, daß sich der Graf zuerst auffüllt und dann weiter läuft, also wenn der Graf voll ist schiebt er den ältesten Wert links raus aund setzt den neusten Wert hinten links an.

    Wie realisiere ich das in C#?

    Ich verwende VS2010Prof mit Win7Prof 64-bit.

    Bin echt mehr wie gespannt auf Eure Antworten ;-)


    Grüße, Jochen

    Mittwoch, 29. August 2012 14:18

Antworten

  • Das ist sowas von simpel. Benutze eine Bitmap als Puffer. Das Bitmap braucht für die Zeitachse die doppelte Auflösung. Dann kannst du rechts, beim neuen Zeitwert deine Messwerte eintragen und stellst das Bitmap um einen Zeitwert nach rechts verschoben dar. Wenn du den rechten Rand erreicht hast, musst du den Inhalt von rechts nach links kopieren und kannst wieder in der Mitte anfangen zu malen..
    Montag, 3. September 2012 07:39
  • Ich habe so etwas mal gemacht und auf meiner Homepage dargestellt (ist zwar für VB):
     
    <Tipps und Tricks - informtools - Tipp 285>
     
    --
    Viele Gruesse
    Peter
    Dienstag, 4. September 2012 18:22

Alle Antworten

  • Hallo

    Mit welcher Technologie Arbeitest du? WinForms / WPF?

    In der WPF kannst du einfach eine polyline zeichnen, bei welcher du die Y-Koordinaten für die Höhe verändern musst. Für WinForms kannst du ja mal das ChartControl probieren. Alternativ könntest du auch ein polygon zeichnen:

            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                e.Graphics.DrawPolygon(myPen, new Point[] { new Point(1, 2), new Point(2, 2), new Point(3, 8), new Point(4, 1) });
            }


    Das musst du aber von alleine immer per Invalidate aktualisieren. WPF macht das von alleine. Wenn du eine Bézierkurve verwenden würdest, würdest du eher Sinus, Cosinus, ... Formen bekommen.

                e.Graphics.DrawBeziers(myPen, points);

    WinFormsgraphics: http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx
    WPF Polyline: http://msdn.microsoft.com/de-de/library/system.windows.shapes.polyline.aspx
    Bezier in WPF: http://www.c-sharpcorner.com/uploadfile/raj1979/drawing-bezier-curves-in-wpf/

    Ich denke mal das es dir schon etwas weiterhilft, je nachdem was du verwendest/benutzen willst.


    Koopakiller - http://koopakiller.ko.ohost.de/

    Mittwoch, 29. August 2012 14:40
    Moderator
  • Ich verwende WinForms, da bei uns noch niemand annähernd mit WPF was gemacht hat.

    Ok...da danke ich Dir mal für deine Antwort und hab jetzt ja mal was zu tun in diese Richtung ;-)

    [Edit:]

    Da fällt mir grad noch ne Frage ein: Ist es möglich in einem Projekt WinForms und WPF gemischt zu verwenden? Denn dann könnte ich mich ja in meinem aktuellen Projekt da dran machen und jetzt eben diese extra Form für die Oszidarstellung in WPF versuchen :-)


    Grüße, Jochen


    • Bearbeitet morfeus3009 Donnerstag, 30. August 2012 06:29
    Donnerstag, 30. August 2012 06:26
  • Hab jetzt nen ganz brauchbaren Weg mit ZedGraph gefunden.

    Das Einzige, was mich daran stört ist, daß es wohl nur möglich ist Die Werte am Ende gesammelt anzuzeigen, bzw. auszugeben.

    Was ich aber haben möchte ist die Möglichkeit eines "Oszi-Modus", heißt also jeden gemessenen Wert direkt im Graphen anzuzeigen und dies fortlaufend. Ist dann die Anzeige voll, soll der älteste Wert links rausgeschoben werden und der Neuste hinten rechts angehängt/angezeigt werden. So würde man einen wirklichen "Oszi-Modus" erhalten.

    Weiß jemand, ob das überhaupt möglich ist?


    Grüße, Jochen

    Montag, 3. September 2012 07:31
  • Das ist sowas von simpel. Benutze eine Bitmap als Puffer. Das Bitmap braucht für die Zeitachse die doppelte Auflösung. Dann kannst du rechts, beim neuen Zeitwert deine Messwerte eintragen und stellst das Bitmap um einen Zeitwert nach rechts verschoben dar. Wenn du den rechten Rand erreicht hast, musst du den Inhalt von rechts nach links kopieren und kannst wieder in der Mitte anfangen zu malen..
    Montag, 3. September 2012 07:39
  • Das ist sowas von simpel. Benutze eine Bitmap als Puffer. Das Bitmap braucht für die Zeitachse die doppelte Auflösung. Dann kannst du rechts, beim neuen Zeitwert deine Messwerte eintragen und stellst das Bitmap um einen Zeitwert nach rechts verschoben dar. Wenn du den rechten Rand erreicht hast, musst du den Inhalt von rechts nach links kopieren und kannst wieder in der Mitte anfangen zu malen..

    Also das vesrteh ich jetzt nicht so wirklich...Ich will doch Messwerte eintragen und anzeigen.

    Übrigens klappt mittlerweile das fortlaufende Schreiben und Anzeigen der Messwert mit ZedGraph (hätte nie gedacht, daß es soooo einfach ist ;-) ) mit

    Graph.Refresh();

    Mein einzigstes Priblem besteht jetzt nur noch darin, daß der Graph weiter geschrieben wird, aber die Postion der X.Achse anhand der Skalierung nicht weiter läuft. Heisst der Graph wird quasi ausserhalb vom dargsetellten Graphen weiter geschrieben, anstatt dass das Ganze dan sozusagen "mitscrollt"...

    Das is aber bestimmt nur ne Option in den Eigenschaften von ZedGraph oder so ähnlich die dazu richtig gesetzt werden muß, und diese suche ich noch...

    Wenn mir da jemand helfen könnte wäre es super! :-)


    Grüße, Jochen

    Montag, 3. September 2012 08:39
  • Ich habe so etwas mal gemacht und auf meiner Homepage dargestellt (ist zwar für VB):
     
    <Tipps und Tricks - informtools - Tipp 285>
     
    --
    Viele Gruesse
    Peter
    Dienstag, 4. September 2012 18:22
  • Hallo morfeus3009,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 26. September 2012 14:26
    Moderator
  • Hallo,

    habe das selbe Problem wie du, kannst du mir da eventuell links geben durch die du zum Ziel gekommen bist?

    mfg

    Donnerstag, 4. Oktober 2012 10:12