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
20 sept. 2004 à 17:46
c'est exactement le problème que je te signalais...

retire toutes les modifs que tu as fait pour l'affichage en fonction de i...

En fait c'est pas l'affichage qui importe mais le changement de valeur tout simplement...
en gros tu as juste à faire :

(...)
For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
With IO
if (Starttest1 = True And i <= 16) Or (Starttest2 = True And i >= 17) thenTabBit(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
end if
(...)


ainsi les bits seront modifié en fonction de ton Starttest1 et/ou Starttest2

voilà...

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
21 sept. 2004 à 11:03
Salut,

j'ai fais le test ce matin, c'est vrai que tout marche parfaitement,
voilà ce que donne le code
(...)
    For i = 32 To 1 Step -1
        With IO
        
            If (Starttest1 = True And i <= 16) Or (Starttest2 = True And i >= 17) Then            TabBit(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
            End If   
            
            lbI(i).Caption = CStr(TabBit(i).Value)
            
            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)
(...)

Ce qui est ennouyant est que tu n'a pas de visuel sur le PC avant que tu clique sur Starttest1 ou Starttest2

L'avantage avant est que bien que le test ne soit pas lancé, tu avait l'état des 32 entrées. là tu ne l'a pas avant le start.
C'est un peu ennuyant

je réfléchis à savoir si il n'y a pas possibilité de faire autrement
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
21 sept. 2004 à 16:49
je t'ai dit de retirer les modif que tu avais fait à savoir:
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)


tu n'as plus besoin de cela...

Précise un peu ta demande stp car j'ai des nouvelles infos a chaque fois ;-)

Tu veux koi?
Ke le bit change mais pas le compteur tant ke le start n'est pas déclanché?

dans ces cas là , gère ça au niveau de la class..;
Option Explicit

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

Public Property Let Value(ByVal Valeur As Integer)
Static TestPassage As Boolean
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp 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 Let CompteurState(ByVal Valeur As Boolean)
CompteurStateTmp = Valeur
End Property
Public Property Get CompteurState() As Boolean
CompteurState = CompteurStateTmp
End Property

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


maintenant, au lieur d'utiliser un seul tableau : Private TabBit(1 To 32) As New AcqCls

tu en déclares 2 , un premier pour les bits de 1 à 16 et un seconde pour les bits de 17 à 32
Private TabBitL(1 To 16) As New AcqCls
Private TabBitH(17 To 32) As New AcqCls

dans ta boule, tu fais :
If i <= 16 thenTabBitL(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
lbI(i).Caption = CStr(TabBitL(i).Value)
end if
If i >= 17 thenTabBitH(i).Value IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
lbI(i).Caption = CStr(TabBitH(i).Value)
end if


et là où tu déclanches ton Starttest1, tu fais :
TabBitL.CompteurState = True


idem pour Starttest2 :
TabBitH.CompteurState = True


ainsi tu auras ton changement d'état pris en compte a chaque fois, tandis que le compteur ne sincrémentera que si CompteurState = True

en gros dans ta fonction Timer, tu dois te retourver avec quelque chose du genre:
Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String

Dim i As Integer
Dim SequenceTmp As String
Dim BitValeur As Integer

With IO
.BitReset PAR1, PL
.BitSet PAR1, PL

For i = 32 To 1 Step -1
BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
If i <= 16 then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Modif = TabBitL(i).HasChanged Or Modif
end if
If i >= 17 then
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Modif = TabBitH(i).HasChanged Or Modif
end if

lbI(i).ForeColor = 255 * BitValeur
LineV(i).Visible = True
LineD1(i).Visible = Not CBool(BitValeur)
LineD2(i).Visible = Not CBool(BitValeur)

Chaine = Chaine & vbTab & CStr(BitValeur)
.BitSet PAR1, CK
.BitReset PAR1, CK
Next i
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
End Sub


Voilà, j'ai fait quelques modifs par ci par là donc si t'as des questions, n'hésite pas....
regarde bien le code car il a changé a plusieurs endroits...

@+

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
21 sept. 2004 à 16:53
d'ailleurs j'ai fait une optimisation mais je l'ai pas exploité jusqu'au bout...

modifie
If i <= 16 then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Modif = TabBitL(i).HasChanged Or Modif
end if
If i >= 17 then
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Modif = TabBitH(i).HasChanged Or Modif
end if


par:
If i <= 16 then
TabBitL(i).Value = BitValeur
Modif = TabBitL(i).HasChanged Or Modif
end if
If i >= 17 then
TabBitH(i).Value = BitValeur
Modif = TabBitH(i).HasChanged Or Modif
end if

lbI(i).Caption = CStr(BitValeur)


@+

Yomm >:)

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

