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

avec Java Discussion :

Envoi d'une trame TCP


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut Envoi d'une trame TCP
    Bonjour,

    je suis sur un projet dans lequelle je dois communiquer avec un automate par le Modbus/tcp.

    Mais j'ai quelque soucis :

    - le premier le module ne respecte pas le modbus enfin pas dans ça totalité. je m'explique
    par exemple il est dit dans la norme qu'une requête en écriture d'une seul bobine doit être former ainsi :

    mon programme envoye bien
    seul soucis c'est que les developpeurs de l'automate eux on decider que c'était
    - le deuxième : utilisant j2mod comme librairie je cherche le moyen de "modifier" le contenu de ma requête pour qui colle avec la trame qui devrait fonctionner.

    - ou alors pourriez-vous m'aiguiller pour envoyer dans des sockets du hexadécimal.
    j'arrive à établir des connections par le biais du tcp mais j'arrive pas a envoyer mes commandes en hexadécimal.

    Pour astuce je peux pas dire aux développeurs de l'automate que c'est des authistes et leur refaire recoder pour qu'il respect vraiment le protocole

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu veux vraiment envoyer de l'hexadécimal (Chaine de caractère) ?
    Ou tu veux envoyer les valeurs correspondant à l’hexadécimal ?

    Parce que dans le deuxième cas tu as juste à envoyer de tableau d'unsigned byte via ton socket.

    Unsigned byte n'existe pas en java, il faut bidouiller en général : passer de -128=>127 à 0 (00) => 255 (FF)

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut
    dans ce cas là => par la création de socket.

    j'aimerais savoir comment envoyer une commande qui doit être en hexadécimal (et bien en hexa pas traduit en ascii ou autre) par le biais d'un socket tcp.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    2 caractères hexadécimaux => 1 octet

    Socket.getOutputStream().write(byte[])

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut
    ça donnerais donc un truc dans le genre là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    this._port = 502;
    this._socket = new Socket("192.168.255.1", this._port);
    byte[] commande = new byte[]{(byte)00,(byte)00,(byte)00,(byte)00,(byte)00,(byte)06,(byte)05,(byte)00,(byte)00,(byte)255,(byte)06};
    this._socket.getOutputStream().write(commande);
    2 caractères hexadécimaux => 1 octet

    un hex => 2 byte ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Alors :
    ==> Ça, ça n'existe pas, CF mon premier post sur le bidouillage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2 caractères hexadécimaux => 1 octet
    un hex => 2 byte ?
    HEIN ???

    00 => 0 => 1 octet => 1 byte à bidouiller
    06 => 6 => 1 octet => 1 byte à bidouiller
    FF => 255 => 1 octet => 1 byte à bidouiller

    Sinon au niveau de l'envoie ça devrait être bon. Avec un petit flush en prime.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut
    ok voici donc le code fini

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    this._port = 502;
    		this._socket = new Socket("192.168.255.1", this._port);
    		byte[] commande = new byte[]{(byte)1,(byte)2,(byte)0,(byte)0,(byte)0,(byte)6,(byte)5,(byte)0,(byte)0,(byte)255,(byte)6};
    		this._socket.getOutputStream().write(commande);
    		this._socket.getOutputStream().flush();
    voici ma trame

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0000  00 0d e0 64 44 f7 00 26  6c 86 89 50 08 00 45 00   ...dD..& l..P..E.
    0010  00 33 71 9b 40 00 80 06  09 d4 c0 a8 ff 02 c0 a8   .3q.@... ........
    0020  ff 01 17 a5 01 f6 e8 2e  06 41 01 84 5f 6e 50 18   ........ .A.._nP.
    0030  fa f0 b9 76 00 00 01 02  00 00 00 06 05 00 00 ff   ...v.... ........
    0040  06                                                 .
    voici la trame qui fonctionne réellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    0000  00 26 6c 86 89 50 00 0d  e0 64 44 f7 08 00 45 00   .&l..P.. .dD...E.
    0010  00 34 09 35 00 00 40 06  f2 39 c0 a8 ff 01 c0 a8   .4.5..@. .9......
    0020  ff 02 01 f6 1e fd 01 8d  2e 63 40 30 8e 47 50 18   ........ .c@0.GP.
    0030  16 d0 f9 2b 00 00 01 02  00 00 00 06 01 05 00 00   ...+.... ........
    0040  ff 06

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    byte c'est la traduction d'octet :-)


    Un petit coup de pouce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    byte b1 = (byte) (0xFF & 255);
    byte b2 = (byte) (0xFF & 6);
    System.out.println("B1 = " + b1);
    System.out.println("B2 = " + b2);
    System.out.println("B1 = " + Integer.toBinaryString(b1 & 0xFF) + "  ==  " + Integer.toBinaryString(0xFF));
    System.out.println("B2 = " + Integer.toBinaryString(b2 & 0xFF) + "  ==  " + Integer.toBinaryString(0x06));
    Affiche
    B1 = -1 // Normal java prend le byte comme -128 / 127
    B2 = 6
    B1 = 11111111 == 11111111 // Par contre l'encodage binaire correspond bien à FF
    B2 = 110 == 110

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut
    merci mais même (byte) 255 me donne bien ff dans la trame

    mais ça marche toujours pas l'interrupteur ne s'ouvre pas saleté de module.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il semble simplement que tu aie oublié un 1 dans ton code entre le 6 et le 5

    tu envoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    envoye  00 00 00 06 05 00 00 ff 06
    attendu 00 00 00 06 01 05 00 00 ff 06
    Sinon je confirme, byte(255) est tout à fait correct, au même titre que (byte)0xFF

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Oui effectivement, c'est dans le sens byte => int qu'il faut utiliser le masque pour récupérer la valeur non signée.
    J'ai dit quelques co***ries, ça arrive.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 62
    Points : 57
    Points
    57
    Par défaut
    alors tchize_ je te vénére tu es mon dieu

    un grand maxi merci a toi aussi mathieu (tu as assuré !). C'est fonctionnel ! problemo resoluto !

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par jchevalay54 Voir le message
    alors tchize_ je te vénére tu es mon dieu
    Hé! J'ai plein d'autres gens à servir, alors pas d'exclusive

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

Discussions similaires

  1. Envoi d'une trame ethernet
    Par Sékiltoyai dans le forum Réseau
    Réponses: 4
    Dernier message: 22/03/2009, 16h51
  2. [Réseau] Connexion et envoie d'une trame
    Par ivanoe25 dans le forum Langage
    Réponses: 10
    Dernier message: 29/09/2006, 00h04
  3. Problème avec l'envoi d'une trame TCP
    Par fredoBreton dans le forum API, COM et SDKs
    Réponses: 14
    Dernier message: 17/11/2005, 20h19
  4. [Réseau] Envoyer une trame tcp
    Par heid dans le forum Web & réseau
    Réponses: 5
    Dernier message: 18/07/2005, 13h07

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