Cela semble correspondre à ce dont j'ai besoin en particulier le controle Winsock, mais je suis sous excel 10 et je n'ai pas accès a ce "module" dans outil => Reference, je n'ai rien avec le nom Winsock, cela a changé de nom ? Où est ce normal que je n'ai rien sous excel 10 ?
Merci pour tout.
jordane45
Messages postés37714Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention21 septembre 2023342 18 nov. 2014 à 16:54
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 18 nov. 2014 à 12:08
Bonjour,
Regardez du côté du controle Winsock pour gérer la connexion TCP/IP.
Pour le protocole, une recherche de la doc de "Modbus TCP" devrait être d'une grande utilité.
Je ne comprends pas où est ce que je dois mettre l'adresse decimale de la valeur que je souhaite relever...
Je vous mets le code que j'ai fait, la connection marche, mais la réception ne retourne rien ! Je ne vois pas trop comment continuer...
Merci d'avance.
Function tuto1()
Dim lData As WSADATA
Dim lsock As Long
Dim lname As SOCKADDR
Dim lRet As Long
' Initialisation de Winsock
If WSAStartup(257, lData) = 0 Then
' Création d'une socket
lsock = socket(AF_INET, SOCK_STREAM, 0)
If lsock <> -1 Then
lname.sin_family = AF_INET ' famille "classique"
lname.sin_port(1) = 502 \ 256 ' première partie du port
lname.sin_port(2) = 502 Mod 256 ' deuxième partie du port
lname.sin_addr = addrfromhost("10.100.114.123") ' adresse du serveur
' Connexion
lRet = Connect(lsock, lname, LenB(lname))
'Vérification connexion OK
If lRet = 0 Then
' Réception des données de connexion
lStrToReceive = Space(1024)
lRet = recvstr(lsock, lStrToReceive, Len(lStrToReceive), 0)
If lRet > 0 Then
lStrToReceive = Left(lStrToReceive, lRet)
Debug.Print "Octets reçus : " & lRet & vbCrLf & lStrToReceive
End If
Else
MsgBox "Le code d'erreur est :" & Err.LastDllError
End If
closesocket lsock
End If
WSACleanup
End If
End Function
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 19 nov. 2014 à 13:42
As-tu regardé la documentation du protocole Modbus TCP ?
oui, j'ai compris que je devais poser une question, mais je ne comprend pas bien comment poser cette question...
j'ai cru comprendre que la question devais commencer par le numero visé donc je pense 50770 mais ensuite je ne comprend pas du tout comment relever cette valeur !
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 19 nov. 2014 à 19:42
Le protocole Modbus est un protocole multipoint, un maitre et plusieurs esclaves.
Il y a donc le numéro d'esclave pour dire à qui tu t'adresses et un code fonction pour dire ce que tu veux lui demander.
Et le l'adresse que tu as sert à dire à quel offset chercher les données.
Et ensuite, je n'ai qu'un seul exclave, et je n'ai pas de numéro d'exclave...
Du coup je suis incapable de creer le code à envoyer car celui ci commence par le numéro d'exclave.
Ensuite j'ai compris que je dois envoyer 1 car je cherche une lecture, puis l'adresse C652. Ensuite je doit mettre un mot de controle et celui ci non plus je ne sais pas à quoi il correspond...
donc pour récapituler je dois envoyer XXX.C652.1.XXX
Voici le code où je suis arrivé.
Function tuto1()
Dim lData As WSADATA
Dim lsock As Long
Dim lname As SOCKADDR
Dim lRet As Long
' Initialisation de Winsock
If WSAStartup(257, lData) = 0 Then
' Création d'une socket
lsock = socket(AF_INET, SOCK_STREAM, 0)
If lsock <> -1 Then
lname.sin_family = AF_INET ' famille "classique"
lname.sin_port(1) = 502 \ 256 ' première partie du port
lname.sin_port(2) = 502 Mod 256 ' deuxième partie du port
lname.sin_addr = addrfromhost("10.100.114.123") ' adresse du serveur
' Connexion
lRet = Connect(lsock, lname, LenB(lname))
'Vérification connexion OK
If lRet = 0 Then
If lRet = 0 Then
' Envoi des données
lStrToSend = "XXX.01.C652.XXX" & vbCrLf
lRet = sendstr(lsock, lStrToSend, Len(lStrToSend), 0)
Debug.Print "Octets envoyés : " & lRet & " / " & Len(lStrToSend) & vbCrLf & lStrToSend
' Réception des données
lStrToReceive = Space(1024)
lRet = recvstr(lsock, lStrToReceive, Len(lStrToReceive), 0)
If lRet > 0 Then
lStrToReceive = Left(lStrToReceive, lRet)
Debug.Print "Octets reçus : " & lRet & vbCrLf & lStrToReceive
End If
Else
Debug.Print "Erreur de connexion n° " & Err.LastDllError
End If
closesocket lsock
End If
WSACleanup
End If
End If
End Function
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 20 nov. 2014 à 18:40
Il te manquue encore des champs :
Identifiant de requête (Déclinaison TCP de Modbus)
Longueur de requête (Déclinaison TCP de Modbus)
Numéro d'esclave (Générique modbus)
Les données sont à coder en binaire, si c'est du modbus TCP ASCII, le binaire doit être transformé en chaine HEXA (sans préfixe no séparateur de groupe)
Je vais poser deux questions qui vont sans doute parraitre débile, mais je ne comprend pas :
-Comment connaitre le numéro d'esclave ? J'ai beau chercher je ne vois pas où je peux trouver ce numéro...
-Identifiant de requête, ce n'est pas le 03 que j'ai mis au début ?
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 22 nov. 2014 à 20:16
Bonsoir,
N° esclave : de base, c'est souvent le numéro 1, mais ça peut changer, voir la doc de ton équipement.
L'id requête : c'est le premier champ numérique d'une requête Modbus, il sert à identifier quelle réponse va avec quelle requête, car il est possible en modbus TCP d'envoyer plusieurs requête avant d'avoir reçu la première réponse.
Le code 03 est le code pour la fonction de lecture de mots.
J'ai mis un tempo de 200ms pour attendre la réponse mais rien ne viens.... Est ce un problème de tram d'envoi, un problème de reception ou autre ? Je dois avouer que là je suis bloqué... Je cherche depuis plusieurs jours, mais rien...
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 18 déc. 2014 à 19:11
Bonsoir,
Le "vbCrLf" qui traine en fin de ta chaine à envoyer, me fait penser que tu as mélangé les protocoles Modbus.
Si tu mets un VbCrLf, ça veut dire que tu veux échanger en texte, soit chaque octet à envoyer doit former 2 caractères en hexadécimal.
Si tu mets les données avec un Chr$, cela veut dire que tu veux transmettre en binaire et c'est donc l'absence de données qui signale la fin de la trame.
La présence de l'instruction : Chr(C6) me laisse penser que tu t'es trompé dans le format de ta chaine, penses à mettre "Option Explicit" en haut de tout tes modules de code.
Tu veux communiquer en ModbusTCP (enfin, je suppose), mais tu ne semble pas respecter le formalisme de ce protocole, je t'invite donc à revoir le formatage de ta trame afin d'aller plus loin.
Je n'arrive vraiment pas à comprendre ce que je dois envoyer pour recevoir une réponse correcte ...
Selon ce que tu me dit, avec cette methode j'envoi en Binaire or j'ai compris que c'était de l'hexa qu'il me fallais ... La solution en Chr ne fonctionne donc pas ?
je ne comprend pas du tout ce que je doit envoyer aurais tu un exemple à me montrer ou quelque chose qui m'eclaire ? j'ai éplucher de nombreux cours sur internet mais aucun ne m'a aidé...
Merci d'avance !
NHenry
Messages postés15083Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 septembre 2023159 21 déc. 2014 à 21:34
Il faut que tu résonnes en octet, pas en caractères, il serait même mieux que tu envoies un tableau d'octet plutôt qu'une chaine :
Dim ltByte(0 to 8) as Byte
ltByte(0)=&h1
ltByte(1)=&h1
ltByte(2)=&h3
ltByte(3)=&hC6
ltByte(4)=&h52
ltByte(5)=&h0
ltByte(6)=&h2
ltByte(7)=&h59
ltByte(8)=&h7
Petite précision, j'ai remarqué que le 03 dans la réponse est toujours présent ! quelque soit ma requête en entré : Avec le tableau, avec les chr(), en entrant directement les caractères, ....
97 63 82 63 0 3 0 128 1
est ce un code erreur ? ou quelque chose comme cela ?
18 nov. 2014 à 16:54
voir ici :
http://arkham46.developpez.com/articles/office/officeweb/?page=page_8
Modifié par corentinte le 19/11/2014 à 11:18