Graph en temps réel (mschart)

Soyez le premier à donner votre avis sur cette source.

Vue 14 969 fois - Téléchargée 2 221 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
Messages postés
3
Date d'inscription
jeudi 14 avril 2011
Statut
Membre
Dernière intervention
3 mai 2011

Bon sa fait presque un an mais je demande quand même on verra si j'ai une réponse !!!

Voila ton code ne fonctionne pas avec moi (je travail sous visual studio 2008 version standard). Le problème c'est que j'ai fais comme tu as dit un module que j'ai appelé "Graphique" où dedans je met le début de ton code et dans ma forme principale je met un Chart appelé Graph comme toi !!! Mais le seul soucis avec moi c'est que le code ne fonctionne pas. En effet dans le chart en rentrant ton bout de code cela me met plein d'erreurs donc je ne comprends pas si quelqu'un pouvait m'aider j'en serait ravi !!!

ps : je débute en VB (a peine 1 semaine) mais on me demande de réaliser une fonction graphique permettant de dessiner un axe graphique et que chaque trait de graduation soit espacé de 1cm a l'impression ET je ne sais pas du tout comment faire si on peux m'aider sa serait cool merci d'avance a ceux qui pourront m'aider
Messages postés
44
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
5 décembre 2009

à vbs6x
regarde la partie 2 du source.
Il y a 2 répertoires avec 2 façons de voir le source différemment.

Je suis heureux que ce source vous aide.
J'avais pris du bonheur à le faire.

Depuis je ne travaille plus bcp en développement mais j'aimerais vraiment reprendre... Si il y en a qui ont des idées...
Messages postés
4
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
26 décembre 2009

Bonsoir,

c'est vraiment génial cette source!

Est-il possible:
1) de faire défiler la courbe ?
2) toujours à la même échelle ?
(C'est à dire de la déplacer au fur et à mesure qu'elle se crée sans quelle se compresse et devienne illisible ?

Merci :)
Messages postés
14
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
16 décembre 2009

La, je dois bien dire que tu vas me venir en aide avec ton ZIP, je travail aussi avec des appareil de mesure et des capteurs mais mon logiciel n’est pas encore très au point :D .
Sur ceux, bonne continuation … et merci …
Messages postés
7
Date d'inscription
mardi 21 mars 2006
Statut
Membre
Dernière intervention
5 mai 2009

pff le boulet!
je n'avais pas vu que tu le forcais dans ton code...

Désolé, et encore bravo pour ta source.
Afficher les 13 commentaires

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.