Tableau

chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012 - 2 juil. 2007 à 08:53
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012 - 10 juil. 2007 à 08:10
Bonjour à tous, je débute en VB6 et on m'a confié un programme !

Je reçois des valeurs en continue provenant d'un microcontrolleur sur une meme Textbox. Je souhaiterais récupérer toutes les valeurs et les mettre dans un tableau pour pouvoir faire en continue la moyenne des 20 dernières valeurs et afficher le graphique de la moyenne sur VB6.

Est-ce que quelqu'un peut m'aider ???

Merci d'avance

31 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 juil. 2007 à 15:32
Salut JMF,
Il faudrait alors qu'il garde en mémoire le premier élément des 20 derniers... Il me semble que le tableau serait plus simple, non ?

Mais te connaissant ..., j'imagine que tu vas nous sortir une autre de tes idées "abracadabrante" ?

MPi
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
2 juil. 2007 à 16:03
Salut MPI,


 


Oui, tu as raison, j'aime bien rigoler !


 


Alors voilà (ici avec une listbox)


Private Sub Command2_Click()
  Static toto As Single
  nb = 0
  monnombre = 3 ' c'est ici que tu mets le nombres de "derniers" sur lesquels faire la moyenne
  For i = 1 To 40
    List1.AddItem CStr(i) '  juste pour dire que j'envoie des strings (pas de tricherie, donc)
    'on va ici oublier le i (pour "jouer le jeu" sans tricher)
      toto = toto + Val(List1.List(nb))
      If nb > monnombre - 1 Then toto = toto - Val(List1.List(nb - monnombre))
    nb = nb + 1    If nb < monnombre Then titi nb Else titi monnombre
    MsgBox "total  des " & monombre & " derniers = " & toto & vbCrLf & _
    "ce qui donne une moyenne de " & toto / titi & " pour les " & monnombre & " derniers"
  Next
End Sub

Cà, c'est parce que j'ai pas encore bu mon pastis ...


 
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 juil. 2007 à 16:35
Et j'imagine que tu aimes encore plus rigoler après ledit pastis (?) 

On a donc le choix, ici, entre un tableau et une Listbox ... le deuxième permettant éventuellement de visualiser facilement les données ...

MPi
0
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012
2 juil. 2007 à 16:53
j'arrive bien a faire ma moyenne, merci à vous pour votre aide !!!
j'affiche cette moyenne dans une textbox, mais comment peut-on enlever les chiffres apres la virgule ???
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 juil. 2007 à 18:50
Avec Int, Cint, Round, ...
Textbox.text = Cint(MaValeur)

Tout dépend si tu veux arrondir ou simplement enlever les décimales... J'imagine que c'est la première méthode qui t'intéresse...

MPi
0
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012
3 juil. 2007 à 08:14
ok merci, Cint(mavaleur) fonctionne tres bien !!!
0
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012
9 juil. 2007 à 08:47
Bonjour à tous.
Suite à la création de mon tableau, je reçois bien ma valeur moyenne en continue.
La communication se fait bien avec le port série mais il y a un problème qui intervient...
En fait j'ai 2 boutons de commande : un "connecter/déconncter" quand je clique 1 fois le port série est ouvert et la 2eme fois il se ferme.
La ou est mon problème c'est quand je clique sur un autre bouton de commande, le port se ferme automatiquement alors qu'il ne doit pas le faire !!!

Pouvez vous me dire ou j'ai un problème ??? merci

'***********************************************
'apres click sur bouton connection/deconnection*
'***********************************************
Private Sub connecter_bouton_Click()
    'si le bouton n'affiche pas deconnecter alors port com deconnecté
    If connecter_bouton.Caption = "Déconnecter" Then
        connecter_bouton.Caption = "Connecter"
        MSComm1.PortOpen = False
        'ChoixCOM.Enabled = True
        ErreurCOM% = 1
    'sinon connection du port com
    Else
        ErreurCOM% = OpenPortCOM("9600", Port$)
        'gestion des erreurs possible dû au port com
        If ErreurCOM% > 0 Then
            Select Case ErreurCOM%
                Case 8002
                    S$ = "n'existe pas"
                Case 8005
                    S$ = "est déja ouvert"
                Case Else
                    S$ = "a une erreur type" + Format$(ErreurCOM%)
            End Select
            'affichage message box si erreur dû au port com
            S$ = "Le port série " + S$
            i% = MsgBox(S$, 16 + 1 + 256, "Erreur d'ouverture du port " + portcom$)
            Exit Sub
        End If
    connecter_bouton.Caption = "Déconnecter"
    'ChoixCOM.Enabled = False
    'envoie du caractere "a" permettant de recuperer l'identifiant
    MSComm1.Output = "a"
    End If



