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;
}
}
} |
Partager