Graph en temps réel (mschart)

5/5 (13 avis)

Vue 15 464 fois - Téléchargée 2 233 fois

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

Ajouter un commentaire Commentaires
cs_renardeau Messages postés 44 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 décembre 2009
29 juil. 2004 à 10:17
j'ai oublié de signaler, il faut 2 données pour que le graphe se dessine (ca me parrait logique il faut 2 point pour un trait) mais ce ne l'est peut)etre pas pour tout le monde
FroyGe Messages postés 4 Date d'inscription mercredi 24 mars 2004 Statut Membre Dernière intervention 26 septembre 2004
30 juil. 2004 à 01:53
'a mettre dans un module
Biensur....c'est quoi ? :p
cs_renardeau Messages postés 44 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 5 décembre 2009
30 juil. 2004 à 10:13
rassues moi, tu rigoles ...


Si ce n'est pas le cas vas vite chercher un cours de VB sur le NET ;)
cs_denis21 Messages postés 1 Date d'inscription samedi 27 novembre 2004 Statut Membre Dernière intervention 27 novembre 2004
27 nov. 2004 à 17:14
je dois faire aussi un graphique temps reel, j'ai testé ta solution, j'ai peut-être bien loupé qlq chose.. mais à partir d'un moment, le graphique clignote aussi avec cette solution! Quand RowCount arrive à 1000, le clignotement devient sérieux...
et comme toi tu vas jusque 32 000, comment tu fais pr ne pas avoir de clignotement ??
Est-ce que tu pourrais mettre le zip stp..

D'avance merci.

Denis.
puje_fr Messages postés 7 Date d'inscription mardi 21 mars 2006 Statut Membre Dernière intervention 5 mai 2009
19 juil. 2008 à 14:18
Bonjour,
Excellent ta source!
J'ai cependant un petit souci, je n'arrive pas à faire afficher les valeurs négatives...
Une idée?

Merci.

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.