Hallo verehrtes Forum,
ich habe eine Aufgabenstellung bei der ich gerne dynamisch "Series" zu einem "Chart" hinzufügen möchte, je nachdem viele Kurven es zu zeichnen gibt. Des Weiteren möchte ich gerne von allen erstellten Kurven die Anzeige der einzelnen Kurven zur Laufzeit ein- und ausblenden können. Aktuell suche ich nach einem Ansatz, wie ich dies realisieren könnte.
Hintergrund:
Wir haben einen Datalogger, der pro Millisekunde bis zu 40 Prozessdaten aufnimmt und puffert realisiert. Wieviele bzw. welche Prozessdaten aufgenommen werden, kann verändert werden und ist daher variable.
Die Aufzeichnung der Prozessdaten geschieht zunächst auf der ADwin Gold II, einer Echtzeitsteuerung mit recht flotten DSP und mit Ethernet-Anbindung an unsere VB.NET GUI.
Unsere VB.NET GUI holt die Daten alle 100ms ab und schreibt sie in eine Datei. Es werden nur Wertänderungen geloggt um den die Logdateigröße klein zu halten.
So ergibt sich folgendes Format der Logfiles:
Zeitstempel; ID-Prozessdata; VALUE-Processdata; ID-Prozessdata; VALUE-Processdata; ID-Prozessdata; VALUE-Processdata ...etc.
Ich habe eine Beispiel Datei angehängt!
Das Loggen funktioniert einwandfrei, jetzt würden wir aber auch ganz gerne diese Daten komfortabel auf unserer GUI visualisieren.
Ich habe mir hierfür Beiträge vom "Erfinder des Rades" angeschaut wie etwa diesen Hier:
Chart - Sample
Ich kann mit meinem Wissensstand schlecht abschätzen ob ich für meinen Verwendungszweck tatsächlich typisierte Datasets benötige oder nicht. Letztendlich möchte ich eine variable Anzahl an XY-Kurven in einem Chart anzeigen (mehr nicht).
Ich dachte an eine Klasse, die alle Daten sowie eine property "ChartIsVisible" enthält, die dynamisch zur Laufzeit sooft instanziert wird, wie es eben Kurven zum zeichnen gibt.
Mein Code sieht aktuell wie folgt aus:
Ich möchte ganz dringend von solchen Konstrukten wie hier:
wegkommen. Ich bin mir sicher, dass die Instanzierung der Serien in einer Schleife geschehen kann, was mir fehlt ist der Ansatz, wie dies zu bewerkstelligen ist.
Über konstruktive Ideen würde ich mich freuen.
ich habe eine Aufgabenstellung bei der ich gerne dynamisch "Series" zu einem "Chart" hinzufügen möchte, je nachdem viele Kurven es zu zeichnen gibt. Des Weiteren möchte ich gerne von allen erstellten Kurven die Anzeige der einzelnen Kurven zur Laufzeit ein- und ausblenden können. Aktuell suche ich nach einem Ansatz, wie ich dies realisieren könnte.
Hintergrund:
Wir haben einen Datalogger, der pro Millisekunde bis zu 40 Prozessdaten aufnimmt und puffert realisiert. Wieviele bzw. welche Prozessdaten aufgenommen werden, kann verändert werden und ist daher variable.
Die Aufzeichnung der Prozessdaten geschieht zunächst auf der ADwin Gold II, einer Echtzeitsteuerung mit recht flotten DSP und mit Ethernet-Anbindung an unsere VB.NET GUI.
Unsere VB.NET GUI holt die Daten alle 100ms ab und schreibt sie in eine Datei. Es werden nur Wertänderungen geloggt um den die Logdateigröße klein zu halten.
So ergibt sich folgendes Format der Logfiles:
Zeitstempel; ID-Prozessdata; VALUE-Processdata; ID-Prozessdata; VALUE-Processdata; ID-Prozessdata; VALUE-Processdata ...etc.
Ich habe eine Beispiel Datei angehängt!
Das Loggen funktioniert einwandfrei, jetzt würden wir aber auch ganz gerne diese Daten komfortabel auf unserer GUI visualisieren.
Ich habe mir hierfür Beiträge vom "Erfinder des Rades" angeschaut wie etwa diesen Hier:
Chart - Sample
Ich kann mit meinem Wissensstand schlecht abschätzen ob ich für meinen Verwendungszweck tatsächlich typisierte Datasets benötige oder nicht. Letztendlich möchte ich eine variable Anzahl an XY-Kurven in einem Chart anzeigen (mehr nicht).
Ich dachte an eine Klasse, die alle Daten sowie eine property "ChartIsVisible" enthält, die dynamisch zur Laufzeit sooft instanziert wird, wie es eben Kurven zum zeichnen gibt.
Mein Code sieht aktuell wie folgt aus:
VB.NET-Quellcode
- Imports System.Windows.Forms.DataVisualization.Charting
- Imports System.IO
- Public Class FrmDatalogViewer
- Public MetaData As New List(Of String)
- Public PDMData As New List(Of String)
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles BtLoad.Click
- LoadDataFromFile()
- DrawChart()
- End Sub
- Sub LoadDataFromFile()
- Try
- Dim OFD As New OpenFileDialog()
- MetaData.Clear()
- PDMData.Clear()
- With OFD
- .Filter = "CSV-Files (*.csv)|*.csv"
- .RestoreDirectory = True
- .InitialDirectory = GTG_ODD_DEF_FOCUS_WOBBLE_SAVINGPATH
- If .ShowDialog() = Windows.Forms.DialogResult.OK Then
- If IO.File.Exists(.FileName) Then
- Using reader As StreamReader = New StreamReader(.FileName)
- Dim line As String
- line = reader.ReadLine ' Read first line.
- Dim i As Integer
- Do While (Not line Is Nothing) ' Loop over each line in file, While list is Not Nothing.
- If i <= 100 Then
- MetaData.Add(line) ' Meta
- Else
- PDMData.Add(line) ' PDM Data
- End If
- i += 1
- line = reader.ReadLine ' Read in the next line.
- Loop
- End Using
- End If
- End If
- End With
- Catch ex As Exception
- MsgBox(ex.Message & vbNewLine & ex.StackTrace)
- End Try
- End Sub
- Sub DrawChart()
- Try
- Dim ArrayLength As Integer
- Dim TimeInMs As Long
- Dim StringArr() As String
- Dim TimeStamp As String
- Dim TmpString As String
- Dim IxXlist As New List(Of Long)
- Dim IxYlist As New List(Of Single)
- Dim IyXlist As New List(Of Long)
- Dim IyYlist As New List(Of Single)
- Dim IlXlist As New List(Of Long)
- Dim IlYlist As New List(Of Single)
- Dim IbXlist As New List(Of Long)
- Dim IbYlist As New List(Of Single)
- Dim i As Long
- For Each element In PDMData
- TmpString = PDMData(i)
- i += 1
- If TmpString <> "" Then
- StringArr = TmpString.Split(";")
- ArrayLength = StringArr.Length
- TimeStamp = StringArr(0)
- Dim YValue As Single
- For k = 1 To ArrayLength Step 2
- Dim idx As Integer
- If Integer.TryParse(StringArr(k), idx) Then
- If Single.TryParse(StringArr(k + 1), YValue) Then
- Select Case idx
- Case 2
- IxXlist.Add(i)
- IxYlist.Add(YValue)
- Case 3
- IyXlist.Add(i)
- IyYlist.Add(YValue)
- Case 4
- IlXlist.Add(i)
- IlYlist.Add(YValue)
- Case 5
- IbXlist.Add(i)
- IbYlist.Add(YValue)
- End Select
- End If
- End If
- Next
- End If
- Next
- Chart1.Series.Clear()
- Dim SeriesIX = New DataVisualization.Charting.Series()
- SeriesIX.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIX.Points.DataBindXY(IxXlist, IxYlist)
- Dim SeriesIY = New DataVisualization.Charting.Series()
- SeriesIY.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIY.Points.DataBindXY(IyXlist, IyYlist)
- Dim SeriesIL = New DataVisualization.Charting.Series()
- SeriesIL.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIL.Points.DataBindXY(IlXlist, IlYlist)
- Dim SeriesIB = New DataVisualization.Charting.Series()
- SeriesIB.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIB.Points.DataBindXY(IbXlist, IbYlist)
- ' IX
- If CheckBox1.Checked Then
- Chart1.Series.Add(SeriesIX)
- Else
- Chart1.Series.Remove(SeriesIX)
- End If
- 'IY
- If CheckBox2.Checked Then
- Chart1.Series.Add(SeriesIY)
- Else
- Chart1.Series.Remove(SeriesIY)
- End If
- 'IL
- If CheckBox3.Checked Then
- Chart1.Series.Add(SeriesIL)
- Else
- Chart1.Series.Remove(SeriesIL)
- End If
- 'IB
- If CheckBox4.Checked Then
- Chart1.Series.Add(SeriesIB)
- Else
- Chart1.Series.Remove(SeriesIB)
- End If
- Catch ex As Exception
- MsgBox(ex.Message & vbNewLine & ex.StackTrace)
- End Try
- End Sub
- Private Sub FrmDatalogger_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- End Sub
- Private Sub Refresh_Click(sender As Object, e As EventArgs) Handles BtRefresh.Click
- DrawChart()
- End Sub
- End Class
Ich möchte ganz dringend von solchen Konstrukten wie hier:
VB.NET-Quellcode
- Dim SeriesIX = New DataVisualization.Charting.Series()
- SeriesIX.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIX.Points.DataBindXY(IxXlist, IxYlist)
- Dim SeriesIY = New DataVisualization.Charting.Series()
- SeriesIY.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIY.Points.DataBindXY(IyXlist, IyYlist)
- Dim SeriesIL = New DataVisualization.Charting.Series()
- SeriesIL.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIL.Points.DataBindXY(IlXlist, IlYlist)
- Dim SeriesIB = New DataVisualization.Charting.Series()
- SeriesIB.ChartType = DataVisualization.Charting.SeriesChartType.Point
- SeriesIB.Points.DataBindXY(IbXlist, IbYlist)
- ' IX
- If CheckBox1.Checked Then
- Chart1.Series.Add(SeriesIX)
- Else
- Chart1.Series.Remove(SeriesIX)
- End If
- 'IY
- If CheckBox2.Checked Then
- Chart1.Series.Add(SeriesIY)
- Else
- Chart1.Series.Remove(SeriesIY)
- End If
- 'IL
- If CheckBox3.Checked Then
- Chart1.Series.Add(SeriesIL)
- Else
- Chart1.Series.Remove(SeriesIL)
- End If
- 'IB
- If CheckBox4.Checked Then
- Chart1.Series.Add(SeriesIB)
- Else
- Chart1.Series.Remove(SeriesIB)
- End If
wegkommen. Ich bin mir sicher, dass die Instanzierung der Serien in einer Schleife geschehen kann, was mir fehlt ist der Ansatz, wie dies zu bewerkstelligen ist.
Über konstruktive Ideen würde ich mich freuen.