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

WinDev Discussion :

Ecrire un byte sur le port série


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut Ecrire un byte sur le port série
    Bonjour,

    Je réalise une appli qui interroge un automate programmable. Ce dernier répond une chaîne de caractères.

    L'appli tourne en VB.net et je voudrais la développer en Windev.

    Pour interroger l'automate, il faut écrire un byte sur le port série.
    Le mode de communication est le mode RTU (Remote Terminal Unit) avec des caractères hexadécimaux.

    Au niveau de l'interrogation en VB.NET cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CMD = New Byte() {&H1, &H3, &H7, &HB, &H0, &H1, &HF4, &HBC}
    Comm1.Write(CMD, 0, CMD.Length)
    buf = ""
    Mais en Windev ça donne quoi ?
    ceci ne provoque aucune réponse de la part de l'automate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    secrit(4,"&H1, &H3, &H7, &HB, &H0, &H1, &HF4, &HBC")
    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Tu devrais concaténer ta chaîne avant l'envoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Écrire sur le port COM2 (préalablement ouvert)
    // Définir la chaîne
    Message est une chaîne DE caractères
    // Attibuer la chaôine
    Message = &H1+&H3+&H7+&HB+&H0+&H1+&HF4+&HBC
    // Envoi d'un message au buffer de sortie de COM2
    sEcrit(2, Message)
    À vérifier, l'utilisation de &H1 pour envoyer une chaîne hexadécimale.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut
    Merci pour ta réponse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    message est une chaîne de caractères
    l'éditeur signale une erreur sur "caractères"

    "caractères" est un mot clé du Wlangage, son utilisation dans ce cas est incorrecte.

    Chaîne de caractères ne figure pas dans les types de variables.

    Il y a quelque chose que je loupe ?

    Merci

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Utilise juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    message est une chaîne
    Le code est un copié/collé de la documentation, personnellement je n'utilise jamais "DE caractères".

    Et "message" est aussi un mot clef
    Donc, utilise une autre variable c'est préférable

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    il est aussi précisé dans la doc : Si le port n'a pas été ouvert par la fonction sOuvre, la fonction sEcrit n'a aucune action.

    Peut être ton erreur ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Citation Envoyé par Guardian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // Écrire sur le port COM2 (préalablement ouvert)

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 58
    Points : 55
    Points
    55
    Par défaut
    au temps pour moi

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut
    Merci pour vos réponses.
    Bien sûr je m'assure que le port est bien ouvert au préalable.
    Voici le code complet :
    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
     
    m est un booléen
    cmp est un entier //port com
    cmp = 4
    m = sOuvre(4, 2000, 2000,sTimeoutDéfaut,Vrai)
    SI m = Vrai ALORS
    	sFixeParamètre(cmp, 9600, 0, 8, 1)
                 Info ("port com4 ouvert")
    SINON
    	Erreur("Erreur d'ouverture de COM4")
    FIN
     
    sEvénement(cmp,sEveCaractèreReçu,"Ldiris")
     
    //envoi interrogation vers l'automate
    mes est une chaîne
    mes = "&H1+&H3+&H7+&HB+&H0+&H1+&HF4+&HBC"
    sEcrit(cmp,cmd)
     
    PROCEDURE ldiris(cmp,sEveCaractèreReçu)
    Info("octets détectés sur le port série")
    Je n'arrive toujours pas à provoquer une réponse de la part de l'automate.
    Voici les différents essais effectués au niveau de la chaîne mes :
    mes = "&H1+&H3+&H7+&HB+&H0+&H1+&HF4+&HBC" > aucune réponse
    mes = "&H1"+"&H3"+"&H7"+"&HB"+"&H0"+"&H1"+"&HF4"+"&HBC" > aucune réponse
    mes = "&H1 "+"&H3 "+"&H7 "+"&HB "+"&H0 "+"&H1 "+"&HF4 "+"&HBC" > aucune réponse
    mes = &H1+&H3+&H7+&HB+&H0+&H1+&HF4+&HBC > donne message d'erreur de syntaxe : identificateur H1 inconnu ou inaccessible

    Je ne suis pas sûr que même s'il y avait une réponse, la procédure ldiris serai déclenchée... ce serait super de pourvoir avoir un exemple.

  9. #9
    Membre confirmé
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Points : 492
    Points
    492
    Par défaut
    Bonjour,

    Essaye avec çà plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mes = 0x01+0x03+0x07+0x0B+0x00+0x01+0xF4+0xBC
    A+
    Vince

    http://vroy1.free.fr/wpfr
    http://www.ennovsys.fr

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut
    Cet automate est toujours aux abonnés absents...
    Voici les essais effectués :

    mes = "0x010x030x070x0B0x000x010xF40xBC"
    mes = "0x01"+"0x03"+"0x07"+"0x0B"+"0x00"+"0x01"+"0xF4"+"0xBC"
    g=Caract(13)
    mes = "0x01"+g+"0x03"+g+"0x07"+g+"0x0B"+g+"0x00"+g+"0x01"+g+"0xF4"+g+"0xBC"
    A part le code VB qui

    Je vais essayer de connecter un gps sur le port com histoire de voir si la routine Ldiris est déclenchée lorsqu'il y a une présence de données sur le port.

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Dans ce que tu nous donnes, tu n'as pas l'essai au format préconisé par Vincent ?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut
    Oops ! effectivement j'avais aussi essayé :

    mes = "0x01+0x03+0x07+0x0B+0x00+0x01+0xF4+0xBC"
    mes = 0x01+0x03+0x07+0x0B+0x00+0x01+0xF4+0xBC

    à mon grand étonnement Windev accepte une chaîne sans guillemets...
    mais l'automate ne répond toujours pas.

    Je regarde du côté de l'évènement sur le port série.

  13. #13
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Je n'ai pas tout lu, mais je pense que vous faites fausse route avec votre chaine de valeurs hexa :

    mes = "0x01+0x03+0x07+0x0B+0x00+0x01+0xF4+0xBC"
    Ca donne : 30 78 30 31 ... (codes ascii de votre chaîne)
    mes = 0x01+0x03+0x07+0x0B+0x00+0x01+0xF4+0xBC
    Ca donne :
    "455" (la somme des valeurs, convertie en chaîne)

    Vous pouvez faire :
    mes = Caract(0x01) + Caract(0x03) ...
    ou bien :
    mes est un tableau d'entiers sur 1 octet = [0x01, 0x03, ...]

    C'est mieux.

    PS. Pour utiliser le tableau d'entiers, et si vous avez besoin d'une chaîne, vous pouvez faire ceci :
    PROCEDURE OctetsVersChaîne(tabTableau est tableau d'entiers sur 1)
    sChaîne est une chaîne = Répète(Caract(0), Dimension(tabTableau))
    Transfert(&sChaîne, &tabTableau, Dimension(tabTableau))
    RENVOYER sChaîne
    mes est un tableau d'entiers sur 1 octet = [0x01, 0x03, 0x07]
    sEcrit(nPort, OctetsVersChaîne(mes))
    C'est moins lourd que les Caract().

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 144
    Points : 75
    Points
    75
    Par défaut
    Merci !

    Super, il accepte enfin le dialogue.

    Voici le code utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mes est une chaîne
    mes=Caract(0x01) + Caract(0x03)+ Caract(0x07)+ Caract(0x0B) + Caract(0x00) + Caract(0x01) + Caract(0xF4) + Caract (0xBC)
    sEcrit(cmp,mes)
    Encore un grand merci à tous.

Discussions similaires

  1. Ecrire en php sur le port série
    Par harold44 dans le forum Langage
    Réponses: 0
    Dernier message: 25/01/2014, 14h10
  2. Ecrire un caractère sur le port série
    Par med_alpa dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 19/06/2010, 03h43
  3. Réponses: 3
    Dernier message: 09/12/2009, 09h34
  4. Ecrire en hexa sur le port série avec java.comm
    Par theanthony33 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 15/06/2009, 17h07
  5. Réception sur le port série sous DOS avec Borland V3.0
    Par jackyjacky dans le forum Autres éditeurs
    Réponses: 24
    Dernier message: 19/03/2004, 23h18

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