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

Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
16 sept. 2004 à 08:43
Salut,

en fait l'acquisition se fait tout simplement.
Je passe par une DLL externe (car je suis sous XP)

voilà à quoi se résume mon acquisition

Private Sub acquisition_Timer() 'timer pour l'acquisition des données

Dim i As Integer
    With IO
        .BitReset PAR1, PL
        .BitSet PAR1, PL
    End With
    
    For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
        With IO            lbI(i).Caption IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
            .BitSet PAR1, CK
            .BitReset PAR1, CK
        End With
        If lbI(i).Caption "1" Then ' Si données 1 affichage en rouge
                   ......
        Else            lbI(i).ForeColor vbBlack ' Si données  0 affichage en noir
                   ......
        End If
        
        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
                
        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
    
End Sub


Voilà mon progr d'acquisition
lb(i) et Cpt_C(i) vont de 1 à 32. Ce sont des labels sur ma feuille

voilà, tu en pense quoi ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
16 sept. 2004 à 10:50
déjà première optimisation :
remplace :
If lbI(i).Caption "1" Then ' Si données 1 affichage en rouge
......
ElselbI(i).ForeColor vbBlack ' Si données 0 affichage en noir
......
End If

par:
lbI(i).ForeColor = &HFF And ( val(lbI(i).Caption) * &HFF)

explication :tu ve ke ton label s'affiche en rouge si le bit vaut 1 et en noir s'il vaut 0...Or vbBlack 0 et vbRed 255 soit respectivement &H0 et &HFF en hexadecimal...
donc si :lbI(i).Caption "1"> ( val(lbI(i).Caption) * &HFF) = &HFFd'où &HFF And ( val(lbI(i).Caption) * &HFF) &HFF And &HFF 255 = vbRed
de mêmelbI(i).Caption "0"> ( val(lbI(i).Caption) * &HFF) = &H0d'où &HFF And ( val(lbI(i).Caption) * &HFF) &HFF And &H0 0 = vbBlack

Un simple calcule mathématique te donne ton résultat alors inutil de passer par un test If

Autre chose...si je peux te donner un conseil, perd l'habitude de ne pas préciser la propriété du control dont tu veux récupérer la valeur...Dans ce cas précis , n'utilise pas lbI(i)) mais force toi à écrire lbI(i)).Caption ...Cela te fait perdre 2 secondes mais cela évitera tout problème éventuel...Par exemple pour une checkbox j'ai déjà vu des trucs du genre : If Check1 = True Then...Ceci est totalement faut car Check1.Value peut prendre 3 valeurs... En effet, UnChecked , Greyed et Checked...Comprends tu pourquoi je fait cette petite parenthèse...De plus c'est plus clair pour quelqu'un qui ne connait pas le code...Par exemple, jusque là, je pensait que lbI(i)) et Cpt_C(i) étaient des tableaux et non des label...Tu aurais écrit lbI(i)).Caption , la confusion n'était plus possible...Enfin voilà , c'est juste un conseil , après tu en feras ce que tu veux...

donc pour ton code :
essaie de modifier :
If CStr(lbI(i)) <> Mid(Sequence, i, 1) Then Cpt_C(i) = Cpt_C(i) + 1

Par :
If CStr(lbI(i).Caption) <> Mid(Sequence, i, 1) Then Cpt_C(i).Caption = Cstr(Val(Cpt_C(i).Caption) + 1)


De même ke pour les propriétés des controles que je t'ai conseillé d'écrire entièrement, essaie également d'écrire les conversion de type éxplicitement également...Un label n'est pas un integer donc même si VB t'autorise à écrire Cpt_C(i) + 1 , il est plus correcte d'écrire : Cstr(Val(Cpt_C(i).Caption) + 1) ...D'ailleurs si tu passes en VB.Net ou C# tu auras des problèmes car il n'autorise plus ce genre de conversion à la volé...

Enfin voilà,
Sinon le code me semble correcte, donc essaie de faire les modif que je viens de te dire et tiens moi au courant du résultat

@+

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
16 sept. 2004 à 10:53
oublie la première solution je me suis conpliqué la vie pour rien :

