Graph en temps réel (mschart)

Description

après avoir vu un code ici
http://www.vbfrance.com/code.aspx?ID=16976
Je me suis dit que j'allais mettre aussi le mien

j'ai un appareil qui m'envois des données (via le port com - mais c'est pas l'objet ici) toutes les secondes. j'en fait un graphe (courbe) si la fenêtre est ouverte. et pas si elle est fermée (travail un peu comme un pop-up)

Créer une forme "capteur1" Dans lequel vous mettre un MSCHART que vous nommez "Graph"
Il doit avoir plusieurs propriété pour avoir de belles courbes mais vous trouverez au fur et a mesures de vos recherche (bouton droit sur l'objet MSChart -> propriété).

Je peux avoir 4 capteurs maximum (capteur1->capteur4)

Ayez une forme qui envois les données (fonction graph) et qui ouvre la forme du capteur pour voir le graphe.

Source / Exemple :


'a mettre dans un module
'''''''''''''''''''''''''''''''''''''''''''''''''''''''

Dim YMax(4) As Double
Dim YMin(4) As Double
Dim XMax(4) As Long
Dim XMin(4) As Long

'heure : l'heure de l'aquisition
'data : la valeure de l'aquisition
'capteur : le nom de la forme "capteur1"
'NomCapteur : le nom pour le titre de la forme

Function Graph(Heure As String, data As Double, capteur As String, NomCapteur As String)
Dim NumCap As Integer
Dim f As Form
For Each f In Forms
    If f.Name = capteur Then                    'on recherche pour voir si la forme est active
        NumCap = Int(Mid(capteur, 8, 1))
            
        If f.Graph.Tag = "" Then
'première édition
            YMax(NumCap) = 0
            YMin(NumCap) = Val(999999.9999) 'valeure max pour mes capteurs
            f.Graph.Tag = "fin"
            f.Graph.ColumnCount = 1         '1 seul capteur
            f.Graph.RowCount = 0            'pas de données
            f.Graph.Plot.Axis(2).AxisScale.Hide = True  'on cache les valeure numérique à droite
            With f.Graph.Plot.Axis(VtChAxisIdY) 'on définit l'axe des Y
                .CategoryScale.Auto = False
                .CategoryScale.DivisionsPerLabel = 3
                .CategoryScale.DivisionsPerTick = 3
                .CategoryScale.LabelTick = True
                .ValueScale.MinorDivision = 0
            End With
            'Les noms des axes et du graphique
            f.Graph.Plot.Axis(VtChAxisIdY).AxisTitle.Text = "HZ"      'je recois une frequence
            f.Graph.Plot.Axis(VtChAxisIdX).AxisTitle.Text = "Heure" 'par rapport au temps

            With f.Graph.Plot.Axis(VtChAxisIdX) 'on définit l'axe des Y
                .CategoryScale.Auto = False
                .CategoryScale.DivisionsPerLabel = 5
                .CategoryScale.DivisionsPerTick = 5
                .CategoryScale.LabelTick = True
                .ValueScale.MinorDivision = 0
            End With
            XMin(NumCap) = Int(Mid(Heure, 1, 2) * 10000 + Mid(Heure, 4, 2) * 100 + Mid(Heure, 7, 2))

            'le nom de la forme... retiré du titre du graph car prend trop de place !
            f.Caption = NomCapteur
        End If

        
        
'a tous les coups
    f.Graph.Column = 1
        'On choisit le capteur 1
        
        '
        '   si le graphe a plus de 32 767 données il plante :(
        '   32767 est la donnée max pour un integer !
        '
        If f.Graph.RowCount >= 32767 Then
          'décalage de 1 donnée sur la gauche
          'on perd la donnée de gauche
          For j = 2 To 32767
            f.Graph.Row = j
            TempHeure$ = f.Graph.RowLabel
            TempData% = f.Graph.data
            f.Graph.Row = j - 1
            f.Graph.RowLabel = TempHeure$
            f.Graph.data = TempData%
          Next
          f.Graph.Row = 32767
        Else
        'on continue à compter
          f.Graph.RowCount = f.Graph.RowCount + 1
        End If
        'dernière donnée
        f.Graph.Row = f.Graph.RowCount
        f.Graph.RowLabel = Heure        'mettre l'heure sur le graphe
        f.Graph.data = data             'mettre la donnée sur le graphe
        
        
        If YMax(NumCap) < data Then YMax(NumCap) = data + (10 - (data Mod 10))
        If YMin(NumCap) > data Then YMin(NumCap) = data - (data Mod 10)
'axes des Y
        If YMax(NumCap) - YMin(NumCap) < 11 Then
            f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = YMax(NumCap) - YMin(NumCap)
        Else
            f.Graph.Plot.Axis(VtChAxisIdY).ValueScale.MajorDivision = 10
        End If
        
        With f.Graph.Plot.Axis(VtChAxisIdY)
            .ValueScale.Maximum = YMax(NumCap)
            .ValueScale.Minimum = YMin(NumCap)
        End With
'Axes des X
If f.Graph.RowCount < 11 Then
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = 1
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = 1
Else
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerLabel = Int(f.Graph.RowCount / 10)
        f.Graph.Plot.Axis(VtChAxisIdX).CategoryScale.DivisionsPerTick = Int(f.Graph.RowCount / 10)
End If

    End If
    'fin de la forme
Next
End Function

'''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''''''
'''    Dans votre forme Capteur1
''     où il y a 1 MSCHARt nommé graph
'''   mettez ce code
'''''''''''''''''''''''''''''''''''''''''''''''''''

Dim lar As Long, lng As Long

Private Sub Form_Load()
    lng = Me.Width
    lar = Me.Height
    Graph.Top = 0
    Graph.Left = 0
    Graph.Width = lng
    Graph.Height = lar - 200
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Blue = False
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Green = False
    Graph.Plot.SeriesCollection(1).Pen.VtColor.Red = True
End Sub

Private Sub Form_Resize()
Dim ctl As Control
If (Me.WindowState = 1) Then Exit Sub

For Each ctl In Me.Controls
    If TypeOf ctl Is ComboBox Then
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, ctl.Width * Me.Width / lng
    Else
        'Les comboboxes ont leur propriété Height en lecture seule
        ctl.Move ctl.Left * Me.Width / lng, ctl.Top * Me.Height / lar, _
           ctl.Width * Me.Width / lng, ctl.Height * Me.Height / lar
    End If
Next

lng = Me.Width
lar = Me.Height
End Sub

Conclusion :


'''''''''''''''''''''''''''''''
'' Vous appelez le tout de la sorte
'''''''''''''''''''''''''''''''

Graph(date(), 123456.1234, "Capteur1", "Titre de mon graphe")

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.