none
problemi con visualizzazione di segnali RRS feed

  • Domanda

  • Buongiorno.

    Ho usato con buono esito il control chart per visualizzare vari segnali in arrivo da apparecchiature.

    Dovendo, in un caso, visualizzare in tempo reale (come facevo con VB6), ho notato che il controllo era troppo lento.

    Allora ho pensato di tracciare il grafico direttamente su un form mediante drawline, ma mi sembra che su picturebox è più

    rapido. Comunque è sempre più lento che con il precedente VB6. Ho provato sempre sfruttando l'evento "paint" (ma anche non, senza differenze)

    Sul sito USA non sono stati specifici se non dirmi di studiare meglio la grafica e che VB6 non è più veloce.

    Gli esempi che mi hanno proposto non c'entrano con quello che devo fare.

    Avete qualche consiglio? Se interessati posso fornire i dettagli.

    Enzo

    lunedì 13 aprile 2020 19:19

Risposte

  • Salve a tutti.

    Il problema è risolto, usando un picturebox in evento paint.

    Chart è, come ho detto, molto lento.

    Ad ogni tick (12.5Hz o 8Hz) ridisegno tutto il segnale, così ho una finestra con il segnale che cresce nel tempo.

    Se si desidera il codice lo pubblico.

    Grazie per gli aiuti, Enzo

    mercoledì 15 aprile 2020 14:16
  • Ho chiesto per non intasare il sito. Il listato seguente produce una finestra che si riempie man mano di valori casuali:

    Imports System.IO.Ports Imports System.Threading Imports System.Math Imports System.ComponentModel Imports System.Windows.Forms.DataVisualization.Charting Public Class Corrente Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick timer_end = True End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim stopWatch As New Stopwatch() Timer1.Interval = 10 'Max speed abilita = True Timer1.Enabled = True max = 0 min = 1000 stopWatch.Restart() n = 0 Do punti(n) = 50 * (Rnd() - 0.5) While timer_end = False Application.DoEvents() End While timer_end = False n = n + 1 PictureBox1.Invalidate() 'genera evento paint Dim ts As TimeSpan = stopWatch.Elapsed If ts.Milliseconds > max Then max = ts.Milliseconds Label3.Text = Format(1000 / max, "#.#") End If If ts.Milliseconds < min Then min = ts.Milliseconds Label4.Text = Format(1000 / min, "#.#") End If tempo = tempo + ts.Milliseconds s = s + 1 If s = 101 Then Label1.Text = Format(s * 1000 / tempo, "#.#") 'in Hz tempo = 0 s = 0 End If stopWatch.Restart() Loop End Sub Private Sub Corrente_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim N As Long N = 5000 myPen = New Pen(Drawing.Color.White, 2) abilita = False ReDim punti(N) deltax = PictureBox1.Width / N offset = PictureBox1.Height / 2 End Sub Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint x1 = 0 For punti_grafico = 0 To n e.Graphics.DrawLine(myPen, x1, yprec + offset, x1 + deltax, punti(punti_grafico) + offset) yprec = punti(punti_grafico) x1 = x1 + deltax Next End Sub End Class

    Il codice seguente confronta la visualizzazione di un grafico su picturebox e su chart:

    Imports System.Threading
    Imports System.Math
    Imports System.IO
    Imports System.ComponentModel
    Imports System.Windows.Forms.DataVisualization.Charting
    Public Class Normale
        Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
            If RadioButton1.Checked = True Then
                tipo_grafico = "PictureBox"
                max = 0
                min = 1000
            End If
        End Sub
    
        Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
            If RadioButton2.Checked = True Then
                Chart1.ChartAreas(0).AxisX.Maximum = n_samples
                Chart1.ChartAreas(0).AxisX.Minimum = 0
                Chart1.ChartAreas(0).AxisY.Maximum = 100
                Chart1.ChartAreas(0).AxisY.Minimum = -100
                Chart1.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.FastLine
                Chart1.Series(0).Color = Color.Black
                tipo_grafico = "CHART"
                max = 0
                min = 1000
            End If
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            timer_end = True
        End Sub
    
        Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
            n_samples = NumericUpDown1.Value
            deltax = timer_x.Width / n_samples
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Timer1.Enabled = False
        End Sub
    
        Private Sub timer_x_Click(sender As Object, e As EventArgs) Handles timer_x.Click
    
        End Sub
    
        Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            BackColor = Color.BlanchedAlmond
            n_samples = 1500
            myPen = New Pen(Drawing.Color.White, 2)
            NumericUpDown1.Value = n_samples
    
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myGraphics As Graphics = Me.CreateGraphics
            Dim stopWatch As New Stopwatch()
    
            Timer1.Interval = 100
            ferma = False
            offset = timer_x.Height / 2
            deltax = timer_x.Width / n_samples
            Timer1.Enabled = True
            stopWatch.Restart()
    
            s = 0
            Do
                'stopWatch.Restart()
    
                While timer_end = False
                    Application.DoEvents()
                End While
                timer_end = False
    
                For n = 0 To n_samples
                    y1(n) = (Rnd() - 0.5) * 50
                Next
    
                Select Case tipo_grafico
                    Case "PictureBox"
                        timer_x.Invalidate()                    'genera evento paint
                        yprec = 0
                    Case "CHART"
                        Chart1.Series(0).Points.Clear()
                        Call grafico_chart()
                    Case "Form"
    
                End Select
    
                If ferma = True Then
                    Exit Do
                End If
    
                Application.DoEvents()
                stopWatch.Stop()
                Dim ts As TimeSpan = stopWatch.Elapsed
    
                If ts.Milliseconds > max Then
                    max = ts.Milliseconds
                    Label3.Text = Format(1000 / max, "#.#")
                End If
    
                If ts.Milliseconds < min Then
                    min = ts.Milliseconds
                    Label4.Text = Format(1000 / min, "#.#")
                End If
    
                tempo = tempo + ts.Milliseconds
                s = s + 1
                If s = 101 Then
                    Label1.Text = Format(s * 1000 / tempo, "#.#")              'in Hz
                    tempo = 0
                    s = 0
                End If
                stopWatch.Restart()
            Loop
        End Sub
    
        Private Sub timer_x_Paint(sender As Object, e As PaintEventArgs) Handles timer_x.Paint
            ' e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            If abilita = True Then
                e.Graphics.Clear(Color.LightGray)
            End If
            x1 = 0
            For n = 1 To n_samples - 1
                ' Draw line to screen.
                e.Graphics.DrawLine(myPen, x1, yprec + offset, x1 + 1, y1(n) + offset)
                yprec = y1(n)
                x1 = x1 + deltax
            Next
        End Sub
    
    End Class
    

    mercoledì 15 aprile 2020 16:10