tu à juste à faire :
lbI(i).ForeColor = Val(lbI(i).Caption) * 255

en effet si lbI(i).Caption "1"> Val(lbI(i).Caption) * 255 = 1 * 255 = 255 = vbRed
et si lbI(i).Caption "0"> Val(lbI(i).Caption) * 255 = 0 * 255 = 0 = vbBlack

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
16 sept. 2004 à 14:22
Alors merci du conseil pour les .Caption, je vais me forcer à les mettres

pour les lignes

If lbI(i).Caption "1" Then ' Si données 1 affichage en rouge
......
ElselbI(i).ForeColor vbBlack ' Si données 0 affichage en noir
......
End If

Les ..... sont là car je ne t'ai pas mis le code à l'intérieur. En effet j'affiche 1 en rouge et 0 en noir. Idem avec des lignes qui sont ou non affichées. J'ai un synoptique sur la feuille et j'affiche une ligne si 1 et une ligne avec une croix si 0

en ce qui concerne les compteurs, ce qui pose encore problème, j'ai essayé la ligne que tu m'a donné
If CStr(lbI(i).Caption) <> Mid(Sequence, i, 1) Then Cpt_C(i).Caption = Cstr(Val(Cpt_C(i).Caption) + 1

Le problème est toujours là, les autres compteurs s'incrémentent alors qu'ils ne devraient pas.

Je me demande si le problème est due à que les 32 entrées arrivent sur une seule ligne. Une sorte de trame avec 32 bits
et est ce VB le gère mal.

Ne peut on pas déclarer une fonction qui dirait si l'entrée x passe de 0 à 1, incrémente une i1 par exemple.
Autre solution très lourde serait d'écrire les 32 conditions
si lbi(1) change d'état Cpt_C.Caption = Cpt_C.Caption + 1
etc ... jusque la ligne 32

enfin voilà; c'est une idée.
Le seule problème c'est les compteurs, mais je ne sais pas si une solution existe

Merci
0

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

Posez votre question
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
16 sept. 2004 à 15:58
Ne peut on pas dire, les 32 entrées je les stock dans un tableau, et d'une ligne à l'autre si un entrée change, j'incrémente le compteur correspondant
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
16 sept. 2004 à 17:00
Mais lorsque tu fais ton acquisition , plusieurs bit peuvent changer de valeur!!!

imagine que le bit 1 et le bit 2 change constamment de valeur et bien Cpt_C(1).Caption affichera la même chose que Cpt_C(2).Caption soit le nombre d'acquisition

le test me semble tout à fait correct...

Autre chose change
lbI(i).Caption IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)

par
lbI(i).Caption = Cstr(Abs(CInt(Not (.Inp(PAR1 + 1) And BUSY ))))


cela évite de faire un test et celui là , je ne devrais pas avoir à le changer dans 2 minutes ;-)...et au moins les conversion sont explicitent...teste et dis moi!!!

d'ailleur est ce normal que si tu as (.Inp(PAR1 + 1) And BUSY) = 0 tu affiches 1....?? soit l'inverse du résultat de ton test....

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
17 sept. 2004 à 09:35
Salut,

il est vrai que pour mon acquisisiton, plusieurs bits peuvent changer de valeur. ce qui est normal.

je ne comprend pas pourquoi tu dis "imagine que le bit 1 et le bit 2 change constamment de valeur et bien Cpt_C(1).Caption affichera la même chose que Cpt_C(2).Caption soit le nombre d'acquisition"
si le bit 1 change 3 fois de valeur, le compteur 1 sera à 3 et si le bit 2 change également 3 fois de valeur, le compteur 2 sera à 3.

Pour ce qui est de la ligne
lbI(i).Caption IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)

il est normal qu'il y ait = 0 et que j'affiche 1
tout est fonction d'une horloge sur la seconde ligne du port paralèle.
Ma donnée est valide si je suis à 1 sur l'horloge
si je rempace le 0 par 1, je ne serai plus synchro avec l'horloge et il ne recevra que des 0

