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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.