Hallo VB Gemeinde,
zunächst einmal vielen Dank an alle die hier fleißig posten um zu helfen. Das hat mir bisher immer viel geholfen, doch jetzt bin ich an einem Punkt, an dem ich auch mal eine Frage habe.
Kurz zu mir: Ich bin Joe, 44 Jahre alt. Vor gut acht Jahren habe ich mit Bierbrauen im Keller angefangen. Da ich beruflich in der Automatisierungsbranche tätig bin hab ich sofort angefangen, zeitintensive Prozesse zu automatisieren. Da ich vom Programmieren keine Ahnung habe/hatte, begann ich mit MS Access und VBA eine Steuerung über serielle Schnittstelle zu basten. Das ganze ist aber nun an seine Grenzen gestoßen und ich bin nun auf VB umgestiegen. Alle meine Programmierkenntnisse in VB habe ich von VBA adaptiert und aus diversen Foren, vor allem von vb-paradise.
Nun zur meiner Frage:
Ich habe die serielle Kommunikation in eine DLL gepackt um von der GUI unabhängig zu sein. Ich habe unter anderem eine List-Objekt geschaffen (Code siehe unten), welches die Daten aufbereitet und als
bereitstellt. Neue hinzugefügte Werte werden dann mit
in die „DataSeries“ aufgenommen. Das klappt soweit wie gewünscht. Wenn ich jetzt in einer Forms-Anwendung die „DataSeries“ einer „Series“-Auflistung eines „Chart-Controls“ hinzufüge, wird das Diagramm entsprechend angezeigt und aktualisiert.
Mein Problem ist, das beim Schließen des Fensters mit dem Diagramm, die „Points-Auflistung“ der „DataSeries“ auf „Nothing“ gesetzt wird und natürlich eine "Exception" auslöst. Das ist nicht erwünscht. Da die Werte erhalten bleiben sollen.
Ich habe gesehen, das es noch weitere Möglichkeiten wie z.B. „DataBindings“ gibt, Daten an ein „Chart-Control“ zu binden.
Welche Methode der Datenbindung würdet Ihr für meine Situation empfehlen?
Danke an alle die Antworten bereits im Voraus.
Gruß
JOE
Spoiler anzeigen
zunächst einmal vielen Dank an alle die hier fleißig posten um zu helfen. Das hat mir bisher immer viel geholfen, doch jetzt bin ich an einem Punkt, an dem ich auch mal eine Frage habe.
Kurz zu mir: Ich bin Joe, 44 Jahre alt. Vor gut acht Jahren habe ich mit Bierbrauen im Keller angefangen. Da ich beruflich in der Automatisierungsbranche tätig bin hab ich sofort angefangen, zeitintensive Prozesse zu automatisieren. Da ich vom Programmieren keine Ahnung habe/hatte, begann ich mit MS Access und VBA eine Steuerung über serielle Schnittstelle zu basten. Das ganze ist aber nun an seine Grenzen gestoßen und ich bin nun auf VB umgestiegen. Alle meine Programmierkenntnisse in VB habe ich von VBA adaptiert und aus diversen Foren, vor allem von vb-paradise.
Nun zur meiner Frage:
Ich habe die serielle Kommunikation in eine DLL gepackt um von der GUI unabhängig zu sein. Ich habe unter anderem eine List-Objekt geschaffen (Code siehe unten), welches die Daten aufbereitet und als
Public ReadOnly Property DataSeries As New Charting.Series()
(Zeile 15)bereitstellt. Neue hinzugefügte Werte werden dann mit
DataSeries.Points.AddXY(objSampledValue.TimeStamp, objSampledValue.Value)
(Zeile 77)in die „DataSeries“ aufgenommen. Das klappt soweit wie gewünscht. Wenn ich jetzt in einer Forms-Anwendung die „DataSeries“ einer „Series“-Auflistung eines „Chart-Controls“ hinzufüge, wird das Diagramm entsprechend angezeigt und aktualisiert.
crtSensor1.Series.Add(objSensor.MeasuredValues.DataSeries)
crtSensor1.Series.Add(objSensor.MovingAverages.DataSeries)
Mein Problem ist, das beim Schließen des Fensters mit dem Diagramm, die „Points-Auflistung“ der „DataSeries“ auf „Nothing“ gesetzt wird und natürlich eine "Exception" auslöst. Das ist nicht erwünscht. Da die Werte erhalten bleiben sollen.
Ich habe gesehen, das es noch weitere Möglichkeiten wie z.B. „DataBindings“ gibt, Daten an ein „Chart-Control“ zu binden.
Welche Methode der Datenbindung würdet Ihr für meine Situation empfehlen?
Danke an alle die Antworten bereits im Voraus.
Gruß
JOE
VB.NET-Quellcode
- Imports BrewMaticCore
- Imports System.Windows.Forms.DataVisualization
- Public Class ValueList
- Inherits List(Of Value)
- Private Const intSamplingRateMilliseconds As Integer = 500
- Private datNextSample As Date
- Public ReadOnly Property DataSeries As New Charting.Series()
- Private Sub Quantize()
- Dim objLastValue As SensorValue = Nothing
- Dim objCurrentValue As SensorValue = Last
- Dim objSampledValue As SensorValue = Nothing
- If Count = 1 Then
- Dim intFirstSampleMillisecond As Integer = Math.Round((objCurrentValue.TimeStamp.Millisecond / intSamplingRateMilliseconds) + 0.5, 0) * intSamplingRateMilliseconds
- If intFirstSampleMillisecond = 1000 Then
- intFirstSampleMillisecond = 0
- End If
- datNextSample = objCurrentValue.TimeStamp.AddMilliseconds(intFirstSampleMillisecond - objCurrentValue.TimeStamp.Millisecond)
- ElseIf Count >= 2 Then
- objLastValue = Item(Count - 2)
- End If
- If objCurrentValue.TimeStamp > datNextSample Then
- objSampledValue = objCurrentValue
- If Not IsNothing(objLastValue) Then
- If objLastValue.TimeStamp >= datNextSample Then
- objSampledValue = objLastValue
- Else
- Dim intNextSampleMillisecond As Integer = IIf(datNextSample.Millisecond = 0, 1000, datNextSample.Millisecond)
- Dim intLastValueMillisecond As Integer = IIf(objLastValue.TimeStamp.Millisecond = 0, 1000, objLastValue.TimeStamp.Millisecond)
- Dim intCurrentValueMillisecond As Integer = IIf(objCurrentValue.TimeStamp.Millisecond = 0, 1000, objCurrentValue.TimeStamp.Millisecond)
- If Math.Abs(intNextSampleMillisecond - intLastValueMillisecond) < Math.Abs(intCurrentValueMillisecond - intNextSampleMillisecond) Then
- objSampledValue = objLastValue
- End If
- End If
- End If
- objSampledValue.TimeStamp = datNextSample
- DataSeries.Points.AddXY(objSampledValue.TimeStamp, objSampledValue.Value)
- datNextSample = datNextSample.AddMilliseconds(intSamplingRateMilliseconds)
- End If
- End Sub
- Public Shadows Sub Add(Item As Value)
- MyBase.Add(Item)
- Quantize()
- End Sub
- Public Sub New()
- DataSeries.ChartType = Charting.SeriesChartType.Line
- DataSeries.XValueType = Charting.ChartValueType.Time
- End Sub
- End Class
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „JoachimStein“ ()