Fonction Change dans un Timer ?????

Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 - 8 sept. 2004 à 14:49
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 - 29 sept. 2004 à 16:24
Bonjour, je vous explique le problème.

Je fais une accquisition de données via le port parallèle.
32 bits série sur D0
tout ceci fonctionne.
Le résultat de chaque bit (0 ou 1) est affiché dans un lbI()

Dans le programme j'ai une fonctione lbI_Change que voici

javascript:Code();
Private Sub lbI_Change(Index As Integer)

Dim a As Integer
If Starttest True Then ' Si Starttest Valide Ensuite
For a = 1 To 32 Step 1 ' Pour les 32 entrées allant de 1 à 32
If lbI(a) = "0" Then ' Si le label passe à 0
Cpt_C(a) = Cpt_C(a) + 1 ' ajoute 1 au compteur du label
'écris dans le fichier les 32 entrées si une passe à 0
Print #1, Time$, lbI(1), vbTab, lbI(2), etc.........
End If
Next a ' Entrée suivante
End If ' Fin de si

End Sub

Le soucis est quand dans mon fichier l'écriture se fait mal. (idem pour les compteurs)
En gros il écris plus qu'a chanque changement. Le changement d'état est trop sensible.
C'est pourquoi je cherche une solution incluant la fonctione Change et un timer.

Est il possible d'avoir un timer à t=10ms ou plus par exemple, et dans ce timer j'appele la fonction change ?

Vous voyez ce que je veux dire.
ou alors une autre solution

Merci d'avance de votre aide

58 réponses

yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
8 sept. 2004 à 15:18
je saisis pas trop ton problème

tu dévelop avec vb6?si oui , il y a un control timer tout pret, si tu mets interval = 10 alors la sub Timer ( qui équivaudrait au 'change' que tu désires) vaudrait 10ms...donc ton prog va passer toutes les 10ms dans la procédure Timer...

Voilà j'espère t'éclairer un peu

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
8 sept. 2004 à 15:35
Oui je sous en VB6

dans mon programme j'ai ceci

Private Sub acquisition_Timer() qui me fais l'acquisition des 32bits et écris le résultat dans lbI() 1 à 32

lorsque l'une des 32 entrées change, je dois écrire dans un fichier l'état des 32 entrées, d'où la fonction Private Sub lbI_Change(Index As Integer)

Le soucis est que la fonctione lbI_Change est trop sensible d'où mon idée d'un timer de 10ms par exemple qui lance lbI_Change toutes les 10 ms, ce qui éviterai que la fonction écrive trop souvent pour rien.

je voudrais faire un truc de ce style

Private Sub lbI_Timer() avec t = 10ms
exécute fonctione lbI_Change
End Sub

Et en dehors de ce timer, lorsque que celui ci n'est pa True, la fonctione lbI_Change = False

je crois que j'ai trouvé la réponse, dis moi si ça peut marcher :

Form_Load
lbI_Change = False
lbI_Timer = False

puis Start de l'acquisisition
lbI_Timer = True

et dans lbI_Timer
lbI_Change = True

Tu as compris ce que je veux dire ?

Désolé, mais je ne suis pas spécialsite VB

Merci
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
8 sept. 2004 à 16:48
je peux te proposer un solution qui à mon avis peut résoudre ton problème:

declare un variable globale propre à ta form du style :
------------------------------------------------------------------------------
Private Sequence as string
------------------------------------------------------------------------------

dans ton acquisition , fait un truc du genre :
------------------------------------------------------------------------------
dim i as integer
dim SequenceTmp as string

