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

Réseau Discussion :

ModBus : envoi et réception de trame


Sujet :

Réseau

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut ModBus : envoi et réception de trame
    Bonjour à tous,

    J'effectue dans le cadre de mon BTS un projet portant sur ModBus.

    Le but est de codé un module de communication avec un Automate de type Twido de la marque Télémécanique, J'utilise le protocole ModBus TCP afin de dialoguer entre mon PC(sous Windows XP) et l'automate. Le Twido est relié à une panoplie de capteurs il effectue des relevés seul et constamment, mon but est d'interrogé l'automate afin de récupérer les résultats, ou changé l'état d'un registre.

    Mon problème est le suivant :
    J'arrive à envoyer une trame à l'automate, j'utilise un analyseur de réseaux afin de le vérifier. Cependant je ne réussi pas à réceptionné les trames de l'automate.
    J'ai testé plusieurs solution, et cherché un bon moment, mais je n'y arrive pas.

    Le principe de mon programme est simple :
    - on a une petite fenêtre permettant la connexion à l'automate par TCP
    - on rempli des champs permettant de choisir les paramètres de la trame désiré
    - puis un bouton d'envoi.
    - après l'envoi de la trame un slot recherche une réponse de l'automate
    - lorsqu'une réponse est trouvé on la stock dans une variable
    - et enfin on traite la réponse.

    Voici quelque partis de code portant sur l'envoi et la réception.

    Code du fichier source : 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #include "modbus.h"
    #include "ui_modbus.h"
     
    // CONSTRUCTEUR DU MODBUS
    ModBus::ModBus(QWidget *parent)
        : QMainWindow(parent), ui(new Ui::ModBus)
    {
        ui->setupUi(this);
     
        header[0]=00; // Reset des identifiant de transaction.
        header[1]=01;
     
        ModBus::connect(&Socket,SIGNAL(readyRead()),this,SLOT(recept())); // Detecte les réponses de l'automate
    }
     
    // FONCTION DE CONSTRUCTION DE LA TRAME MODBUS
    void ModBus::constTrame()
    {
     
        header[2]=00; // Protocol ModBus.
        header[3]=00;
     
        header[4]=00; // Longueur de trame de requête.
        header[5]=06;
     
        pdu[0]=01; // Identifiant de l'esclave, vu qu'il n'y a que 1 esclave : egale à 1.
        switch(ui->Cb_fonction->currentIndex())
        {
            case 0:{pdu[1]=01;} // Fonction lecture coil
                break;
            case 1:{pdu[1]=03;} // Fonction lecture registre
                break;
            case 2:{pdu[1]=05;} // Fonction ecriture coil
                break;
            case 3:{pdu[1]=06;} // Fonction ecriture registre
                break;
            default :{qDebug()<<"Mauvaise fonction choisis"<<endl;}
                break;
        }
     
        // Adresse
        pdu[2]=ui->Sb_adress->value()>>8;
        pdu[3]=ui->Sb_adress->value()&0x00ff;
     
        // Donnee
        pdu[4]=ui->Sb_data->value()>>8;
        pdu[5]=ui->Sb_data->value()&0x00ff;
     
    }
     
     
    // SLOT D'ENVOI DE LA TRAME
    void ModBus::on_Bt_Send_clicked()
    {
        QDataStream out(&Socket);
     
        constTrame();
     
        qDebug()<<"Envoie d'une trame ModBus"<<endl;
        qDebug()<<"    - envoi de l'header"<<endl; // Ecriture dans le debug
        for(int i=0;i<6;i++){
            out<<header[i]; // Envoi de la trame
        }
     
        qDebug()<<"    - envoi du pdu"<<endl; // Ecriture dans le debug
        for(int i=0;i<6;i++){
            out<<pdu[i]; // Envoi de la trame
        }
     
        // Incrémentation de l'ID de transaction
        if(header[1]<255)
            {
            header[1]++;
        }
        else
        {
            if(header[0]<255)
            {
                header[0]++;
            }
            else
            {
                header[0]=00;
                header[1]=00;
            }
        }
    }
     
    void ModBus::recept()
    {
        QDataStream in(&Socket);
     
        qDebug()<<"Nouvelle reponse :\n    - recherche des donnees"<<endl;
        quint8 rec;
        in>>rcvTrame;
        bool *ok;
        if(rcvTrame!="")
        {
     
            for(int i=0;i<6;i++)
            {
                //header[i]=rcvTrame.toUInt(*ok,10);
            }
        qDebug()<<"    - copie de l'header"<<endl;
            for(int i=6;i<rcvTrame.size();i++)
            {
                pdu[i]=rcvTrame[i];
            }
        qDebug()<<"    - copie du pdu"<<endl;
        qDebug()<<"    - fin de reponse"<<endl;
        }else{
            qDebug()<<"erreur : réponse vide"<<endl;;
        }
    }
    Code du fichier entête : 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
    40
    41
    42
    43
    44
    #ifndef MODBUS_H
    #define MODBUS_H
     
    #include <QtGui/QMainWindow>// Utiliser pour défnir la fenêtre
    #include <QTcpSocket>       // Utilisation des socket TCP
    #include <QDataStream>      // Utilisation des data stream pour envoyer les data et en recevoir
    #include <QString>          // Utilisation des chaines de caractère version Qt
    #include <QBitArray>        // Utilisation des tableaux d'octects.
    #include <QDebug>           // Utilisation d'une console de debugage
     
    namespace Ui
    {
        class ModBus;
    }
     
    class ModBus : public QMainWindow
    {
        Q_OBJECT
     
    public:
        ModBus(QWidget *parent = 0);
        ~ModBus();
     
    private:
        Ui::ModBus *ui;
     
        QTcpSocket Socket; // socket TCP utiliser pour la connection
     
        quint8 header[6]; // Contient l'header TCP utiliser pour la trame ModBus
        quint8 pdu[6]; // Contient les information de la trame ModBus
        quint8 headerR[]; // Contient l'header TCP de réponse de l'automate
        quint8 pduR[];// Contient les information de réponse de la trame ModBus, sa longueur peut varier
        QByteArray rcvTrame;
     
        // Lié à l'interface
     
     
    private slots:
        void on_Bt_Send_clicked(); // Slot du bouton d'envoie de trame
        void constTrame(); // Fonction de construction de la trame
        void recept(); // Fonction de reception des données envoyer par l'automate
    };
     
    #endif // MODBUS_H

    J'ai essayer le QDataStream / QTextStream / QBitArray / QByteArray / QString cependant cela n'a rien données, il est possible que je les ai mal utilisé. Je cherche des piste pour savoir comment réceptionné ses trames ou alors des exemples.

    Cordialement,
    Mayojiko

  2. #2
    Membre confirmé

    Inscrit en
    Décembre 2009
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 164
    Points : 490
    Points
    490
    Par défaut
    Salut,

    QDataStream suffit pour lire tes données.
    Par contre, est ce que tu connais la taille des données que tu vas recevoir ?
    Si tu as des données de grande taille, ton slot recept() va être exécuté plusieurs fois.
    Si tu connais le format de la réponse de ton automate, il faut attendre que les donnée soient complètes pour les lire de ton QDataSrteam.
    Tu peut le savoir avec socket.bytesAvailable().

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Modbus dans Qt
    Salut,
    Dans le cadre de mon projet de fin d'études, je suis entrain de faire quelque chose similaire à votre projet.
    Si j'ai bien compris vous avez réussi à compiler votre code sous Windows.
    Pouvez vous s'il vous plait me décrire les étapes d'installation de la librairie libmobus et comment vous l'avez utilisé sous Qt.
    Merci d'avance

Discussions similaires

  1. Envois et réception d'une trame par USB.
    Par samirraoui dans le forum Développement
    Réponses: 4
    Dernier message: 30/04/2015, 14h47
  2. Envoi et réception de données : Communication Temps Réel
    Par mehdi_862000 dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 26/05/2008, 14h14
  3. [Modbus][Ethernet][TSX 5103] Exemple Trames et doc
    Par franck.automaticien dans le forum Automation
    Réponses: 1
    Dernier message: 27/02/2008, 00h06
  4. tutoriel de l'envoi et réception des emails
    Par ouadie99 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 01/12/2006, 23h48
  5. Réponses: 8
    Dernier message: 20/03/2006, 14h01

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