Tutte le risposte

  • Dai un'occhiata qui https://codes-sources.commentcamarche.net/source/50662-effect-oscilloscope-cardiograph-using-vb-net

    Se non risolvi posta il codice che stai usando

    martedì 14 aprile 2020 05:12
  • Grazie patel45, a prima vista il software oscillo si avvicina molto a quello che mi serve.

    Dopo tante domande in USA...........

    Farò sapre.

    Grazie, Enzo

    martedì 14 aprile 2020 09:40
  • Purtroppo usa delle risorse di Window: GDI32.DLL per il grafico.

    Pensavo usasse Visual Studio integralmente.

    Cerco di fare un semplice esempio del problema e lo allego.

    Non userò il control chart perchè anche se sarebbe più facile è estremamente lento; il suo tempo è del tipo A + B*N, ove N sta per numero si punti.

    Purtroppo anche con N bassi A è incombente. 

    Enzo


    martedì 14 aprile 2020 10:26
  • Io non ho capito niente. La proposta funziona, ma non vuole usarla e vuole qualche cosa diverso? O c'e' altro che mi scappa?

    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    mercoledì 15 aprile 2020 08:24
    Moderatore
  • Salve a tutti.

    Il problema è risolto, usando un picturebox in evento paint.

    Chart è, come ho detto, molto lento.

    Ad ogni tick (12.5Hz o 8Hz) ridisegno tutto il segnale, così ho una finestra con il segnale che cresce nel tempo.

    Se si desidera il codice lo pubblico.

    Grazie per gli aiuti, Enzo

    mercoledì 15 aprile 2020 14:16
  • Non è corretto utilizzare il forum solo per prendere ma quando si può si dovrebbe anche DARE, pubblicare il codice potrebbe essere utile ad altri.
    mercoledì 15 aprile 2020 15:03
  • Ho chiesto per non intasare il sito. Il listato seguente produce una finestra che si riempie man mano di valori casuali:

    Imports System.IO.Ports Imports System.Threading Imports System.Math Imports System.ComponentModel Imports System.Windows.Forms.DataVisualization.Charting Public Class Corrente Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick timer_end = True End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim stopWatch As New Stopwatch() Timer1.Interval = 10 'Max speed abilita = True Timer1.Enabled = True max = 0 min = 1000 stopWatch.Restart() n = 0 Do punti(n) = 50 * (Rnd() - 0.5) While timer_end = False Application.DoEvents() End While timer_end = False n = n + 1 PictureBox1.Invalidate() 'genera evento paint Dim ts As TimeSpan = stopWatch.Elapsed If ts.Milliseconds > max Then max = ts.Milliseconds Label3.Text = Format(1000 / max, "#.#") End If If ts.Milliseconds < min Then min = ts.Milliseconds Label4.Text = Format(1000 / min, "#.#") End If tempo = tempo + ts.Milliseconds s = s + 1 If s = 101 Then Label1.Text = Format(s * 1000 / tempo, "#.#") 'in Hz tempo = 0 s = 0 End If stopWatch.Restart() Loop End Sub Private Sub Corrente_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim N As Long N = 5000 myPen = New Pen(Drawing.Color.White, 2) abilita = False ReDim punti(N) deltax = PictureBox1.Width / N offset = PictureBox1.Height / 2 End Sub Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint x1 = 0 For punti_grafico = 0 To n e.Graphics.DrawLine(myPen, x1, yprec + offset, x1 + deltax, punti(punti_grafico) + offset) yprec = punti(punti_grafico) x1 = x1 + deltax Next End Sub End Class

    Il codice seguente confronta la visualizzazione di un grafico su picturebox e su chart:

    Imports System.Threading
    Imports System.Math
    Imports System.IO
    Imports System.ComponentModel
    Imports System.Windows.Forms.DataVisualization.Charting
    Public Class Normale
        Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChanged
            If RadioButton1.Checked = True Then
                tipo_grafico = "PictureBox"
                max = 0
                min = 1000
            End If
        End Sub
    
        Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChanged
            If RadioButton2.Checked = True Then
                Chart1.ChartAreas(0).AxisX.Maximum = n_samples
                Chart1.ChartAreas(0).AxisX.Minimum = 0
                Chart1.ChartAreas(0).AxisY.Maximum = 100
                Chart1.ChartAreas(0).AxisY.Minimum = -100
                Chart1.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.FastLine
                Chart1.Series(0).Color = Color.Black
                tipo_grafico = "CHART"
                max = 0
                min = 1000
            End If
        End Sub
    
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            timer_end = True
        End Sub
    
        Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
            n_samples = NumericUpDown1.Value
            deltax = timer_x.Width / n_samples
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Timer1.Enabled = False
        End Sub
    
        Private Sub timer_x_Click(sender As Object, e As EventArgs) Handles timer_x.Click
    
        End Sub
    
        Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            BackColor = Color.BlanchedAlmond
            n_samples = 1500
            myPen = New Pen(Drawing.Color.White, 2)
            NumericUpDown1.Value = n_samples
    
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myGraphics As Graphics = Me.CreateGraphics
            Dim stopWatch As New Stopwatch()
    
            Timer1.Interval = 100
            ferma = False
            offset = timer_x.Height / 2
            deltax = timer_x.Width / n_samples
            Timer1.Enabled = True
            stopWatch.Restart()
    
            s = 0
            Do
                'stopWatch.Restart()
    
                While timer_end = False
                    Application.DoEvents()
                End While
                timer_end = False
    
                For n = 0 To n_samples
                    y1(n) = (Rnd() - 0.5) * 50
                Next
    
                Select Case tipo_grafico
                    Case "PictureBox"
                        timer_x.Invalidate()                    'genera evento paint
                        yprec = 0
                    Case "CHART"
                        Chart1.Series(0).Points.Clear()
                        Call grafico_chart()
                    Case "Form"
    
                End Select
    
                If ferma = True Then
                    Exit Do
                End If
    
                Application.DoEvents()
                stopWatch.Stop()
                Dim ts As TimeSpan = stopWatch.Elapsed
    
                If ts.Milliseconds > max Then
                    max = ts.Milliseconds
                    Label3.Text = Format(1000 / max, "#.#")
                End If
    
                If ts.Milliseconds < min Then
                    min = ts.Milliseconds
                    Label4.Text = Format(1000 / min, "#.#")
                End If
    
                tempo = tempo + ts.Milliseconds
                s = s + 1
                If s = 101 Then
                    Label1.Text = Format(s * 1000 / tempo, "#.#")              'in Hz
                    tempo = 0
                    s = 0
                End If
                stopWatch.Restart()
            Loop
        End Sub
    
        Private Sub timer_x_Paint(sender As Object, e As PaintEventArgs) Handles timer_x.Paint
            ' e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
            If abilita = True Then
                e.Graphics.Clear(Color.LightGray)
            End If
            x1 = 0
            For n = 1 To n_samples - 1
                ' Draw line to screen.
                e.Graphics.DrawLine(myPen, x1, yprec + offset, x1 + 1, y1(n) + offset)
                yprec = y1(n)
                x1 = x1 + deltax
            Next
        End Sub
    
    End Class
    

    mercoledì 15 aprile 2020 16:10