Et que la source soit avec toi!!!!!
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
21 sept. 2004 à 17:25
J'ai une petite erreur à la ligne

TabBitL.CompteurState = True


Erreur de compilation : Qualificateur incorrect.

Mais sinon ce que je souhaite ,c'est ce qu'il y a là.
C'est à dire en temps réel je vois mes 32 entrées sur ma feuille, et les compteurs qui ne fonctionne que l'orsque j'ai appuyé sur Starttest1 ou Starttest2

Voilà
et encore merci bcp pour 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
21 sept. 2004 à 18:17
exact , c'est un tableau ;-)
for i = 1 to 16 
TabBitL(i).CompteurState = True
next


de même
for i = 17 to 32
TabBitH(i).CompteurState = True
next


;-)

voilà cela devrait être mieux ;-)

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
22 sept. 2004 à 08:37
Alors, j'ai essayé ce matin
il y a plusieurs 2 choses qui ne marchent pas

voilà le code d'acquisition
Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String
Dim i As Integer
Dim SequenceTmp As String
Dim BitValeur 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
        BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
        
        If i <= 16 Then
            TabBitL(i).Value = BitValeur
            Modif = TabBitL(i).HasChanged Or Modif
        End If
        If i >= 17 Then
            TabBitH(i).Value = BitValeur
            Modif = TabBitH(i).HasChanged Or Modif
        End If

        lbI(i).Caption = CStr(BitValeur)          
            
            lbI(i).ForeColor = 255 * BitValeur
            LineV(i).Visible = True
            LineD1(i).Visible = Not CBool(BitValeur)
            LineD2(i).Visible = Not CBool(BitValeur)

        Chaine = Chaine & vbTab & CStr(BitValeur)
        
        
        .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


Alors le petit soucis mineur est que dans le fichier texte, les entrées sont écrites de la 32 à la 1. Faut juste l"inverser.
mais comment inverser BitValeur car on ne peut pas faire comme avant (TabBit(32 - i + 1)) ?

la seconde chose est que les compteurs ne s'incrémentent pas.
est ce que dans le module de classe, c'est ligne est corret :
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) Then

Ne faudrait il pas mettre ceci pour que ça ne compte qu'au passage de 1 à 0
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) And (Valeur = 0)  Then


Voici le code que j'ai pour le start du test 1
Private Sub Start_Test1_Click()

Dim i As Integer
For i = 1 To 16
TabBitL(i).CompteurState = True
Next
(...)


voilà, je regarde ce qui peut poser 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
22 sept. 2004 à 10:03
pour le premier point :
----------------------------
j'ai fait un copier collé et j'avais oublié ce problème..autant pour moi :
supprime la ligne
Chaine = Chaine & vbTab & TabBit(i).Value

et modifie le If comme cela:
If i <= 16 then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Modif = TabBitL(i).HasChanged Or Modif
Chaine = Chaine & vbTab & TabBitL(16 - i +1).Value 
else
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Modif = TabBitH(i).HasChanged Or Modif
Chaine = Chaine & vbTab & TabBitH(32 - i +1).Value 
end if


pour le second point :
----------------------------
idem que le premier, j'avais oublié la modif ;-)
tu as raison , il faut mettre:
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) And (Valeur = 0) Then


@+

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
22 sept. 2004 à 10:45
Alors pour la modif du fichier de classe, c'est fait.

En ce qui concernce le fichier d'acquisition, tu me dis de supprimer la ligne
Chaine = Chaine & vbTab & TabBit(i).Value

Mais je ne l'ai plus cette ligne, je pense que tu parlais de la ligne
Chaine = Chaine & vbTab & CStr(BitValeur)