Pour la ligne
lbI(i).Caption = Cstr(Abs(CInt(Not (.Inp(PAR1 + 1) And BUSY ))))

L'acquisition fonctionne, j'ai 1 mais plus de 0, mais une valeur 129, et les compteurs ne fonctionnent toujours pas correctement.

Et l'idée de dire mes 32 valeurs je les mets dans un tableau, puis je compare ma ligne avec la ligne suivante et si par exemple le bit 4 à changé, j'incrémente le compteur 4
tu crois que l'on aurais le même problème ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
17 sept. 2004 à 10:26
explik moi ce qu'est IO.Inp(PAR1 + 1) et BUSY stp

car je vois pas comment tu obtiens 129 ;-)

Pour ce qui est du tableau et du fait de comparé c'est une bonne solution ...pas la plus rapide mais c'en est une...

ATTENDS!!! Je vais bossé sur un truc ......je viens d'avoir une idée....je te tiens au courant.....

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
17 sept. 2004 à 11:19
ajoute un module de classe à ton projet et nom le AcqCls
fais y un copier coller du code suivant:
Option Explicit

Private ValueTmp As Integer
Private CompteurTmp As Integer
Private HasChangedTmp As Boolean

Public Property Let Value(ByVal Valeur As Integer)
    If ValueTmp <> Valeur Then
        CompteurTmp = CompteurTmp + 1
        HasChangedTmp = True
    Else
        HasChangedTmp = False
    End If
    ValueTmp = Valeur
End Property
Public Property Get Value() As Integer
    Valeur = ValueTmp
End Property

Public Property Get Compteur() As Integer
    Compteur = CompteurTmp
End Property

Public Property Get HasChanged() As Boolean
    HasChanged = HasChangedTmp
End Property


dans ton code principal déclare un variable comme cela :
Private TabBit(1 To 32) As New AcqCls


modifie ton code comme cela
Dim Modif as Boolean
Dim Chaine As String

