Addition

valviet Messages postés 10 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 7 juillet 2010 - 7 juil. 2010 à 11:45
nathansecret Messages postés 63 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 31 octobre 2011 - 6 oct. 2010 à 19:38
Bonjour,

Je n'arrive pas à additionner des données dans les textboxs
je m'explique :
J'ai des données qui sont incrémentés toute les secondes, je voudrais récupérer ces données les enregistré et les remettre à zéro, et ainsi évité le dépassement de capacité ^^
un bout de code :
Private Sub Command1_Click() 'MAchine 1
Dim requete As String
Dim requete10 As String
Dim mot1 As Long
    VarTest2 = ""
    requete = Chr(1) + Chr(4) + Chr(0) + Chr(0) + Chr(0) + Chr(1) + Chr(49) + Chr(202) 'envoie requete lecture %mw0
    MSComm1.Output = requete
    machine = "1"
        Sleep 80
             tampon = MSComm1.Input
           For i = 1 To Len(tampon)
            VarTest2 = VarTest2 & Asc(Mid(tampon, i, 1)) & " "
        Next i
                       mot = Asc(Mid(tampon, Len(tampon) - 3, 1)) * 256 + Asc(Mid(tampon, Len(tampon) - 2, 1))
                Text1.Text = "La machine numro" & " : " & machine & "  fait : " & mot & " actions ."
   Sleep 80
requete10 = Chr(1) + Chr(6) + Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(137) + Chr(202) ' RAZ de %mw0
MSComm1.Output = requete10
mot1 = Val(mot) + Val(mot1)
Text26.Text = mot1

     End Sub


Je veux donc récupérer la valeur "mot" la mettre a zéro dans l'automate, mais, je veux continué a la compté. Je ne sais pas si je suis clair ^^

Merci

5 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 juil. 2010 à 12:24
Salut

Comment sont dimensionnés 'tampon' et 'mot' ? quel type ?

Quelle sont les valeurs des RThreshold et InputLen de MSComm1 ?

Si la longueur de tampon est inférieure à 3, que va t-il se passer ? (bug)

Détail : La lecture du buffer ne doit pas être faite comme tu le fais car, si le buffer est vide, tu auras des soucis.
MSComm renvoie l'évènement OnComm (voir l'exemple de l'aide) qui se déclenchera seul lors de la réception : c'est là qu'il faut traiter les données reçues.

Ton programme actuel fonctionne t-il ?
Quel est ton problème ?
Que se passe t-il ?

Remettre à zéro le mot dans l'automate : Il n'y a que toi qui sache si la trame de requete10 est correcte, VB n'y pourra rien, et nous non plus.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
valviet Messages postés 10 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 7 juillet 2010
7 juil. 2010 à 13:55
Tampon est en string, mot string aussi
C'est des requetes de type ModBus.

RThreshold = 1
InputLen = 0

Mon programme actuel fonctionne .
Le problème c'est qu'au bout d'un certain temps il y a dépassement de capacité, (aprés 32 767)
Ce que je veux faire c'est sauvegardé la valeur de "mot", faire un RAZ de la mémoire de l'automate (qui compte encore) ensuite recommencé le comptage avec la dernière valeur de "mot"

La trame RAZ fonctionne bien ^^

Merki,
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 juil. 2010 à 20:02
32767 est la limite des Integer.
Il est possible qu'une variable non dimensionnée prenne ce type par défaut.

--> Dimensionner chaque variable
--> Ecrire les fonctions de conversion afin que ce ne soit pas le compilateur qui le fasse et ... se trompe.

Dans cette ligne :
mot1 = Val(mot) + Val(mot1)
mot est String
mot1 est Long
Tu as bien pris soin de transformer 'mot' en Valeur pour convertir ta chaine en chiffre, mais il n'est pas nécessaire de transformer 'mot' qui est Long
Donc
mot1 = CLng(Val(mot)) + mot1

Autre corrections à faire :
mot = Asc(Mid(tampon, Len(tampon) - 3, 1)) * 256 + _
      Asc(Mid(tampon, Len(tampon) - 2, 1))
mot est String
ASC renvoie un Integer, mais donnera une valeur maxi de 255 (dans ton cas)
Puisque tu multiplies ton premier mot par 256, tu risques de calculer 256 * 256 = 65535 : ça va pas passer. (c'est surement ce qui t'arrive)
Il faut donc ramener toutes ces valeurs dans des types acceptants ces valeurs, les Long :
mot = CStr(CLng(Asc(Mid(tampon, Len(tampon) - 3, 1))) * 256& + _
           CLng(Asc(Mid(tampon, Len(tampon) - 2, 1))))
Tu remarqueras le "&" après le 256 : C'est pour lui dire que cette constante, 256, doit aussi être interprétée comme un Long.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
7 juil. 2010 à 20:04
Au fait :
mot1 est dimensionné, mais tu ne mets rien dedans, il restera à 0
0

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

Posez votre question
nathansecret Messages postés 63 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 31 octobre 2011
6 oct. 2010 à 19:38
Je ne peux pas vous aider à corriger complètement ce problème, mais je peux vous aider à le diminuer :

Integer : -32676 à +32676
Long : -2147483648 à +2147483647
Double : -170141183460469231731687303715884105728 à +170141183460469231731687303715884105727
: Je ne suis pas sûr, en tout cas Long et Double sont plus grands que Integer

NathanSecret
0
Rejoignez-nous