API Winsock modbus tcp/ip
Bonjour,
Je travaille actuellement à établir une communication modbus tcp/ip entre Excel et un automate.
C'est un travail que j'ai déjà réalisé avec le contrôle Winsock qui marche très bien. Le problème c'est que nous avons des postes avec la version d'office professionnel plus 2013 sur lequel il est impossible d'installer le contrôle winsock. Je me suis donc tourné vers les API's d'après l'excellent tutoriel sur ce site ici .
Pour mes tests j'utilise Windows 7 et office 2007 n'ayant pas à disposition le pc de mes collègues.
Le résultat c'est que j'arrive parfaitement à écrire dans mon automate mais je ne reçois aucun trame de réponse. Je reçois uniquement le nombre d'octets reçus qui est tout à fait correct mais la chaine de réception ne contient que ce avec quoi je l'initialise. Quand aux requêtes de lecture c'est la même chose je reçois bien le bon nombre d'octets mais rien dans le buffer.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
Public Const AF_INET = 2
Public Const SOCK_STREAM = 1
Public Const IPPROTO_TCP = 6
Function exemple()
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, IPPROTO_TCP)
If lsock <> -1 Then
' Connection avec le socket
lname.sin_family = AF_INET ' famille "classique"
lname.sin_port(1) = 502 \ 256
lname.sin_port(2) = 502 Mod 256
lname.sin_addr = inet_addr("127.0.0.1")
lRet = Connect(lsock, lname, LenB(lname))
If lRet = 0 Then
Dim envoi As String
' Ecriture de la valeur 50 à l'adresse %MW1
envoi = Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(6) + Chr(1) + Chr(6) ' en-tête et code fonction (6=ecriture un mot)
envoi = envoi + Chr(0) + Chr(1) ' adresse d'écriture
envoi = envoi + Chr(0) + Chr(50) ' valeur à écrire
' Lecture d'un mot
'envoi = Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(6) + Chr(1) + Chr(3)
'envoi = envoi + Chr(0) + Chr(0)
'envoi = envoi + Chr(0) + Chr(1)
' Envoi des données
lRet = sendstr(lsock, envoi, Len(envoi), 0)
' Réception des données
lStrToReceive = Space(255)
Dim lrec As Long
Dim lDoEvenets
lDoEvenets = DoEvents
lrec = recvstr(lsock, lStrToReceive, 255, 0)
If lrec > 0 Then
Dim recu As String
recu = ""
For i = 1 To lrec
recu = recu & Str(Asc(Mid(lStrToReceive, i, 1))) & "/"
Next
Debug.Print "Octets reçus : " & lrec & " / " & recu
End If
End If
closesocket lsock
End If
WSACleanup
End If
End Function |
J'ai pas mal cherché sur internet mais je trouve peu d'information concernant ce type de programmation.
En vous remerciant pour votre aide et vos conseils.
Connexion TCP/IP avec OSWINSCK.dll pour VBA Excel
Bonjour,
cela fonctionne.
Voici le fichier qui fonctionne en 32 bits.
Je cherche une DLL fonctionnant en 32 bits.
Bonne année
Je ne vois pas de bouton "joindre un fichier"
SVP, comment joindre mon fichier ?