For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
With IOTabBit(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
lbI(i).Caption = Cstr(TabBit(i).Value)
Cpt_C(i).Caption = Cstr(TabBit(i).Compteur)If TabBit(i).Value 1 Then ' Si données 1 affichage en rouge
......
ElselbI(i).ForeColor vbBlack ' Si données 0 affichage en noir
......
End If
Modif = TabBit(i).HasChanged Or Modif
Chaine = Chaine & vbTab & TabBit(i).Value
.BitSet PAR1, CK
.BitReset PAR1, CK
End With

If Modif = True Then 
Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine
End If


Si t'as le moindre problème, envoi moi par mail le code résultant de tout cela....Le vrai code afin que je puisse controler la procédure dans sa totalité...Mais je pense que tes problèmes vont etre réglé et en plus du gagne un temps incroyable!!!

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
17 sept. 2004 à 13:44
Alors voilà le résumé :

Explication de ceci :
 IO.Inp(PAR1 + 1) et BUSY stp


Je t'ai dis que j'utilise une dll externet pour fonctionner avec le port //
au début de mon timer d'acquisition, j'ai ceci
    With IO
        .BitReset PAR1, PL
        .BitSet PAR1, PL
    End With

dont voici les constante
'----------------------> options explicit pour l'acquisition
Private Const PAR1 = &H378 'Adresse dur port //
Private Const PL = 0 ' 0 en sortie
Private Const CK = 1 ' 1 en sortie
Private Const BUSY = 2 ^ 7 ' petit délai
Private IO As New INOUT32

Voilà pour ces explications.

voici le modu le classe que j'ai : Valeur n'étais pas déclaré, je l'ai mis en String
Option Explicit

Private ValueTmp As Integer
Private CompteurTmp As Integer
Private HasChangedTmp As Boolean
Dim Valeur As String

Public Property Let Value(ByVal Valeur As Integer)
If ValueTmp <> Valeur Then
CompteurTmp = CompteurTmp + 1
HasChangedTmp = True
Else
HasChangedTmp = False
End If
ValueTmp = Valeur
End Property
Public Property Get Value() As Integer
Valeur = ValueTmp
End Property

Public Property Get Compteur() As Integer
Compteur = CompteurTmp
End Property

Public Property Get HasChanged() As Boolean
HasChanged = HasChangedTmp
End Property


et voici le fichier d'acquisition
Option Explicit
'----------------------> Déclaration module de classe AcqCls
Private TabBit(1 To 32) As New AcqCls

Private Sub acqui_Timer() 'timer pour l'acquisition des données
    acquisition ' lance le prog acquisition   
End Sub

Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String

 
Dim i As Integer
Dim SequenceTmp As String
    
    With IO
        .BitReset PAR1, PL
        .BitSet PAR1, PL
    End With
    
    For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
        With IO            TabBit(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
            lbI(i).Caption = CStr(TabBit(i).Value)
            Cpt_C(i).Caption = CStr(TabBit(i).Compteur)            If TabBit(i).Value 1 Then ' Si données 1 affichage en rouge
                lbI(i).ForeColor = vbRed
                LineV(i).Visible = True
                LineD1(i).Visible = False
                LineD2(i).Visible = False
            Else                lbI(i).ForeColor vbBlack ' Si données 0 affichage en noir
                LineV(i).Visible = True
                LineD1(i).Visible = True
                LineD2(i).Visible = True
            End If

        Modif = TabBit(i).HasChanged Or Modif
        Chaine = Chaine & vbTab & TabBit(i).Value
        .BitSet PAR1, CK
        .BitReset PAR1, CK
        End With
    Next i
    
    If Modif = True Then
        Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine
    End If
End Sub


Les résultats des tests sont :
si j'ai 0 ou 1 sur mon électronique, je ne le vois pas sur ma feuille, tout reste à 0
Si sur l'entrée 1, je change l'état, le visuel reste à 0, mais le changement d'état est vue par le compteur qui s'incrémente sans que les autres s'incrémentent.
Donc il y a du changement, le programme vois bien 0 ou 1, il y a un problème d'affichage et les compteurs sont sur la bonne voie.

Un autre petit soucis pas trop grave au démarrage du programme, il incrémente tous les compteurs de 1, mais ce n'est pas un soucis important.

Voilà, ce que ça donne. Est ce que mes explications ont été assez claire ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
17 sept. 2004 à 14:23
normal j'ai fdait du copier coller et j'ai oublié de modifier quelque chose d'où le fait que Valeur n'était pas déclaré:

voici la class modifiée:
Option Explicit

Private ValueTmp As Integer
Private CompteurTmp As Integer
Private HasChangedTmp As Boolean

Public Property Let Value(ByVal Valeur As Integer)
If ValueTmp <> Valeur Then
CompteurTmp = CompteurTmp + 1
HasChangedTmp = True
Else
HasChangedTmp = False
End If
ValueTmp = Valeur
End Property
Public Property Get Value() As Integer
Value = ValueTmp
End Property

Public Property Get Compteur() As Integer
Compteur = CompteurTmp
End Property

Public Property Get HasChanged() As Boolean
HasChanged = HasChangedTmp
End Property


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
17 sept. 2004 à 14:26
voici la modif pour ke le compteur ne s'incrément pas de 1 a la première acquisition

Option Explicit

Private ValueTmp As Integer
Private CompteurTmp As Integer
Private HasChangedTmp As Boolean

Public Property Let Value(ByVal Valeur As Integer)
static TestPassage as boolean

If (ValueTmp <> Valeur) And (TestPassage = True) Then
CompteurTmp = CompteurTmp + 1
HasChangedTmp = True
Else
HasChangedTmp = False
End If
TestPassage = True
ValueTmp = Valeur
End Property
Public Property Get Value() As Integer
Value = ValueTmp
End Property

Public Property Get Compteur() As Integer
Compteur = CompteurTmp
End Property

Public Property Get HasChanged() As Boolean
HasChanged = HasChangedTmp
End Property


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
17 sept. 2004 à 16:08
Alors j'ai testé et ça marche

le seule chose que j'ai remarqué et que ça compte 2 fois de trop, ça compte lorsque je passe de 1 à 0 et de 0 à 1
est il possible de modifier celà facilement pour lui dire ne compte que lorsque tu passe de 1à 0

et autre chose que j'ai remarqué, lorsque j'écris dans le fichier texte, j'écris de l'entrée 32 à 1
parceque dans mon acquisition je fais de 32 à 1
 For i = 32 To 1 Step -1

est il possible avant d'écrire dans le fichier texte, d'inverser la Chaine ?

Je suis très impressionné, et je te remercie de ton aide préciseuse.
Ce w-e je vais étudier tout celà afin de bien comprendre et de faire les petits modifs pour que tout tienne parfaitement.
C'est à dire que les compteurs ne fonctionne pas avant le Start du test
j'ai un Start test1 pour les entrées 1 à 8
j'ai un Start test2 pour les entrées 9 à 16
j'ai un Start test3 pour les entrées 17 à 24
j'ai un Start test4 pour les entrées 25 à 32

je vais regarder ça ce w-e

Encore MErci bcp de ton aide
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
17 sept. 2004 à 16:45
ah OK!!!!!!!!!!!!!!!!!
c'est pas ce ke j'appel un compteur de changement d'état si tu ne comptes ke lors du passage de 1à0 !!!!

pour cela modifie dans la classe la ligne suivante :
If (ValueTmp <> Valeur) And (TestPassage = True) Then


par:
If (ValueTmp <> Valeur) And (TestPassage = True) And (Valeur=0) Then


de plus pour la chaine écrite à l'envers change la ligne
Chaine = Chaine & vbTab & TabBit(i).Value


par:
Chaine = Chaine & vbTab & TabBit(32 - i +1).Value


voilà...

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
17 sept. 2004 à 16:53
comme je te l'avais di, tu peux également optimiser le code
If TabBit(i).Value 1 Then ' Si données 1 affichage en rouge
lbI(i).ForeColor = vbRed
LineV(i).Visible = True
LineD1(i).Visible = False
LineD2(i).Visible = False
ElselbI(i).ForeColor vbBlack ' Si données 0 affichage en noir
LineV(i).Visible = True
LineD1(i).Visible = True
LineD2(i).Visible = True
End If


par:
lbI(i).ForeColor = 255 * TabBit(i).Value
LineV(i).Visible = True
LineD1(i).Visible = Not CBool(TabBit(i).Value)
LineD2(i).Visible = Not CBool(TabBit(i).Value)


d'ailleurs tu as noté que dans ton test tu as "LineV(i).Visible = True" dans les 2 cas...
si c'est une erreur, je pense ke le résultat souhaité est:
LineV(i).Visible = CBool(TabBit(i).Value)


@+ et bon WE

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
20 sept. 2004 à 09:46
Salut, comment va ?

alors ce matin j'ai testé les programme avec les modifs, tout marche parfaitement.

Pour la partie "LineV(i).Visible = True" dans les 2 cas, ceci est normal.
j'ai fais les quelques modifs pour optimiser le code et tout marche.
J'apprend de nouvelles fonctions en même temps. MERCI

je suis en train de faire une petite modif, car l'écriture dans le fichier texte ainsi que l'incrémentation des compteurs ne doit se faire que lorsque le test est lancé.

C'est pourquoi j'ai un boutton "start test1" et "start test2" (entrées 1 à 16 et 17 à 32)
dans 'Start test 1', j'ai Starttest1 True et dans 'Start test 2', j'ai Starttest2 True

Est il possible de modifier le code comme ceci

pour Test 1, si Starttest1 = True -> écriture dans fichier texte et compteurs 1 à 16 fonctionnent et s'incrémentent. par contre si Starttest1 False -> écriture dans fichier texte si Starttest2 True, sinon pas d'écriture dans fichier texte et dans les 2 cas les compteurs 1 à 16 = False et ne s'incrémentent pas

pour Test 2, si Starttest2 = True -> écriture dans fichier texte et compteurs 17 à 32 fonctionnent et s'incrémentent. par contre si Starttest21 False -> écriture dans fichier texte si Starttest1 True, sinon pas d'écriture dans fichier texte et dans les 2 cas les compteurs 17 à 32 = False et ne s'incrémentent pas

pour celà il suffit de modifier le programme d'acquisition et mettant ces conditions
voilà ce que ça donne pour l'écriture dans le fichier texte
    If (Modif True And (Starttest1 Or Starttest2 True)) Then
        Print #1, Format(Date, "dd/mm/yyyy") & vbTab & Format(Time, "hh:mm:ss") & vbTab & vbTab & vbTab & vbTab & vbTab & Chaine
    End If

J'ai testé et ça fonctionne sans problème

Mon problème se situe au niveau des compteurs, il faut mettre la condition à la ligne
            Cpt_C(i).Caption = CStr(TabBit(i).Compteur)

mais je ne vois pas trop comment faire
est ce que je peux faire quelque chose comme ceci
If Starttest1 = True for Cpt_C(i) 1 to 16
Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
If Starttest2 = True for Cpt_C(i) 17 to 32
Cpt_C(i).Caption = CStr(TabBit(i).Compteur)

tu en pense quoi ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
20 sept. 2004 à 14:05
oui tu dois faire quelque chose dans ce genre là...

l'écriture correcte serait plus du genre:
If Starttest1 = True 
For Cpt_C(i) 1 to 16
Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
next
end if
If Starttest2 = True 
For Cpt_C(i) 17 to 32
Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
next
end if


Cela sous entend que tu peux avoir Starttest1 et Starttest2 à true simultanément...Donc doit pas y avoir de problème...

Test et tu le sauras ;-)

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
20 sept. 2004 à 14:31
Il y a quelque chose que je ne comprend pas, j'ai une erreur trop bizarre

voici la partie du code acquisition
    For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
        With IO            TabBit(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
            lbI(i).Caption = CStr(TabBit(i).Value)
            
            If Starttest1 = True Then
                For Cpt_C(i) = 1 To 16
                Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
                Next
            End If
            
            If Starttest2 = True Then
                For Cpt_C(i) = 17 To 32
                Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
                Next
            End If
           
     .....................         

        End With
    Next i


j'ai une erreur qui me ramène à la ligne
For Cpt_C(i) = 1 To 16

La ligne qui est après if Starttest1 = True then

L'erreur est erreur de compilation, Variable requise. Impossible de l'affecter à cette compilation. et ça me ramène à Cpt_C(i)

est ce due à que je fais un For qui est déjà dans une boucle For ?
si je mets Cpt_C(i).Caption, l'erreur est sur le Caption.

Pourtant dans le Form Load, Sarttest1 et Starttest2 = False

je ne vois pas trop où est l'erreur ???? surtout qu'il me dit variable requise et qu'au début Starttest1 et 2 = False
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
20 sept. 2004 à 14:55
j'ai pas fait attention...en effet, cela peut pas marché...
modifie ton code comme cela :

If Starttest1 = True And i <= 16 Then Cpt_C(i).Caption = CStr(TabBit(i).Compteur)
If Starttest2 True And i> 17 Then Cpt_C(i).Caption = CStr(TabBit(i).Compteur)


Attention tout de même , en faisant cela , le compteur s'incrément mais pas à l'affichage c'est tout...

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
20 sept. 2004 à 15:35
alors, ça marche quasi à 100%, encore un soucis mineure :

Avant que le Test1 ou le Test2 soit lancé,
si les compteurs sont incrémenté, celà ne se voit pas sur la feuille, mais dès que je lance Starttest1, mes compteurs ne sont pas à 0, ils sont à 3 ou +

en gros mes compteurs s'incrémentent avant le start, il faut désactiver les compteurs ou les remettres à 0

Le plus simple et plus raisonnable etant je pense les désactiver.

j'ai essayé ceci mais les compteurs restent à 0

            If Starttest1 = True And i <= 16 Then Cpt_C(i).Caption = CStr(TabBit(i).Compteur) Else If Starttest1 = False Then Cpt_C(i) = "0"


Pourquoi ?
faut il faire autrement ? y a t'il plus simple ?
0
Rejoignez-nous