'-----------------------------------
'Numéro de coffret et Pression en mB
'-----------------------------------
    Do     'boucle infinie
        DoEvents   'redonne la main à Window
        If ErreurCOM% = 0 Then 'le port est ouvert
            Buffer$ = Buffer$ & MSComm1.Input   'lecture de COM
            If Len(Buffer$) > 100 Then Buffer$ = "" 'par secu si trop de caractére
            If Len(Buffer$) > 0 Then    'y a des caractéres
                'recherche du Lf$ de début
                i% = InStr(1, Buffer$, Lf$)                If i% 0 Then Buffer$ "": GoTo Suite 'pas de Lf de début
                'recherche du Cr$ de fin
                J% = InStr(i%, Buffer$, Cr$)
                If J% > i% Then 'y a un texte encadré de Lf et Cr
                    'string reçu placé dans une chaine S$, pointé par I%+2, (J%-I%-2) caractéres
                    S$ = Mid$(Buffer$, i% + 2, J% - i% - 2)
                    'Tag reçu placé dans un caractére de T$ pointé par I%+1
                    t$ = Mid$(Buffer$, i% + 1, 1)
                    'suppression du string
                    Buffer$ = Trim$(Mid$(Buffer$ + " ", J% + 1))
                    Select Case t$  'gestion du TAG
                        Case "I" 'gestion d'un Coffret qui est dans S$
                         numerocoffret.Text = S$
                        Case "V"
                         can.Text = S$
                        '------------------------------
                        'Conversion 12 bits en millibar
                        Dim a As Integer
                        Dim k As Integer
                        a = 0
                        For k = 1 To 12                            If Mid$(can.Text, k, 1) "1" Then a a + 2 ^ (12 - k)
                        Next k
                        Text1.Text = CInt(a * (5000 / 4096))
                        '------------------------------
                        'Définition d'un tableau de Double
                        Dim MonTableau() As Double
                        'Dimensionnment du tableau
                        ReDim MonTableau(0)


                        'lorsque qu'on recoit une valeur:
                        'On place la valeur dans l'indice supérieur
                        MonTableau(UBound(MonTableau)) = Text1.Text
                        'Ajout d'un espace dans le tableau



                        'Preserve permet de ne pas supprimer les valeurs contenues
                        'dans le tableau lors du redimensionnement
                        ReDim Preserve MonTableau(UBound(MonTableau) + 1)
                        Dim nb 'nombre de valeur dans la moyenne
                        Dim m 'moyenne
                        Dim nVal 'la valeur que tu ajoute
                        nb = 100
                        nVal = Text1.Text


                        m = ((m * nb) + nVal) / (nb + 1)
                        nb = nb + 1
                        pressionmoy.Text = CInt(m)  'Cint pour enlever les chiffres après la virgule
                    End Select
                End If
            End If
Suite:
        End If
    Loop
End Sub
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
9 juil. 2007 à 11:54
Je pense que ce serait plutôt le code de l'autre bouton qu'il faudrait voir si c'est celui-là qui déconnecte le Port ...

MPi
0
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012
9 juil. 2007 à 14:04
voici l'autre bouton :

