Bonjour,
Dans le cadre de notre projet de BTS snir nous cherchons à développer une application qui consiste à lire les données de l'automate pour ensuite les stocker dans une base de données, le problème étant que la communication s'est bien effectuer plusieurs fois mais qu'après un certains moment la communication s'interrompt et l'application ne fonctionne plus et nous affiche le message suivant "Une connexion établie a été abandonnée par un logiciel de votre ordinateur hôte.
Nous cherchons à comprendre si le problème provient de l'automate ou de l'application et comment le résoudre.

Merci de vos réponses!


Classe qui permet la récupération des données:
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
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
namespace Solaire
{

    class RecupDonnees
    {
         //Attributs
        private const int TailleTableau = 2048;//crée une variable constante entier pour la taille des tableaux
        private Socket MonSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//création du socket;//déclare une variable socket en attribut appartenant à la classe FormPrincipale 
        private string IPserv = "192.168.1.159" ;//adresse IP du Serveur
        private int Port = 502;//N° port
        private byte[] TableauRequete = null; // déclare une variable de type tableau d'octet 
        public bool test_connect = false;


        public float[] RecupDonnees2()
        {
            byte AdresseEsclave = 9;
            byte fonction = 3;
            ushort id = 0;
            ushort[] Registre = { 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111}; // Tableau qui contient les registres
            uint NbOctet = 1;
            float[] DonneeCapteur = new float[12];
            string[] DonneeCapteurHexa = new string[12];

            MonSocket.Connect(new IPEndPoint(IPAddress.Parse(IPserv), Port)); // connexion au serveur de l'automate 
            for (int i = 0; i < 11; i++) // boucle pour lire
            {
                byte[] requete = LireLaChaine(AdresseEsclave, fonction, id, Registre[i], NbOctet); // Crée un tableau de byte qui contient la requête 
                //textBoxMessageEnvoyer.Text = ConvTableauChaine(requete);// montre la requête dans le champ texte pour se faire on la converti en string
                EnvoyerRequete(requete);//envoie la requete 
                Thread.Sleep(100);
                byte[] TableauDonneRecu = Lire();// réception du message sur le réseau
                Thread.Sleep(100);

                //récupération des données 
                int TailleDonnee = TableauDonneRecu[8];// va récupérer dans la trame la taille des données 

                if (fonction != TableauDonneRecu[7]) // test des erreur on vérifie si le code de la fonction et le même que celui dans la trame envoyer(ici on vérifie la fonction de lecture 03)
                {
                    MessageBox.Show("Erreur tableau reçu");
                }
                else
                {
                    
                    byte[] TableauTrameRecu = new byte[9 + TailleDonnee]; // Crée le tableau pour la trame reçu
                    Array.Copy(TableauDonneRecu, 0, TableauTrameRecu, 0, TableauTrameRecu.Length);// copi le tableau des données reçu dans le tableau de la trame recu
                    //textBoxMessageRecu.Text = ConvTableauChaine(TableauTrameRecu);// affiche la tram recu
                    byte[] Donnee = new byte[TailleDonnee]; // cré un tableau uniquement qui contient les valeur des capteurs                   
                    Array.Copy(TableauDonneRecu, 9, Donnee, 0, Donnee.Length);// copi les donées recu dans le tableau Donnee
                    DonneeCapteur[i] = ConvTableauByteInt(Donnee);// convertit les donées de tableau de byte en int et les stockes dans tableau
                    Thread.Sleep(100);
                }
            }
            MonSocket.Shutdown(SocketShutdown.Both);// vider le buffer et déconnecter le canal 
            MonSocket.Close();// ferme le socket

            for (int i = 0; i < 11; i++)// boucle pour afficher
            {

                switch (Registre[i])// switch pour transformée la donnée recu en donnée exploitable selon le registre(donc la donée dans le bon USI)o
                {
                   
                    //Pluvio
                    case 101:
                        //textBoxHexPluvio.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i];
                        //textBoxPluvio.Text = DonneeCapteur[i].ToString();
                        break;
                    //Anemo
                    case 102:
                        //textBoxHexAnemo.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 30;
                        //textBoxAnemo.Text = DonneeCapteur[i].ToString();
                        break;
                    //Pyrano
                    case 103:
                        //textBoxHexPyrano.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 10;
                        //textBoxPyrano.Text = DonneeCapteur[i].ToString();
                        break;
                    //Hygro
                    case 104:
                        //textBoxHexHygro.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 100;
                        //textBoxHygro.Text = DonneeCapteur[i].ToString();
                        break;
                    //Température
                    case 105:
                        //textBoxHexTemp.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 100; //converti la température en °C
                        //textBoxTemp.Text = DonneeCapteur[i].ToString();// Affiche la température (avec une convertion d'un entier en chaîne de caractére)
                        break;
                    //Tension Paneau
                    case 106:
                        //textBoxHexUPaneau.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 1000;
                        //textBoxUPaneau.Text = DonneeCapteur[i].ToString();
                        break;
                    // Intensité Paneau
                    case 107:
                        //textBoxHexIPaneau.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 1000;
                        //textBoxIPaneau.Text = DonneeCapteur[i].ToString();
                        break;
                    //Tension Batterie
                    case 108:
                        //textBoxHexUBat.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 1000;
                        //textBoxUBat.Text = DonneeCapteur[i].ToString();
                        break;
                    //Intensité Batterie
                    case 109:
                        //textBoxHexIBat.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 1000;
                        //textBoxIBat.Text = DonneeCapteur[i].ToString();
                        break;
                    //Température Paneau
                    case 110:
                        //textBoxHexTempPaneau.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 100;
                        //textBoxTempPaneau.Text = DonneeCapteur[i].ToString();
                        break;
                    //Puissance
                    case 111:
                        //textBoxHexPuissance.Text = DonneeCapteurHexa[i];
                        DonneeCapteur[i] = DonneeCapteur[i] / 100;
                        //textBoxPuissance.Text = DonneeCapteur[i].ToString();
                        break;

                }
            }
            return DonneeCapteur;
        }

