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

C++Builder Discussion :

Open Modbus Code 16


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut Open Modbus Code 16
    Bonjours, jai un créer une interface qui permet de lire des mots dans un automate TSX, et sa fonctionne tres bien

    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
    bool LireMotsModbus(unsigned short *cTabValeur, int iPremier, int iNombre, int iIndex)
    {
      unsigned char ucRequete[12]={00,00,00,00,00,06,00,03,00,00,00,01};
      unsigned char Buffer[400];
      int j=0;
      unsigned char usTmp = (unsigned char) iNombre;
           ucRequete[11]=usTmp;
           ucRequete[8]=SeparateFort(iPremier);
           ucRequete[9]=SeparateFaible(iPremier);
     
            Form1->ClientSocketModbus->Socket->SendBuf(ucRequete,12);
     
            Buffer[7]=0;
            Buffer[8]=0;
            do
            {
                    Form1->ClientSocketModbus->Socket->ReceiveBuf(Buffer,400);
                    j++;
            }
            while((Buffer[7]!='\x03')&&(Buffer[8]!=(2*iNombre))&&(j<1000000));
     
            if(j==1000000)
                    Form1->Memo1->Lines->Add( "Premier " + IntToStr(iPremier) + " Nombre " + IntToStr(iNombre) + " attente " + IntToStr(j));
     
            ExtraireValeurTrame(Buffer, cTabValeur, iPremier,iNombre,iIndex);
            return true; 
    }
    mon probleme est que maintenant je voudrais ecrire plusieur mot avec le code 16
    voila mon 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
    void EcrireMotsModbus(unsigned short *usTab, int iPremier, int iNbr, int iIndex)
    {
      unsigned char *BufferEnvoie, BufferW[20];
      unsigned char usTmp = (unsigned char)iNbr;
      unsigned char usTmp2 = (unsigned char)(iNbr*2);
      int j=0, iCpt=0;
     
            BufferEnvoie = new unsigned char [(iNbr*2)+13];
            BufferEnvoie[0]=00;
            BufferEnvoie[1]=00;
            BufferEnvoie[2]=00;
            BufferEnvoie[3]=00;
            BufferEnvoie[4]=00;
            BufferEnvoie[5]=06;
            BufferEnvoie[6]=00;
            BufferEnvoie[7]=16;
            BufferEnvoie[8]=SeparateFort(iPremier);
            BufferEnvoie[9]=SeparateFaible(iPremier);
            BufferEnvoie[10]=00;
            BufferEnvoie[11]=usTmp;
            BufferEnvoie[12]=usTmp2;
     
            for(int i=13; i<((iNbr*2)+13);i=i+2)
            {
                    BufferEnvoie[i]=SeparateFort(usTab[iCpt+iIndex]);
                    BufferEnvoie[i+1]=SeparateFort(usTab[iCpt+iIndex]);
                    iCpt++;
            }
            //Envoie de la requete d'ecriture
            BufferW[7]=0;
            BufferW[8]=0;
            Form1->ClientSocketModbus->Socket->SendBuf(BufferEnvoie,(iNbr*2)+13);
            do
            {
                    Form1->ClientSocketModbus->Socket->ReceiveBuf(BufferW,20);
                    j++;
            }
            while((BufferW[7]!=16)&&(BufferW[8]!='\x90')&&(j<1000000));
    }
    mais bon l'automate ne repond jamais et la com plante meme parfois
    jai essyer pas mal de chose mais rien n'y fais
    quelqu'un pourais maider ?

    cordialement baxter

  2. #2
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    pour info voila la l'aide sur la trame

    5.1.2 Write multiple registers (FC 16)

    Request

    Byte 0: FC = 10 (hex)
    Byte 1-2: Reference number
    Byte 3-4: Word count (1-100)
    Byte 5: Byte count (B=2 x word count)
    Byte 6-(B+5): Register values

    Response

    Byte 0: FC = 10 (hex)
    Byte 1-2: Reference number
    Byte 3-4: Word count
    il faut savoir que le byte 0 correspond a la case 7 du tableau requete

  3. #3
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    c'est bon jai trouvé mon erreur

    pour info l'erreur etais dans la case 5 du buffer de requete

    ce champ dans le protocole modbus contient le nombre de case ki suive

    et je laisais 6 dedans comme pour la requete de lecture (qui a toujours la meme taille) donc jai tous simplement fais sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BufferEnvoie[5]=(unsigned char)2*iNbr+7;

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    Par défaut
    Bonjour,

    Pour ton cas tu as créé ta librairie Modbus en C++ ? ou tu en avais déjà une ?

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 14/03/2011, 13h49
  2. Ryzom passe en Open Source (code + assets)
    Par ac_wingless dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 26/05/2010, 14h29
  3. [code] Publipostage de Word vers Open Office
    Par titiyo dans le forum API, COM et SDKs
    Réponses: 36
    Dernier message: 12/05/2009, 15h20
  4. Open Studio : Code source
    Par nounowa dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 31/03/2008, 18h04
  5. [code] Erreur d'ouverture de Open Office
    Par titiyo dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 04/10/2007, 14h12

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