J'ai remplacé la partie acquisition avec le if

voilà ce que donne le code acquisition
Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String
Dim i As Integer
Dim SequenceTmp As String
Dim BitValeur 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
        BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
        
        If i <= 16 Then
            TabBitL(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitL(i).Value)
            Modif = TabBitL(i).HasChanged Or Modif
            Chaine = Chaine & vbTab & TabBitL(16 - i + 1).Value
        Else
            TabBitH(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitH(i).Value)
            Modif = TabBitH(i).HasChanged Or Modif
            Chaine = Chaine & vbTab & TabBitH(32 - i + 1).Value
        End If

        lbI(i).Caption = CStr(BitValeur)
            
            
            lbI(i).ForeColor = 255 * BitValeur
            LineV(i).Visible = True
            LineD1(i).Visible = Not CBool(BitValeur)
            LineD2(i).Visible = Not CBool(BitValeur)
        
        .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


Alors les compteurs ne marchent toujours pas, et il y a un bug dans l'écriture du fichier texte.
car là avec If i <= 16, la chaine correspond au 16 premiers bits sinon ma chaine correspond au 16 second bit.
Au final j'écris dans mon fichier texte, une chaine de 16 bits et non de 32 bits.
Vois tu ce que je veux dire. Il faudrais qu'en tout temps j'écris mes 32 bits, peu importe le test qui est lancé. (test 1 ou tes 2)
et que les boutons test 1 et test 2 ne servent qu'a "controler" les compteurs 1 à 16 et 17 à 32

voilà pour ce test
je pense que cette solution est moins bonne que le précendente
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
22 sept. 2004 à 13:02
te prends pas la tête...

écrit cela :
If i <= 16 then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Modif = TabBitL(i).HasChanged Or Modif
else
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Modif = TabBitH(i).HasChanged Or Modif
end if


puis après:
Chaine = Chaine & vbTab & CStr(BitValeur)


après ton "next" tu écris:
Chaine = StrReverse(Chaine)


et si cela ne marche par a cause du vbtab qui vas s'inverser....

dans le for au lieu de VbTav tu mets " " ( espace )

et arpès Chaine = StrReverse(Chaine)
tu mets
Chaine = Replace(Chaine , " " , VbTab)


je pense que ton problème sera résolue

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
22 sept. 2004 à 13:16
Alors j'ai fais les quelques modifs dont voici le code
Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String
Dim i As Integer
Dim SequenceTmp As String
Dim BitValeur 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
        BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
        
        If i <= 16 Then
            TabBitL(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitL(i).Value)
            Modif = TabBitL(i).HasChanged Or Modif
        Else
            TabBitH(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitH(i).Value)
            Modif = TabBitH(i).HasChanged Or Modif
        End If

        lbI(i).Caption = CStr(BitValeur)
            
            
            lbI(i).ForeColor = 255 * BitValeur
            LineV(i).Visible = True
            LineD1(i).Visible = Not CBool(BitValeur)
            LineD2(i).Visible = Not CBool(BitValeur)

       Chaine = Chaine & vbTab & CStr(BitValeur)
        
        .BitSet PAR1, CK
        .BitReset PAR1, CK
        End With
    Next i
    
    Chaine = StrReverse(Chaine)
    
    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


LE résultat est que l'écriture dans le fichier texte fonctionne, le problème restant est les compteurs
je désespère avec les compteurs, j'aurai envie des les jeters par la fenêtre. lol

je vais regarder une ancienne sauvergarde du problème pour voir si quelque chose manque car là quelque chose m'échappe.
rien de fais allusion à Cpt_C(i), normal ?
ce sont pas les 2 tableaux qui doivent être en rapport avec ?
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
22 sept. 2004 à 13:53
non ce n'est pas normal...surement une autre erreur de copier coller ;-) désolé

c'est bien que tu me mettes la procédure à chaque fois, ainsi cela m'évite de perdre des morceaux par si par là....

donc pour ton problème:
modif le If comme ceci:
If i <= 16 Then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Cpt_C(i).Caption= CStr(TabBitL(i).Compteur)
Modif = TabBitL(i).HasChanged Or Modif
Else
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Cpt_C(i).Caption= CStr(TabBitH(i).Compteur)
Modif = TabBitH(i).HasChanged Or Modif
End If