        //**************************************************************************************************************
        private byte[] LireLaChaine(byte AdresseEsclave, byte fonction, ushort id, ushort Registre, uint NbOctet) // FONCTION QUI PERMET DE REMPLIR LE TABLEAU DE LA REQUETE 
        {
            byte[] octet = new byte[12];
            octet[0] = (byte)(id >> 8);// on garde les 8 bits de poids fort //identificateur de transaction ici a 0 avec le decalage 
            octet[1] = (byte)(id & 255);//on garde le 8 bits de poids faible // identificateur de transaction ici a 0 avec le decalage 
            octet[2] = 0;// idendificateur de protocole égale a 0 (poid fort)
            octet[3] = 0;// idendificateur de protocole égale a 0 (poid faible)
            octet[4] = 0;//longueur (poid fort) à 0 si longueur < 256 
            octet[5] = 6; // longueur (poid faible) 
            octet[6] = AdresseEsclave; // addresse de l'esclave
            octet[7] = fonction; // N° fonction de lecture 
            octet[8] = (byte)(Registre >> 8); // Adresse (poid fort)
            octet[9] = (byte)(Registre & 255); // Adresse(poid faible) 
            octet[10] = (byte)(NbOctet >> 8); //nombre d'octet (poid fort)
            octet[11] = (byte)(NbOctet & 255);//nombre d'octet (poid faible)
            return octet;
        }
        //******************************************~~Conversion~~********************************************************************

        private int ConvTableauByteInt(byte[] Donnee)
        {
            int DonneeInt = (short)(Donnee[0] << 8) + Donnee[1];
            return DonneeInt;
        }
        //************************************~~EnvoieRequete~~**************************************************************************
        public int EnvoyerRequete(byte[] requete)
        {

            try
            {
                TableauRequete = new byte[TailleTableau];
                MonSocket.Send(requete, requete.Length, SocketFlags.None);
               // Thread.Sleep(100);
               
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return 0;
        }

        //*************************************~~Lecture~~**********************************************************
        public byte[] Lire()
        {
            NetworkStream ns = new NetworkStream(MonSocket);// ouvre un canal pour lire les données
            if (ns.CanRead)
            {
                try
                {
                    int TrameRecu = MonSocket.Receive(TableauRequete, TableauRequete.Length, SocketFlags.None);
                    Thread.Sleep(100);
                }
                catch (SocketException se)
                {
                    MessageBox.Show(se.Message);
                }

            }
            return TableauRequete;
        }
    }
}