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 :

Conversion hexa en décimal PHP MODBUS


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Conversion hexa en décimal PHP MODBUS
    Bonjour,
    J'utilise PHPMODBUS pour récupérer des données sur un automate.
    J'ai paramétré mes fichiers fc3.php et modbusmaster.php. La requête est envoyée et une réponse est donnée par l'automate.
    Jusque là tout va bien.

    Mon paquet de réponse retourné est: 2a190000000764030403b60001
    Les informations qui m'intéresse sont: 03b6 00 01
    Sauf que le script me sort: 03 b6 00 01. Ce qui ne donne pas la même chose: 3b6=950 et b6=182. la valeur juste est 03b6
    A priori, ca me semblait assez simple à résoudre...mais non; je voulais associer 03 et b6 pour avoir ma valeur exacte.
    Le problème pourrait venir de ce morceau de 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
    private function readMultipleRegistersPacketBuilder($unitId, $reference, $quantity){
        $dataLen = 0;
        // build data section
        $buffer1 = "";
        // build body
        $buffer2 = "";
        $buffer2 .= iecType::iecBYTE(3);             // FC 3 = 3(0x03)
        // build body - read section    
        $buffer2 .= iecType::iecINT($reference);  // refnumber = 12288      
        $buffer2 .= iecType::iecINT($quantity);       // quantity
        $dataLen += 5;
        // build header
        $buffer3 = '';
        $buffer3 .= iecType::iecINT(rand(0,65000));   // transaction ID
        $buffer3 .= iecType::iecINT(0);               // protocol ID
        $buffer3 .= iecType::iecINT($dataLen + 1);    // lenght
        $buffer3 .= iecType::iecBYTE($unitId);        //unit ID
        // return packet string
        return $buffer3. $buffer2. $buffer1;
      }
     
      /**
       * readMultipleRegistersParser
       *
       * FC 3 response parser
       *
       * @param string $packet
       * @return array
       */
      private function readMultipleRegistersParser($packet){    
        $data = array();
        // check Response code
        $this->responseCode($packet);
        // get data
        for($i=0;$i<ord($packet[8]);$i++){
          $data[$i] = ord($packet[9+$i]);
        }    
        return $data;
      }
    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
     /**
         * iecBYTE
         *
         * Converts a value to IEC-1131 BYTE data type
         *
         * @param value value from 0 to 255
         * @return value IEC BYTE data type
         *
         */
        public static function iecBYTE($value) {
            return chr($value & 0xFF);
        }
     
        /**
         * iecINT
         *
         * Converts a value to IEC-1131 INT data type
         *
         * @param value value to be converted
         * @return value IEC-1131 INT data type
         *
         */
        public static function iecINT($value) {
            return self::iecBYTE(($value >> 8) & 0x00FF) .
                    self::iecBYTE(($value & 0x00FF));
    J'ai essayé de changer des valeurs mais rien n'y fait.

    Si vous avez une idée, je suis preneur.

    Merci

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Visiblement tu as quelque chose quelque part qui découpe ta chaîne en paquet de 2 caractères. Probablement $this->responseCode dans le code de readMultipleRegistersParser, étant donné qu'on extrait ensuite les paquets à partir de 9, ce qui correspond à ton 03 b6 ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private function readMultipleRegistersParser($packet){    
        $data = array();
        // check Response code
        $this->responseCode($packet);
        // get data
        for($i=0;$i<ord($packet[8]);$i++){
          $data[$i] = ord($packet[9+$i]);
        }    
        return $data;
      }

    Peut-on voir la fonction responseCode ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    c'est résolu

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

Discussions similaires

  1. Convertion Hexa en IP
    Par onjaranaivo dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 19/07/2010, 17h56
  2. Conversion Hexa => binaire => décimal
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 6
    Dernier message: 10/04/2010, 13h53
  3. [PIC 16F877] Hexa vers décimal
    Par TheFullMetal dans le forum C
    Réponses: 1
    Dernier message: 17/01/2009, 19h57
  4. Convertion hexa binaire
    Par darkman13130 dans le forum C++Builder
    Réponses: 11
    Dernier message: 11/09/2008, 16h15
  5. Convertion Hexa to déci en C
    Par duranton dans le forum C
    Réponses: 3
    Dernier message: 27/10/2005, 19h42

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