|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Bonjour,
Je dois communiquer avec un compteur, en Modbus depuis hier et grâce à vous (le forum), j'arrive à envoyer des trames vers ce compteur, le problème est que les Trames que je reçois en réponse sont incomplètes, et elles varient (je ne reçois pas toujours le même nombre d'octet .Je vous avoue que la j'ai vraiment besoin de vos lumières, car le fabricant m'a envoyé un petit .exe qui permet de tester la communication, et avec son programme la je reçois toujours la bonne Trame(complete !) Voici les 2 codes, pour envoyer et pour recevoir. Code : Code vb :
Pour la documentation du compteur (ICI) Pour la documentation du convertisseur (ICI)
__________________
![]()
|
||
|
|
00
|
|
|
#2 | |
|
Nouveau Membre du Club
![]() Inscription : juin 2007 Messages : 24 ![]() |
Bonjour,
Le problème ne pourrait -il pas venir du fait que tu n'attends pas la fin de l'envoi de la trame ? j'ai trouvé ceci sur le net: Citation:
En espérant que cela puisse t'aider Bonne continuation |
|
|
|
00
|
|
|
#3 |
![]() ![]() |
+1, je pense aussi que sethangel , as mis le doigt sur ton probléme, sauf qu'en modbus les longueurs des trames ne sont pas fixe ,elles dépendent de la requête (type , nombre d'octets à lire ou écrire , réponse ok ou pas...
habituellement la fin des trames modbus série.. et "réglable" par un temps inter-caractéres maximum, lorsque le temps après la réception d'un caractère dépasse celui-ci la trame est terminée.
__________________
page à bbil : dernières entrées : Débuter en VB6 Mes contributions en téléchargement Les pages VB : FAQs, Tutoriels VB, Outils , Sources, WIKI Impératif "A LIRE AVANT DE POSTER"
|
|
00
|
|
|
#4 |
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
+1, ça doit venir de la gestion un peu "rapide" de l'événement OnComm().
Les données reçues sont bufferisées, tu peux donc récupérer le contenu du tampon de réception au bout d'un délai raisonnable (lecture de 2 mots => réponse de 2*2+5=9 octets, à 9600 bps => 90ms), disons 100 ms pour ta requète. L'avantage de lire les données reçues au bout de ce délai, c'est que tu récupères la réponse entière, quelle qu'elle soit, que ce soit la réponse attendue (les 9 octets ici) ou une réponse d'exception (qui fera 5 octets, au cas où la requète ne soit pas traitable, par ex.) |
|
|
00
|
|
|
#5 | ||
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Bonjour le forum et merci pour vos réponses,
Je ne sais pas tester directement dans mon programme, car je suis pas au travail, mais si j'ai bien compris, je dois juste ajouter un delais d'atente lors de la reception de données. Mais j'ai besoin de vous car je ne sais pas du tout à qul moment je dois effectué ce delais d'attente. J'imagine que ca va être quelque chose du genre : Code :
Merci
__________________
![]()
|
||
|
|
00
|
|
|
#6 | ||||
|
Nouveau Membre du Club
![]() Inscription : juin 2007 Messages : 24 ![]() |
En me basant sur les propos de bbil et de Poil_dur une modification de ton code de la sorte devrait être suffisante:
Code :
Dans ce cas il faudrait plutôt remplacer le sleep(100) par une boucle Code :
Bon courage |
||||
|
|
00
|
|
|
#7 |
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Bonsoir et merçi pour votre aide,
mais malheureusement j'ai testé pas de mal de chose(S) mais toujours les mêmes trames "incompletes" ![]() J'implore votre aide ...
__________________
![]()
|
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : juin 2007 Messages : 24 ![]() |
J'avoue que je suis un peu sec, pourrais-tu nous indiquer, ce que tu reçois dans tes trames ?
Si tu peux nous en mettre quelques unes en exemple des fois que cela nous inspire quelque chose. |
|
|
00
|
|
|
#9 | ||
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Par exemple j'envoie la trame
Citation:
Citation:
__________________
![]()
|
||
|
|
00
|
|
|
#10 |
|
Nouveau Membre du Club
![]() Inscription : juin 2007 Messages : 24 ![]() |
Je pense que tu as déjà essayé, mais as tu tenté de ne pas lire directement le buffer à réception, juste de te mettre un message, puis écrire un autre bouton, qui ira lire dans le buffer de réception de ton mscomm ?
tu pourrais aussi essayer (pour vérifier que le problème vient bien de la réception de ton mscomm de faire une boucle do loop comme j'ai expliqué précédemment et d'attendre ton crc (il faut bien sûr l'avoir calculé en fonction de ce qu'indique le compteur). Désolé, je demande beaucoup de choses mais j'essaye en même temps de comprendre ce qui peut bloquer. |
|
|
00
|
|
|
#11 |
|
Membre régulier
![]() Inscription : novembre 2007 Messages : 81 ![]() |
Hello,
perso, je ferais comme ça: garder le traitement de l'événement OnComm(), en virant l'appel à Traitement(tampon) (l'événement OnComm() se contente de "manger" les octets au fur et à mesure de leur réception, en les concaténant dans tampon); gérer le délai d'attente de réponse par un timer, activé lors de l'envoi de la requète, et cadencé à 100ms, c'est l'événement OnTimer() (de mémoire) qui fera appel à Traitement(tampon). L'avantage, c'est que tu pourras facilement régler le délai d'attente pour être sûr d'avoir tous les octets de la trame de réponse, en mettant 2000ms pour la durée du timer, par exemple. Manifestement, tu ne reçois que les premiers octets de la réponse du compteur, et ça ressemble à quelque chose de bon (adresse esclave OK, code fonction aussi, 4 octets de données ce qui est attendu), reste à choper les données et le CRC. T'en es plus très loin, là, faut pas débander ! Courage |
|
|
00
|
|
|
#12 |
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Bonjour le forum,
j'ai trouvé quelque chose, bon déjà chose importante la transmission fonctionne et la réception aussi (depuis le début), le problème était simplement du au fait que j'envoyé le tampon dans un textbox qui apparemment n'affichait pas tout, pourquoi je ne sais pas; pour faire un test je me suis dit je vais afficher dans un MsgBox, et la surprise il m'affiche la trame complète J'ai même pu retirer le "Sleep (1000)", le Do Loop ... Ca fonctionne Bon maintenant je vais continuer mon programme, a savoir 1) vérifier la taille du message reçu 2) tester le CRC 3) Traduire la valeur reçu 4) Envoyer les données vers une base de données 5) Pouvoir récupérer les données de la base de données en fonction d'une requête Si vous avez, des conseils à me donner, je vous écoute avec grande attention
__________________
![]()
|
|
|
00
|
|
|
#13 |
![]() ![]() Bruno GuérangéIngénieur développement logiciels Inscription : mai 2002 Messages : 7 899 ![]() |
Le textbox n'affiche pas tout car il s'arrète qur le premier #0 rencontré.
Windows est écrit en C et utilise partout le #0 quand fin de chaine. QUand tu travailles sur des octets de la sorte, tranforme-les en hexa avec de les afficher ce sera beaucoup plus facile à lire. Pour le CRC tu devrais trouver sur le nET pal mal de sources pour le calculer. (j'en ai un mais c'est en Delphi)
__________________
Delphi : 264 sources à consulter/télécharger ! |
|
|
00
|
|
|
#14 | ||
|
Membre régulier
![]() Inscription : avril 2006 Messages : 201 ![]() |
Quand c'est simplement expliqué "Tout est plus claire !"
pour le CRC, j'ai trouvé quelques sources intéressantes, mais je vais utiliser c'elle de Mr Bbil Code :
__________________
![]()
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com