IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

API Winsock modbus tcp/ip [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    automaticien
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : automaticien

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut 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 : 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.

  2. #2
    Nouveau membre du Club
    Femme Profil pro
    automaticien
    Inscrit en
    Juin 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : automaticien

    Informations forums :
    Inscription : Juin 2015
    Messages : 5
    Par défaut
    J'ai trouvé une solution, je la mets en ligne au cas où cela pourrait aider quelqu'un d'autre.
    J'ai simplement modifier mon buffer de réception en tableau de Byte au lieu d'une variable string, en utilisant la fonction "recv" au lieu de la fonction "revstr"

    Voici le code qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ' Réception des données
    Dim lrec As Long
    Dim Tab_reception(256) As Byte
    lrec = recv(lsock, Tab_reception(0), 256, 0)

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2022
    Messages : 8
    Par défaut API winsock modbustcp/ip
    Bonsoir,
    J'ai installé le fichier de Ostrosoft sur un pc en windows vista 32 bits.
    Sur un fichier exemple avec le port 80 cela fonctionne.
    Par contre sur un autre exemple venant de Acc automation, port 502, je n'arrive pas à avoir de retour d'informations car l'évènement OnDataArrival ne se déclenche pas.
    Je suis pourtant sur de ma trame envoyée par SendData car j'ai testé la trame avec succès sur un testeur modbus.
    En reprenant l'exemple de elisabeth2, vba avec excel 2007 ne reconnait pas la syntaxe utilisée.
    Faut il installé quelque-chose et le faire reconnaître à vba ?
    Si oui comment ?
    Si vous me répondez je pourrai donner plus de détails
    Merci
    Kezicris

  4. #4
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2022
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2022
    Messages : 8
    Par défaut 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 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour développer Serveur OPC Modbus TCP/IP ?
    Par bfespi69 dans le forum C++
    Réponses: 1
    Dernier message: 06/01/2011, 08h57
  2. Temps de répons Modbus/TCP
    Par Noukk dans le forum Automation
    Réponses: 6
    Dernier message: 05/02/2009, 08h31
  3. API winsock WSAIsBlocking
    Par chuko dans le forum Réseau
    Réponses: 3
    Dernier message: 21/09/2008, 14h32
  4. Connexion ModBus TCP
    Par j.sineau dans le forum VB.NET
    Réponses: 1
    Dernier message: 07/03/2008, 08h10
  5. Communication avec ModBus/TCP
    Par fabou3377 dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2006, 00h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo