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

Bibliothèques tierces Python Discussion :

[pyVISA] Problème de réception de réponse d'un appareil,TCP/IP, éthernet,


Sujet :

Bibliothèques tierces Python

  1. #1
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut [pyVISA] Problème de réception de réponse d'un appareil,TCP/IP, éthernet,
    Bonjour,
    je souhaite piloter une enceinte thermique Vötsch VT7011 par TCP/IP via un câble éthernet. J'utilise PyVISA1.8 , NI VISA 17.0, Python3.6 et Windows10.
    j'arrive à envoyer des commandes à l'appareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import visa
    rm = visa.ResourceManager()
    inst = rm.open_resource('TCPIP0::<ip adress>::<nb port>::SOCKET',read_termination = '\n')
    inst.write('$01E 0050.0')   #fixe la température à 50°C, l'appareil n'est pas censé renvoyer quelquechose
    En revanche je n'arrive pas à recevoir les réponses de l'appareil lorsque j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    inst.query('$01?') #renvoie une description des températures réelles et de consigne
    #Si j'utilise read() ou read_raw() après un write je ne reçois également pas la réponse de l'instrument
    Python me retourne l'erreur suivante:
    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
     
    Traceback (most recent call last):
      File "D:\programme python\ex avec pyvisa.py", line 20, in <module>
        print(inst.query('$01?'))
      File "C:\Users\Python\Python36-32\lib\site-packages\pyvisa-1.8-py3.6.egg\pyvisa\resources\messagebased.py", line 407, in query
        return self.read()
      File "C:\Users\Python\Python36-32\lib\site-packages\pyvisa-1.8-py3.6.egg\pyvisa\resources\messagebased.py", line 332, in read
        message = self.read_raw().decode(enco)
      File "C:\Users\Python\Python36-32\lib\site-packages\pyvisa-1.8-py3.6.egg\pyvisa\resources\messagebased.py", line 306, in read_raw
        chunk, status = self.visalib.read(self.session, size)
      File "C:\Users\Python\Python36-32\lib\site-packages\pyvisa-1.8-py3.6.egg\pyvisa\ctwrapper\functions.py", line 1582, in read
        ret = library.viRead(session, buffer, count, byref(return_count))
      File "C:\Users\Python\Python36-32\lib\site-packages\pyvisa-1.8-py3.6.egg\pyvisa\ctwrapper\highlevel.py", line 188, in _return_handler
        raise errors.VisaIOError(ret_value)
    pyvisa.errors.VisaIOError: VI_ERROR_TMO (-1073807339): Timeout expired before operation completed.
    Sur d'autres forums, je vois que ce problème de réception est assez fréquent avec PyVISA, j'ai essayé plusieurs caractères de fin de ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write_termination=None  #ou \r ou \r
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read_termination='\n' #ou \r
    ou encore augmenter le timeout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inst.timeout=10000  #en ms
    ? Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si çà part en timeout, c'est peut être que l'appareil ne reconnaît pas la commande. S'il expédie quelque chose et que Visa n'arrive pas à terminer la lecture, un outil comme WireShark permettrait de le voir.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Le problème c'est que avec NI MAX j'arrive à envoyer des commandes et à recevoir la réponse de l'appareil, mais pas dans Python. Je pense que c'est une histoire de caractère de fin de ligne, mais je ne comprends pas très bien comment c'est géré dans Python.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par bob rajowski Voir le message
    Le problème c'est que avec NI MAX j'arrive à envoyer des commandes et à recevoir la réponse de l'appareil,
    Ca veut dire que votre appareil fonctionne. C'est déjà une bonne information.

    Citation Envoyé par bob rajowski Voir le message
    mais pas dans Python. Je pense que c'est une histoire de caractère de fin de ligne, mais je ne comprends pas très bien comment c'est géré dans Python.
    Lorsque vous écrivez inst.query('$01?') Python se contente de transmettre çà à PyVISA qui le transmet à VISA - une bibliothèque tierce écrite en C de National Instrument -... et c'est VISA qui lève le timeout.
    Donc soit il n'a rien reçu, soit il n'a pas tout reçu... (c'est là que WireShark peut aider) et c'est une question de configuration (de l'instrument)... qui doit refléter ce que raconte la documentation de l'enceinte thermique Vötsch VT7011 (c'est l'équipement qui répond aux messages et qui les termine ou pas avec...).

    Donc Python ne fait rien...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    J'ai utilisé Wireshark, et lorsque j'envoie une commande dans Python, je ne reçois pas la réponse dans Python MAIS je la reçois bien dans Wireshark. Que dois-je faire maintenant ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par bob rajowski Voir le message
    Que dois-je faire maintenant ?
    Configurer l'instrument (la chose construite par rm.open_resource) soit en fonction du contenu de la trame, soit en fonction de la documentation.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Candidat au Club
    Homme Profil pro
    --
    Inscrit en
    Juin 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : --

    Informations forums :
    Inscription : Juin 2017
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Pour configurer, l'instrument j'ai fait varier la valeur de write_termination ou read_termination dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inst = rm.open_resource('TCPIP0::<ip adress>::<nb port>::SOCKET',write_termination='\r',read_termination='\r')
    La doc de l'appareil indique que la commande doit commencer par $ et se finir par CR (retour chariot), et que la réponse de l'appareil se termine par CR.
    Ce que je ne comprends pas, c'est que avec write_termination='\r',read_termination='\r, avec le code Python suivant
    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
    import visa
    rm = visa.ResourceManager()
    print(rm.list_resources())  #ne renvoie pas l'adresse de l'appareil 
    inst = rm.open_resource('TCPIP0::<ip adress>::<nb port>::SOCKET',write_termination='\r',read_termination='\r') #à récupérer dans NI MAX
     
    while 1:
        commande=input('tapez votre commande (tapez quitter pour quitter):')
        if commande=='quitter':
            inst.close()
            print('vous avez quitté')
     
        elif commande[len(commande)-1]!='?' and commande!='$01I': #l'appareil n'envoie pas de réponse pour les commandes se finisant par ?; donc write suffi
            print(inst.write(commande))
        else: #l'appareil renvoie une réponse si la commande finie par ? ou vaut $01I, donc utilisation de query
            print(inst.query(commande))
    lorsque j'envoie $01?, j'obtiens la première ligne de la réponse (la réponse contient 60 lignes environ au total), puis j'entre par exemple ? (qui n'est pas une commande valide de l'instrument), et là je reçois la deuxième ligne de la réponse de $01? L'appareil ne prend donc plus en compte les commandes mais ne renvoie que la réponse ligne par ligne.
    Comment dois-je donc faire pour avoir la réponse en entier? Quelles informations peut m'apporter Wireshark?
    Je ne comprends également pas pourquoi à la ligne 3 je n'ai pas l'adresse de l'appareil.

    Merci pour vos réponses

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par bob rajowski Voir le message
    L'appareil ne prend donc plus en compte les commandes mais ne renvoie que la réponse ligne par ligne.
    Comment dois-je donc faire pour avoir la réponse en entier? Quelles informations peut m'apporter Wireshark?
    Si lorsque vous expédiez '$01?', l'appareil retourne 60 "lignes" (se terminant par '\r'), il est normal que .query retourne la première ligne (vous lui avez dit que le message à attendre se terminait par '\r') et laisse les autres en attente. Puis si vous entrez une commande invalide comme .query('?'), çà expédie un truc à l'appareil qui l'ignore mais comme vous avez des lignes en attente, çà retourne la ligne suivante.

    Là vous êtes en train de faire vos débuts avec la communication réseau entre équipements (et vous n'êtes peut être pas dans le meilleur forum).

    Côté VISA, vous avez la documentation de PyVisa qui vous explique comment lire différents messages et la fonction passe-partout .read_raw qui vous oblige à trier vous même.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. problème de réception de formulaire
    Par oukok dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 13h14
  2. Problème de réception TCP/IP.
    Par BigBulle dans le forum C#
    Réponses: 4
    Dernier message: 02/04/2007, 21h27
  3. Problème de réception d'e-mail
    Par Lenaick dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 02/03/2007, 22h35
  4. Réponses: 5
    Dernier message: 11/03/2004, 15h34

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