@+

PS: encore désolé d'avoir oublié 2 ou 3 p'ti truc dans mon copier/coller

Yomm >:)

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

Et que la source soit avec toi!!!!!
0
En regardant une anciene source, j'a un peu modifié la partie acquisistion
il manquait une ligne fesant référence à Cpt_C(i)

volà ce que donne la partie acquisition :

For i = 32 To 1 Step -1 'acquisition des 32 bits de données bit 32 à Bit 1
With IO
BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)

If i <= 16 Then
TabBitL(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitL(i).Value)
Modif = TabBitL(i).HasChanged Or Modif
Cpt_C(i).Caption = CStr(TabBitL(i).Compteur)

Else
TabBitH(i).Value = BitValeur
lbI(i).Caption = CStr(TabBitH(i).Value)
Modif = TabBitH(i).HasChanged Or Modif
Cpt_C(i).Caption = CStr(TabBitH(i).Compteur)

End If
(...)

je disrais que les compteurs fonctionnent à 90%
ils ne comptent pas avant starttest1 ou starttest2. Ils comptent pendant le test.
Le soucis que j'ai encore est qu'après le test ils fonctionnent toujours.
C'est un problème mineure, je vais jeter un oeil et ça, en espérant que tout fonctionnera normalement bientôt

je pense qu'il doit falloir désactiver ceci :
TabBitL(i).CompteurState = False

je vais jeter un oeil
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
22 sept. 2004 à 14:28
Je crois que c'est bon

l'écriture dans le fichier texte fonctionne, les compteurs fonctionne pendant le test, ni avant ni après

ouffffffffffffffff !!!!!!!!!!!!!

je commençais à désespérer.

pour désactiver les compteurs à la fin du test, voilà comment j'ai fais.
dans Starttest1, j'ai un timer
dans ce timer j'ai mis ceci TabBitL(i).CompteurState = True
et j'ai une boucle disant tant que je ne suis pas à 0 continue, si tu est à 0 désctive ceci TabBitL(i).CompteurState = False

bref au final ça focntionne

et bien j'aurai beaucoup apris. Encore merci

mais tout n'est pas finit pour moi, car sur les 32 entrées je n'ai pas 2 test, mais 4 en réalité. Mais actuellement pour les fonctionnalité du programme je travaille sur 2 tests, le passage à 4 ammenant que de mineurs modifications.
Mais je pense avoir tout compris et ça devrait aller

pour l'acquisistion je vais faire 4 tableaux, et voici en gros l'acquisition
        If i <= 8 Then
        TabBitT1(i).Value = BitValeur
         (...)
        Else If i >= 9 and <= 16 Then
        TabBitT2(i).Value = BitValeur
         (...)
        Else If i >= 17 and <= 24 Then
        TabBitT3(i).Value = BitValeur
         (...)
        Else If i >= 25 and <= 32 Then
        TabBitT4(i).Value = BitValeur
         (...)
         End if


je pense que ça devrait aller, je tiens au courant dans le semaine du résultat final, mais je suis assez confiant.
Encore merci pour ton aide qui jusque m'a été précieuse

@+
0
yomm Messages postés 515 Date d'inscription dimanche 17 février 2002 Statut Membre Dernière intervention 10 mars 2008 3
22 sept. 2004 à 14:35
t'as tout compris ;-)

et tout cela peut encore etre vu d'une autre manière mais je pense que celle çi te conviendra LOL...

Allez bon courage à toi

@+

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
22 sept. 2004 à 14:43
Quand je dis tout, en fait c'est presque.

Il y a a juste le module de classe qui faut j'apprenne à quoi ça sert.
mais je ferai des recherche afin de mieux comprendre son fonctionnement, mais sinon le reste ça va.
Je ne suis pas spécialiste VB mais je m'améliore de jour en jour, ça me rassure.

Au début du programme, je n'y connaissais quasiment rien, et maitenant je dirai que je me débrouille un peu

En ce qui concerne la méthode, celle ci me conviendra, je vais tout appliquer pour 4 test et je te dirai le résultat final.

@+ et merci
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
29 sept. 2004 à 13:53
Salut,
alors après avoir modifié ma carte et le programme, j'ai pu tester avec 4 tests.
tout semble fonctionne correctement, mais j'ai vu un bug dans le programme

Je t'explique :
Il y avait 4 tests avec 4 starts différents.
J'écris dans un fichier log dès que j'ai un changement d'état.

Il se trouve que si le test 1 est lancé, l'écriture dans le fichier fonctionne si un des bits du test1 change. Par contre si un des autres bits change, l'écriture ne se fait pas
C’est assez ennuyant car après dans le fichier texte ce n’est plus lisible correctement.
Ce qui serait bien est que de ligne à ligne suivante, on voit qu’elle est le bit qui a changé d’état. Ce qui fait que chaque ligne présente un bit différent et non plusieurs.

En gros il faut écrire dans le fichier log tant qu’au moins 1 des 4 tests est lancé.
Et on écrit dès qu’un des 32 bits change d’état

Je te remets le bout de code d’acquisition
Private Sub acquisition()

On Error Resume Next

Dim Modif As Boolean
Dim Chaine As String
Dim i As Integer
Dim SequenceTmp As String
Dim BitValeur 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
        BitValeur IIf((.Inp(PAR1 + 1) And BUSY) 0, 1, 0)
        
        If i <= 8 Then
            TabBitT1(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitT1(i).Value)
            Cpt_C(i).Caption = CStr(TabBitT1(i).Compteur)
            Modif = TabBitT1(i).HasChanged Or Modif
        ElseIf i >= 9 And i <= 16 Then
            TabBitT2(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitT2(i).Value)
            Cpt_C(i).Caption = CStr(TabBitT2(i).Compteur)
            Modif = TabBitT2(i).HasChanged Or Modif
        ElseIf i >= 17 And i <= 24 Then
            TabBitT3(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitT3(i).Value)
            Cpt_C(i).Caption = CStr(TabBitT3(i).Compteur)
            Modif = TabBitT3(i).HasChanged Or Modif
        ElseIf i >= 25 And i <= 32 Then
            TabBitT4(i).Value = BitValeur
            lbI(i).Caption = CStr(TabBitT4(i).Value)
            Cpt_C(i).Caption = CStr(TabBitT4(i).Compteur)
            Modif = TabBitT4(i).HasChanged Or Modif
        End If

        lbI(i).Caption = CStr(BitValeur)
               
            lbI(i).ForeColor = 255 * BitValeur
            LineV(i).Visible = True
            LineD1(i).Visible = Not CBool(BitValeur)
            LineD2(i).Visible = Not CBool(BitValeur)

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

End Sub


pourquoi j'ai ce soucis d'écriture ?
0
Minikisscool Messages postés 112 Date d'inscription mardi 30 mars 2004 Statut Membre Dernière intervention 1 avril 2008 1
29 sept. 2004 à 16:24
alors j'ai trouvé d'ioù viens ce problème d'écriture dans le fichier

rapelle toi, le module de classe, dont voici le code
Option Explicit

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

Public Property Let Value(ByVal Valeur As Integer)
Static TestPassage As Boolean
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) And (Valeur = 0) 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 Let CompteurState(ByVal Valeur As Boolean)
CompteurStateTmp = Valeur
End Property

Public Property Get CompteurState() As Boolean
CompteurState = CompteurStateTmp
End Property

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

Alors avec la ligne
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) And (Valeur = 0) Then

on ne compte que lors du passage de 1 à 0.
Le problème est que l'écriture dans le fichier texte aussi

Si je met ça
If (ValueTmp <> Valeur) And (TestPassage True) And (CompteurStateTmp True) Then

donc je compte au passage de 1 à 0 et de 0 à 1, et bien dans ce cas l'écriture dans le fichier texte est correct.
J'ai bien toutes les lignes et j'écris dans le fichier texte à chaque changement de bit, donc au final, entre 2 lignes dans le fichier, je n'ai qu'un bit qui change d'état

voilà
comment résoudre ce problème ?
0
Rejoignez-nous