For i = 1 To 32
SequenceTmp = SequenceTmp & CStr(lbI(i)
Next
------------------------------------------------------------------------------
ce bout de code va te permettre de stocker ta séquence dans une variable de type string

en suite, toujours dans ton acquisition tu fait un test comme cela :
------------------------------------------------------------------------------
If SequenceTmp <> Sequence then
Sequence = SequenceTmp ' pour mémoriser la nouvelle
Call lbI_Change
end if
------------------------------------------------------------------------------
Ainsi , ta procédure d'écriture ne se fera que lorske les données sont modifiées!!!!!

Voilà , j'espère que cela résoudra ton problème, si tu as le moindre souci n'hésite pas !!!!

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
9 sept. 2004 à 08:37
Salut,

en fait dans mon programme au début je fesais comme celà.
Mais le problème est que j'écris dans un fichier texte qui est ensuite repris par excell.
Dans le fichier le mets j'heure, puis mes 32 entrées, et chaque entrée est séparé par une tabulation ce qui me permets de récupérer chaque entrée par colonne.
Et le problème est que si je mets mes 32 entrées dans une seule chaine, je ne pourrai plus faire fonctionner mes compteurs.

Car lorsqu'une entrée change d'état, j'écris dans le fichier texte et en même temps j'incrémente un compteur, ce qui me permets de savoir au bout d'un temps x, tel ou tel entrée à changé d'état y fois.

Je mets quand même ton idée de côté, on ne sais jamais, mais actuellement ce n'est pas le mieux.

Et l'idée que j'ai lancé, tu crois qu'elle peut être viable ?

Merci d'avance
0

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

Posez votre question
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
9 sept. 2004 à 09:11
je pense que ce ke tu as proposé c'est compliker la choz pour rien...

Dans ma solution, je ne te propse pa d'utiliser la variable Sequence dans ta procédure d'écriture...Sequence ne sert qu'à conparer la dernière Sequence mémorisée avec celle qui vient d'etre acquise.....juste pour voir si elle sont différente.

De toute façon , tu pourrais tout de même l'utiliser dans la boucle pour tes compteurs en faisant un simple : Mid(Sequence,a,1)
Ceci te récupérant le aème bit de ta sequence . c'est je pense ce qui t'intéresse en faisant lbI(a)...

Je vois rien de très difficile dans ce que tu cherches à faire, je pense que tu te complik trop ....Crois moi, utilise une variable global pour le test et si Sequencetmp <> Sequence alors tu écrit dans ton fichier....

D'ailleurs l'écriture n'aurait pas besoin d'etre dans une procédure différente mais bon....cela peut dépendre d'autre chose donc je ne sais pas...Je vais essayé de créé un prog dans l'idée de ce que tu ve faire et tu me dira si cela t'aide....Je te fait ça dans la matiné...

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
9 sept. 2004 à 09:53
J'ai compris ce que tu veux dire

donc je fais ceci :

Form Load
Private Sequence as string

Acquisistion
dim i as integer
dim SequenceTmp as string

For i = 1 To 32
SequenceTmp = SequenceTmp & CStr(lbI(i)
Next

Programme principal
If SequenceTmp <> Sequence then
Sequence = SequenceTmp ' pour mémoriser la nouvelle
Call lbI_Change
end if

Et je garde ma fonction lbI_Change dans laquelle j'écris mes 32 variables séparées de tabulation, et j'incrémente mes compteurs.

Je pense que tout est correct dans ma tête, sauf la fonction lbI_Change
je la garde comme ceci :
Private Sub lbI_Change(Index As Integer)
elle ne risque pas de se lancer avant le call lbI_Change ?

Ton idée est bonne, je comment à bien serner comment faire.
Je ne peux pas coder ce matin dessus, je vais essayer cette après midi

Encore merci
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
9 sept. 2004 à 11:54
tiens l'idée principale est faite ...
J'ai simulé une acquisition en générant une séquence aléatoirement...

Le programme n'écrit dans le fichier de sortie que si au moins 1 bit a changé...

si tu ve voir ce que cela donne, clique sur le lien suivant : acquisition.zip

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
9 sept. 2004 à 11:57
le lien n'est pas passé :
acquisition.zip

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
9 sept. 2004 à 14:27
Je viens de tester le zip et de regarder.

ça marche très bien, en plus quand tu ouvre le fichier dans excell, chaque bit est bien dans une colonne.

Je vais essayer d'appliquer celà à mon programme demain matin, cette après midi étant surbooké, merci et demain matin je dis ce que ça a donné

Merci

a+
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
15 sept. 2004 à 11:19
Alors après pas mal de temps passé dessus, ça ne fonctionne pas

ton prog de test fonctionne parfaitement, mais dans mon cas comme c'est une acquisition par port // de 32 infos sur une entrée, j'ai des soucis.

le problème est que ce qu'il écris dans le fichier est toujours la même chose, je ne comprend pas, et apparament il écris trop souvent

voilà le bout de code que j'ai

'----------------------> options explicit qui sert à la détection de changement d'une entrée
Private Sequence As String
Dim SequenceTmp As String

'----------------------> timer acquisition
    Dim i As Integer
      
    For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
    
                   SEQUENCE ACQUISITION DES DONNES
        
        SequenceTmp = SequenceTmp & CStr(lbI(i))
       
    Next i
    
    If SequenceTmp <> Sequence Then    If Starttest True Then        ' Si Starttest Valide Ensuite

        'sauvegarde si un bit est modifié
        Dim Chaine As String
        Sequence = SequenceTmp
        Chaine = Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss")
        For i = 1 To 32
            Chaine = Chaine & vbTab & Mid(Sequence, i, 1)
        Next
            Print #1, Chaine
    End If
    End If
    
End Sub


Voilà, là j'ai tout essayé et je n'y arrive pas, alors si tu peux m'adier, MERCI, MERCI, MERCI

a+
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 11:51
ton Dim SequenceTmp As String doit se faire dans la procédure Timer sinon tu ecrit continuellement dans SequenceTmp. Si toutefois tu veux le déclaré au départ, avant ta boucle for tape :
SequenceTmp = ""

histoire de réinitialiser la sequence

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 11:58
plus précisément, d'après ton code, tu écris en continue la première séquence acquise koi k'il arrive...

explication :
------------------------------------------------------------------------
tu passe une fois dans le timer tu obtiens par exemple
11111111111111111111111111111111
là aucune problème
------------------------------------------------------------------------
deuxième passage dans le timer:
vu que SequenceTmp n'est pas réinitialisé, tu vas obtenir quelque chose du genre
1111111111111111111111111111111101111111111111111111111111111111
En admettant que le bit modifié soit le premier
donc dans ton fichier, comme tu écrit les 32 premiers bits, tu vas écrire 11111111111111111111111111111111, soit la première sequence et cela à chaque fois....
d'ailleurs au bout d'un certain temps tu auras une erreur car tu auras rempli la taille de la variable string...
------------------------------------------------------------------------
voilà pour le détail...

Donc comme je le disais, soit tu déclare SequenceTmp dans la procédure du Timer , ainsi ta variable sera réinitialisée à la déclaration, soit tu la déclare en local a la form mais alors mets bien un SequenceTmp = "" avant de mémoriser ta séquence dans ta variable SequenceTmp

Voilà , je suis toujours à ta disposition si tu as le moindre problème

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
15 sept. 2004 à 13:29
ça fonctionne, je rêve, j'avais tout essayé, et là ça marche.
c'est trop bien....

j'ai une autre petites question en rapport avec ça

lorsqu'une entrée change d'état, j'incrémente un compteur.
Le but est de dire l'entrée 3 a changé d'état X fois

lorsque j'avais des problèmes, avec la fonction lbI_Change je fesais tout simplement ça :

    Cpt_C(i) = Cpt_C(i) + 1     ' ajoute 1 au compteur du label


crois tu que je puisse facilement intégrer ça à la nouvelle fonction ? et comment tu le mettrais ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 13:57
je modifierai la partie sauvegarde comme suit:
'sauvegarde si un bit est modifié
Dim Chaine As String

Chaine = Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss")
For i = 1 To 32
Chaine = Chaine & vbTab & Mid(SequenceTmp, i, 1)
If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then Cpt_C(i) = Cpt_C(i) + 1 ' ajoute 1 au compteur du label
Next
Sequence = SequenceTmp


Attention !!!! J'ai modifié Sequence par SequenceTmp dans la construction de Chaine et j'ai mis la sauvegarde de la séquence après le For...C'est important!!!

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
15 sept. 2004 à 15:14
voilà ce que donne ma procédure

        'sauvegarde si un bit est modifié
        Dim Chaine As String
        Sequence = SequenceTmp
        'Chaine = Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss")
        
        For i = 32 To 1 Step -1

        Chaine = Chaine & vbTab & Mid(SequenceTmp, i, 1)
        If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then Cpt_C(i) = Cpt_C(i) + 1 ' ajoute 1 au compteur du label
        Next
        Sequence = SequenceTmp
        
Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine
        
    End If
    End If


il ya 2 - 3 changements par rapport à ton prog, je vais de 32 à 1 pour les entrées, et des tabulations pour mettre en forme dans mon fichier

Alors les compteurs, j'ai le même problème qu'avec la fonction lbI_change
c'est dire que si l'entrée 3 change d'état, le compteur 3 est incrémenté ainsi que les autres
exemple sur 30 changements d'états sur différentes entrées, j'ai des entrées auquel il n'y a jamais eu de changement d'état dont le compteur est à 30

je ne sais pas comment expliquer ce problème, ni d'où est son origine

voilà, merci de ton aide si tu as une solution
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 16:37
Je t'ai di de supprimer la ligne :
Sequence = SequenceTmp
placée dérière Dim Chaine As String et de ne garder que celle après le Next ... Et pourtant j'avais bien attiré ton attention en faisant ATTENTION !!!
tu as bien changé
Chaine = Chaine & vbTab & Mid(Sequence, i, 1)
en
Chaine = Chaine & vbTab & Mid(SequenceTmp, i, 1)
Mais il faut également supprimer la première ligne Sequence = SequenceTmp

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
15 sept. 2004 à 16:47
Désolé pour cette ligne que je n'ai pas supprimé, c'est fait

ça donne ça

        Dim Chaine As String
                
        For i = 32 To 1 Step -1
        Chaine = Chaine & vbTab & Mid(SequenceTmp, i, 1)
        If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then Cpt_C(i) = Cpt_C(i) + 1 ' ajoute 1 au compteur du label
        Next
        Sequence = SequenceTmp
        Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine
        
    End If
    End If



l'écriture dans le fichier log marche toujours, mais pour les compteurs, toujours le même problème.
le pire c'est que je ne saurais pas expliquer où est l'erreur
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 17:12
remplace le test :
If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then

par
If Mid(SequenceTmp, i, 1) <> Mid(Sequence, i, 1) Then


Sinon essai d'arrêter l'acquisition le temps du traitement dans le timer
genre:
Starttest = False
ton code
puis
Starttest = True

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
15 sept. 2004 à 17:26
Non ce n'est pas mieux
on contraire c'est encore plus étrange, il y a des entrées qui restent à 1 et 2-3 qui s'incrémente lorsqu'une autre entrée change d'état

je vais repartir sur If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then
et voir pour désactiver le timer

je ne sais pas si la fonctione comptage peut fonctionner
dans le pire des cas il y a le fichier texte qui peut être ouvert dans excell et là il faudra compter ou faire une macro

je vais réfléchir à voir si il n'y a pas une autre solution à Cpt_C(i) = Cpt_C(i) + 1
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
15 sept. 2004 à 18:03
euh juste comme ça...
lbI(i)) et Cpt_C(i) ils vont pas de 0 à 31 et tu devrai pas test un truc pluto du genre:
pour l'acquisition
for i = 31 to 30 step -1
SequenceTmp = SequenceTmp & CStr(lbI(i))
next


pour la sauvegarde et le test:
Dim Chaine As String

For i = 32 To 1 Step -1
Chaine = Chaine & vbTab & Mid(SequenceTmp, i, 1)
If CStr(lbI(i-1)) <> Mid(Sequence, i, 1) Then Cpt_C(i-1) = Cpt_C(i-1) + 1 ' ajoute 1 au compteur du label
Next
Sequence = SequenceTmp
Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine


Vérifie bien comment sont déclarer test tableaux!!!
car si tu déclares un tableau comme ceci :
Dim tab1(32) As Integer
le premier index est : 0
le dernier est : 32

pour bien déclarer un tableau de 1 à 32 il faut le déclarer ainsi:
Dim tab1(1 To 32) As Integer

PS: @ demain pour la suite des aventures

Yomm >:)

[mailto:yommvb@ifrance.com yommvb@ifrance.com]

Et que la source soit avec toi!!!!!
0
Rejoignez-nous