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

Langage PHP Discussion :

Convertir type string en héxadécimal pour communication Modbus via port série


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Convertir type string en héxadécimal pour communication Modbus via port série
    Bonjour,

    J'ai un problème et peut être vous allez savoir y répondre, il est pas compliqué à exposer et à cerner mais il peut être compliqué à résoudre voir impossible (j'espère pas) si PHP ne le permet pas.

    C'est à propos d'un problème de communication avec le port série.
    J'appel une fonction (ci-joint) qui est censée écrire une température de chauffage dans un régulateur pour cela j'initialise mon port série avec la fonction fopen() jusqu'à la pas de problème l'initialisation du port avec ses caractéristiques fonctionne.

    `mode com2: BAUD=9600 PARITY=E data=8 stop=1 xon=off`;
    $fp = fopen ("COM2:", "w+");

    Ensuite je crée une variable qui contient ma trame de données à envoyer
    (trame modbus que je dois envoyer en caractères héxadécimaux). Dans l'exemple je veux écrire une valeur de consigne de 123°C. Après je pourrais toujours m'arranger pour que la valeur à envoyer soit une variable issu de la base de données.

    $e = chr(27);
    //DEMANDE D'ECRITURE
    $string = $e . "00"; //adresse de l'esclave (ici ecriture en broadcast)
    $string .= $e . "06"; //fonction ecriture ou lecture
    $string .= $e . "0C"; //debut adresse code table
    $string .= $e . "6C"; //fin adresse code table
    $string .= $e . "00"; //valeur
    $string .= $e . "7B"; //valeur
    $string .= $e . "0B"; //CRC byte 1
    $string .= $e . "75"; //CRC byte 2


    Pour être sûr de ma trame à envoyer est correcte j'ai installé un logiciel qui me permet de simuler l'envoie de trame
    qui s'appelle Multiway. Lorsque j'envoie 00060C6C007B0B75 à partir de ce logiciel la valeur de consigne (123°C) est écrite et afficher sur le régulateur. J'en conclue que la structure de ma trame est correcte.
    Enfin je viens envoyer les données à l'aide de l'instruction "fputs" ou "fwrite" (j'ai essayé les deux).
    J'utilise ces instructions car je viens écrire sur le port série comme si on vient écrire dans un fichier.

    fputs ($fp, $string );

    Quand je test rien ne se passe : ni écriture de la valeur, ni génération d'erreur.
    J'ai donc installé un logiciel qui me permet analyser les données lues et écrites sur le port série qui s'appel
    free serial port monitor et j'ai regarder ce que j'envoyais précisement d'une part avec le logiciel Multiway avec lequel l'écriture de valeur fonctionne et d'autre part avec mon code que j'ai écris.
    Evidemment les données envoyées ne sont pas interprétées de la même manière :
    - avec Multiway les données envoyées (voir image jointe) sont interprétées dans le même format donc l'écriture de la valeur fonctionne (je lui envoie des codes héxadécimal donc le régulateur comprend)
    - avec mon interface (voir image jointe) les données envoyées (de la variable string) sont interprétées octet par octet et converties en ASCII (c'est mon avis mais je pense qu'il est juste) donc évidemment ça ne fonctionne pas.

    Je me suis donc intéressé aux instructions fwrite et fputs et dans la documentation PHP ci-jointe et j'ai remarqué que ces instructions envoient une variable en paramètre de type string (chaîne de caractère).
    Je crois que le problème vient d'ici, le fait d'envoyer une chaîne de caractère même constituée de caractères héxadécimaux provoque une mauvaise interprétation des données qui sont par la suite converti en ASCII.

    Alors pourquoi avec Multiway ça fonctionne et pas avec mon code je ne sais pas, j'ai planché 3 jours la semaine dernière en essayant de trouver une autre instruction autre que fputs ou fwrite sans succès. J'ai également essayé toutes sortes de conversions au niveau de ma variable sans succès non plus : toujours le même problème quel que soit les données envoyées
    elles ne sont pas traiter comme avec le logiciel Multiway mais comme décris précédemment.

    J'ai entendu parler d'expressions régulières je ne sais pas si cela pourrais m'aider à débloquer la situation.
    Peut être connaissez vous un moyen quelconque
    de résoudre le problème ou peut être vous capable de me dire que ce n'ai pas possible en PHP et dans ce cas
    je serais bien embêté il me faudrais un autre langage qui me permette de s'intégrer au PHP et qui me permette de
    communiquer plus facilement avec le port série. Je ne sais pas si en intégrant du langage C c'est possible ou avec un applet java?

    Voilà j'espère avoir été clair dans mon explication et si vous pouviez m'envoyer quelques éléments de réponses
    ça me permettrai d'avancer et peut être de finir mon projet car je n'ai plus que ce problème de communication à résoudre
    pour pouvoir finaliser le projet.

    Merci d'avance.

    K1rou.
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    essaie en constituant la chaîne à écrire de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = chr(0x00);
    $string .= chr(0x06);
    $string .= chr(0x0c);

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse Eusebe je vais essayer de la façon que tu me proposes
    et je te tiens au courant pour la réponse.

    En tout cas j'ai trouvé une instruction avec laquelle ça fonctionne :

    string pack ( string $format [, mixed $args [, mixed $... ]] )

    Mon code donne ceci :

    $trame = pack ( "hhcchccc" , 0x00, 0x06, 0x0C, 0x6C, 0x00, 0x7B, 0x0B, 0x75 );
    fputs ($fp, $trame );

    et ça fonctionne j'arrive à écrire et à afficher la valeur 123 (0x007B) sur le régulateur.

    Le fait de remplacer une valeur par une variable fonctionne aussi :
    $trame = pack ( "hhcchccc" , 0x00, 0x06, 0x0C, 0x6C, 0x00, $variable, 0x0B, 0x75 );

    Il me reste plus qu'à effectuer le traitement nécessaire sur ma valeur à envoyer c'est à dire la convertir et "séparer en deux" mon résultat.

    En tout cas je teste le code Eusebe et je poste une réponse demain
    sur la validité de la réponse.

    Merci encore à Eusebe.

Discussions similaires

  1. Convertir un String en Class pour Intent
    Par anto2b dans le forum Android
    Réponses: 1
    Dernier message: 13/06/2012, 15h39
  2. Code VBA pour communication avec un port série dans EXCEL
    Par Fbroom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2008, 10h14
  3. Communication : page HTML/port série
    Par dvedve dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/04/2007, 11h09
  4. comment convertir type string to Hkey ? :(
    Par xenoali dans le forum Delphi
    Réponses: 2
    Dernier message: 17/10/2006, 14h16
  5. Quel langage choisir pour lire sur le port série ?
    Par Nico76 dans le forum Windows
    Réponses: 7
    Dernier message: 28/04/2004, 10h42

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