Hallo Gemeinde,
ich möchte Daten die von einem µC über RS232 kommen (10ms Takt, evtl. auch schneller min. 2ms) grafisch in einem rolling Chart darstellen (und in eine txt-Datei schreiben).
Zur Simulation generiert der Timer gerade Daten.
Im 1. Schritt habe ich in dem Timer Event alles gemacht. Ergebnis: Chart hat funktioniert, aber die Zeit zwischen den einzelnen Punkten
war nicht genau die Zeit des Timers, sondern um die Zeit der Abarbeitungszeit in dem Timer Event länger.
Also z.B. Timer Tick war 20ms --> Abstand Datenpunkte: 20ms + x
Eigentlich für die geplante Anwendung kein Problem, da ja RS232 benutzt wir. Gestört hat es mich aber trotzdem.
Dann die Auslagerung mit Backgroundworker.
Zuerst Chart Aktualisierung im DoWork Sub. Ergebnis: Chart zeigt nach wenigen Punkten ein rotes, Diagonales Kreuz und keine Linien mehr.
Dann das auf MSDN gelesen:
und die Chart Aktualisierung in das RunWorkerCompleted Event gepackt.
Ergebnis: rotes, diagonal Kreuz kommt immer noch
Woran liegt es jetzt noch?
Für jede weitere Anregung ob das Chart Control für mein Vorhaben das Richtige ist bin ich dankbar, da das hier mein erstes VB Programm ist...
Beste Grüße
Marcus
Spoiler anzeigen
ich möchte Daten die von einem µC über RS232 kommen (10ms Takt, evtl. auch schneller min. 2ms) grafisch in einem rolling Chart darstellen (und in eine txt-Datei schreiben).
Zur Simulation generiert der Timer gerade Daten.
Im 1. Schritt habe ich in dem Timer Event alles gemacht. Ergebnis: Chart hat funktioniert, aber die Zeit zwischen den einzelnen Punkten
war nicht genau die Zeit des Timers, sondern um die Zeit der Abarbeitungszeit in dem Timer Event länger.
Also z.B. Timer Tick war 20ms --> Abstand Datenpunkte: 20ms + x
Eigentlich für die geplante Anwendung kein Problem, da ja RS232 benutzt wir. Gestört hat es mich aber trotzdem.
Dann die Auslagerung mit Backgroundworker.
Zuerst Chart Aktualisierung im DoWork Sub. Ergebnis: Chart zeigt nach wenigen Punkten ein rotes, Diagonales Kreuz und keine Linien mehr.
Dann das auf MSDN gelesen:
DoWork event handler.' data-guid="680180d0b7d73f68e3fd066e114af957">Im DoWork-Ereignishandler dürfen keine Benutzeroberflächenobjekte bearbeitet werden. ProgressChanged and RunWorkerCompleted events.' data-guid="929f2a39d2cc27c359372cfb4cef4c58">Verwenden Sie stattdessen zum Kommunizieren mit der Benutzeroberfläche das ProgressChanged-Ereignis und das RunWorkerCompleted-Ereignis.
und die Chart Aktualisierung in das RunWorkerCompleted Event gepackt.
Ergebnis: rotes, diagonal Kreuz kommt immer noch
Woran liegt es jetzt noch?
Für jede weitere Anregung ob das Chart Control für mein Vorhaben das Richtige ist bin ich dankbar, da das hier mein erstes VB Programm ist...
Beste Grüße
Marcus
VB.NET-Quellcode
- Option Strict On
- Imports System.Windows.Forms.DataVisualization.Charting
- Imports System.Threading
- Public Class Form1
- Dim datenreihe1 As New Series
- Dim datarow2 As New Series
- 'Dim datenreihetemp As New Series
- 'Dim datenreihetemp1 As New Series
- Dim queue As New Queue(Of Pointd)
- Dim queuetemp As New Queue(Of Pointd)
- Dim startzeit As Date = Now
- Dim jetzt As Date = Now
- Dim delta As New TimeSpan(10000)
- Dim zufall As New Random
- Dim first As Boolean = True
- Dim xachse As Double
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Control.CheckForIllegalCrossThreadCalls = False
- Dim titel As New System.Windows.Forms.DataVisualization.Charting.Title
- With Chart1
- .Series.Clear()
- titel = .Titles.Add("Speedtest")
- titel.ForeColor = Color.Black
- End With
- datenreihe1.ChartType = SeriesChartType.Line
- datarow2.ChartType = SeriesChartType.Line
- 'datenreihetemp.ChartType = SeriesChartType.Line
- 'datenreihetemp1.ChartType = SeriesChartType.Line
- 'Chart1.ChartAreas(0).AxisX.MajorGrid.Interval = 0.2
- 'Chart1.ChartAreas(0).AxisX.Interval = 0.1
- 'Chart1.ChartAreas(0).AxisX.IntervalAutoMode = IntervalAutoMode.FixedCount
- Chart1.ChartAreas(0).AxisY.MajorGrid.Interval = 10
- Chart1.ChartAreas(0).AxisY.Interval = 50
- End Sub
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- If BackgroundWorker1.IsBusy Then
- MsgBox("Busy")
- Else
- BackgroundWorker1.RunWorkerAsync()
- End If
- End Sub
- Private Sub btn_stop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_stop.Click
- Timer1.Stop()
- End Sub
- Private Sub btn_start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_start.Click
- Timer1.Start()
- End Sub
- Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- Dim liste As IList(Of Series) = New List(Of Series)
- Static datenreihetemp As New Series
- Static datenreihetemp1 As New Series
- datenreihetemp.ChartType = SeriesChartType.Line
- datenreihetemp1.ChartType = SeriesChartType.Line
- If first = True Then
- first = False
- startzeit = Now
- End If
- jetzt = Now
- delta = jetzt - startzeit
- Dim i_dummy As Integer = 0
- Dim zaehler As Integer = 0
- Static schleifenzaehler As Integer = 0
- Dim punkt As New Pointd(0, 0)
- Dim y As Double = zufall.Next(0, 300)
- Dim x As Double = CType(delta.TotalSeconds, Double)
- punkt.x = x
- punkt.y = y
- queue.Enqueue(punkt)
- queuetemp.Enqueue(punkt)
- zaehler = queue.Count
- schleifenzaehler += 1
- If zaehler = 300 Then
- punkt = queue.Dequeue
- datenreihetemp.Points.Clear()
- datenreihetemp1.Points.Clear()
- For i As Integer = 0 To zaehler - 2 Step 1
- punkt = queue.ElementAt(i)
- x = punkt.x
- y = punkt.y
- datenreihetemp.Points.AddXY(x, y)
- datenreihetemp1.Points.AddXY(x, zaehler)
- Next
- Else
- datenreihetemp.Points.AddXY(x, y)
- datenreihetemp1.Points.AddXY(x, zaehler)
- End If
- 'datenreihetemp.Name = "qwertz"
- 'datenreihe1 = datenreihetemp
- 'datenreihetemp1.Name = "affe"
- 'datarow2 = datenreihetemp1
- 'i_dummy = Chart1.Series.Count
- 'Chart1.Series.Clear()
- 'i_dummy = Chart1.Series.Count
- 'Chart1.Series.Add(datenreihe1)
- 'Chart1.Series.Add(datarow2)
- 'Chart1.ChartAreas(0).AxisX.Minimum = x - 0.5
- 'Timer1.Stop()
- liste.Add(datenreihetemp)
- liste.Add(datenreihetemp1)
- e.Result = liste
- xachse = x
- End Sub
- Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- Dim liste1 As List(Of Series) = New List(Of Series)
- Static counter As Integer = 0
- counter += 1
- If counter = 9 Then
- counter = 0
- End If
- liste1 = CType(e.Result(), Global.System.Collections.Generic.List(Of Global.System.Windows.Forms.DataVisualization.Charting.Series)
- Chart1.Series.Clear()
- datenreihe1.Name = "qwertz"
- datenreihe1 = liste1.Item(0)
- datarow2.Name = "qwertz1"
- datarow2 = liste1.Item(1)
- Chart1.Series.Add(datenreihe1)
- Chart1.Series.Add(datarow2)
- 'Chart1.ChartAreas(0).AxisX.Minimum = xachse - 2
- End Sub
- End Class