Private Sub Command1_Click()
    '--------------
    'initialisation
    '--------------
    dblEndTime = 0
    tempo = 0
    temps = "0,6"   'initialisation du temps ouverture
    temps2 = "0,4"  'initialisation du temps fermeture
    etatsysteme = "Vidange..."     'affiche l'état du microcheck
    ev = "Attente..."     'initialisation de l'indicateur EV
 
    '------------------------------
    tempo = Timer + "0,5"
    Do While tempo > Timer
    'attente
    DoEvents
    Loop
   
    '------------------------------
    tempo = Timer + Form3.tempsvidange.Text
    Do While tempo > Timer       'definition de la durée de vidange
    If pressionmoy.Text < Form3.pressionhaute.Text Then   'si on est au dessus de la pression haute on arrete l'EV et on attend
        dblEndTime = Timer + temps      'tempo avant ouverture
        Do While dblEndTime > Timer
        'Rien ne se produit mais les autres
        'applications peuvent traiter leurs
        'événements.
        mesure.Text = valeur     'calcul de la pression avant ouverture
        MSComm1.Output = "b"           'ouverture de l'electrovanne
        ev.Text = "Ouverte"            'affichage état electrovanne
    DoEvents
    Loop
       
    '------------------------------
        dblEndTime = Timer + temps2     'tempo avant fermeture
        Do While dblEndTime > Timer
        'Rien ne se produit mais les autres
        'applications peuvent traiter leurs
        'événements.
        MSComm1.Output = "c"         'fermeture de l'electrovanne
        ev.Text = "Fermée"           'affichage état electrovanne
    DoEvents
    Loop
       
    '------------------------------
       If pressionmoy.Text > Form3.pressionbasse.Text Then         'test si on a atteint la zone d'approche
            paliervidange.Text = (Form3.pressionhaute.Text) * 0.02 'calcul du palier de vidange lorsque la vidange basse est atteinte
       Else
            paliervidange.Text = (Form3.pressionhaute.Text) * 0.1 'calcul du palier de vidange lorsque on est en dessous de vidange basse
       End If
      
       If valeur < (mesure.Text + paliervidange.Text) Then      'verifie si la pression a augmenter d'un palier
            temps = (temps * 2)    'on ouvre l'EV 2 fois plus longtemps si on augmente pas assez
            tps.Text = temps
       Else
            temps = (temps * 0.8)    'on ouvre l'EV 2 fois moins longtemps si on augmente de trop
            tps.Text = temps
       End If
    End If
   
    DoEvents     'Met fin à la boucle End While
    Loop
 
    If pressionmoy.Text > Form3.pressionhaute.Text Then 'test si pression moyenne entre haute et basse atteinte
        temps = "0,6"     'initialisation du temps ouverture pour pressurisation
        temps2 = "0,4"    'initialisation du temps fermeture pour pressurisation
        etatsysteme = "Pressurisation..."  'affiche l'état du microcheck
        pressurisation       'passe en pressurisation
    Else
        'deconnection Microcheck
        etatsysteme = "Arret du Microcheck"
        MsgBox ("le temps de vidange est écoulé  ---  pression de vidange basse non atteinte  ---  le filtre doit être endommagé")
        resultat.Text = "INCORRECT (Pression non atteinte pendant la temps de vidange)"
        connecter_bouton = True      'deconnecté
    End If
End Sub

En fait je ne suis plus tres sur que le prot série se déconnecte étant donnée qu'apres avoir fait plusieurs test, j'ai toujours un message qui me dit que le port série est déja ouvert...
Mais le problème est que normallement je reçoit la pression moyenne en continue et quand je clique sur le 2eme bouton, la pression moyenne s'arrete et garde la valeur au moment de la pression du bouton !!! je ne vois pas ou est mon problème, si quelqu'un a une idée...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
9 juil. 2007 à 23:53
C'est fort possible que les nombreuses boucles empêchent l'affichage correct en continu.
Je vois que tu mets déjà des DoEvents dans chaque boucle, ce qui est bien, mais ce n'est peut-être pas suffisant.

Peut-être faudrait-il forcer le raffraîchissement du ou des contrôles (?)
Quelque chose comme MonControle.Refresh  (?)
Mais je n'en suis pas convaincu...

MPi
0
chewie_62 Messages postés 22 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 13 décembre 2012
10 juil. 2007 à 08:10
MonControle.refresh ? c'est pour la pression moyenne que tu veux dire ça ???

Je vais tester mais c'est bien galère comme truc !
0
Rejoignez-nous