Salut et merci de me répondre,
Je développe en ce moment ( urgent pour le boulot ) un petit logiciel en Visual Basic 6.0 pour pouvoir aller lire les mots ( un par un ) d'un automate Télémécanique TSX MICRO.
Cela veut dire, mise en forme de la trame, calcul du CRC16, envoi et réception pour lecture de la valeur.
Je suis avec un protocole Modbus avec une carte PCMCIA dédiée à l'automate.
Je Prends un exemple avec la valeur "7777" en décimal dans le mot %MW20.
La trame envoyée est un tableau de variant/byte ( 0 à 7 )
v_commande_tab(0) = 1 Numéro d'esclave
v_commande_tab(1) = 3 Fonction lecture
v_commande_tab(2) = 0 Mot à lire en hexa sur deux octets
v_commande_tab(3) = 14 Mot à lire en hexa sur deux octets
v_commande_tab(4) = 0 Nombre de mot à lire sur deux octets
v_commande_tab(5) = 1 Nombre de mot à lire sur deux octets
v_commande_tab(6) = CRC16 CRC16 sur deux octets
v_commande_tab(5) = CRC16 CRC16 sur deux octets
La réponse en bonne car l'automate répond avec la recopie de la fonction de lecture.
La trame reçue est un tableau de variant/byte ( 0 à 6 )
V_tampon_recu(0) = 1 Numéro d'esclave
V_tampon_recu(1) = 3 Fonction lecture
V_tampon_recu(2) = 2 Nombre d'octet lu
V_tampon_recu(3) = 30 Erreur sur le bit de poids fort
V_tampon_recu(4) = 97 Erreur sur le bit de poids faible
V_tampon_recu(5) = CRC16 CRC16 sur deux octets
V_tampon_recu(6) = CRC16 CRC16 sur deux octets
En fait je peux compter que si le mot ne dépasse pas 255 en décimal ( 1 octet = 8 bits ), l'octet de poids faible me donne 255 et l'octet de poids fort 0.
Ca c'est bon, mais pourquoi ça ne marche pas lorsque c'est codé sur 2 octets donc supérieur à 255 en décimal.
Je veux bien une réponse SVP.
Ci-joint le code de mon module réception de la trame, si toutefois vous voulez le code complet, je peux l'envoyer.
cyrille.fouchet@caramail.com
Option Explicit ' Déclaration obligatoire des variables
Public Sub reception(v_commande_tab As Variant, s_tab_valeur_identifs As Variant, i_index_env As Integer)
Dim v_tampon_recu As Variant ' Variable pour réception par octet
page_principale.MSComm1.InputMode = comInputModeBinary ' Réception en mode octet
page_principale.MSComm1.InputLen = 0 ' Vidage tampon de reception
page_principale.Timer3.Enabled = True ' Marche du Timer 3
Do
If (page_principale.MSComm1.InBufferCount > 0) Then ' Si réception
page_principale.Timer3.Enabled = False ' Dévalidation du Timer 3
page_principale.infos_txt1.Text = page_principale.infos_txt1.Text & "Réponse de l'automate : Vérification " & Time & vbCrLf
v_tampon_recu = page_principale.MSComm1.Input ' Réception de la reponse
' Call Comparaison_trame.comparaison(v_commande_tab, v_tampon_recu, s_tab_valeur_identifs, i_index_env)
Exit Do ' Sortie de la boucle
End If
If (page_principale.Timer3.Enabled = False) Then ' Temps de réception trop long
Exit Do ' Sortie de la boucle
End If
Loop
End Sub