Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Digression sur le code UxIx3 et les reboot / ENFIN PLUS DE PLANTAGE
#3
(16-08-2024, 09:18 PM)PhDV61 a écrit : Bien, je viens de modifier le code à nouveau pour venir tester la quantité de data reçue (avec timeout d'une seconde) et m'assurer que le message a été entièrement reçu avant d'en faire la lecture. Je teste toutes les 150ms (temps de transmission), mais on pourrait le faire plus rapidement. La lecture effective est ultra rapide car le message est arrivé et "bufferisé". C'est donc une affaire que quelque centaines de micro-secondes.

Et devinez quoi ?
Même avec mes trois ESP clients avec une page web données brutes, ET mon serveur avec une page web données brutes ne créent aucune erreur pour ce que j'ai pu constater. C'est un IMMENSE progrès. Cela veut bien dire qu'il y a des interactions entre la fonction "lecture" du core zéro et les fonctions WIFI.

Voilà le code à modifier :

code principal :

Partie "init" :
...
//Port Série si besoin
  if (pSerial > 0) {
    RXD2 = RXD2_2;
    TXD2 = TXD2_2;
    if (pSerial == 1) {
      RXD2 = RXD2_1;
      TXD2 = TXD2_1;
    }
    if (Source == "UxIx2") {
      Setup_UxIx2();
    }
    if (Source == "UxIx3") {
      Setup_JSY333();
    }
...

Partie "boucle principale"

...
//Recupération des données RMS
    //******************************
    if (tps - LastRMS_Millis > PeriodeProgMillis) {  //Attention delicat pour eviter pb overflow
      LastRMS_Millis = tps;
      unsigned long ralenti = long(PuissanceS_M / 10);  // On peut ralentir échange sur Wifi si grosse puissance en cours

      if (Source == "UxI") {
        LectureUxI();
        PeriodeProgMillis = 40;
      }
      if (pSerial > 0) {
        if (Source == "UxIx2") {
          LectureUxIx2();
          PeriodeProgMillis = 400;
        }
        if (Source == "UxIx3") {
          if (Message_recu() )
          {
            Lecture_JSY333();
            Request_data_JSY333();
          }
            PeriodeProgMillis = 150;
        }
...


code UxIx3 entier :

// *************************************************
// * Client lecture JSY-MK-333 * Triphasé          *
// * Développement initial de Pierre F (Mars 2024) *
// * update PhDV61 Juin 2024 et Août 2024          *
// *************************************************

long timeout_lecture = 0;

void Setup_JSY333() {
  MySerial.setRxBufferSize(SER_BUF_SIZE);
  MySerial.begin(9600, SERIAL_8N1, RXD2, TXD2);  //PORT DE CONNEXION AVEC LE CAPTEUR JSY-MK-333
  delay(10);
  Request_data_JSY333();
}

void Request_data_JSY333() {
int i;
  byte msg_send[] = { 0x01, 0x03, 0x01, 0x00, 0x00, 0x44, 0x44, 0x05 };
  for (i = 0; i < 8; i++) {
    MySerial.write(msg_send[i]);
  }
  timeout_lecture = millis()+1000; // pas plus de 1s max pour obtenir les données dans le buffer de réception


bool Message_recu() {
if ( MySerial.available() == 141)      // les données sont là  !
  return true;                 
else if ( millis() > timeout_lecture )  // il y a eu un problème!
  { MySerial.flush();
    StockMessage("timeout lecture module JSY-MK-333 - nb de données reçues : " + String(MySerial.available()) );
    Request_data_JSY333();
    return false;
  }
return false; 
}

void Lecture_JSY333() {
  float Tension_M1, Tension_M2, Tension_M3;
  float Intensite_M1, Intensite_M2, Intensite_M3;
  float PVA_M_inst1, PVA_M_inst2, PVA_M_inst3;
  float PW_inst1, PW_inst2, PW_inst3;

  byte Lecture333[200];
  bool injection;
  bool sens1, sens2, sens3;
  long delta_temps = 0;

  int a = 0;
  while (MySerial.available()) {
    Lecture333[a] = MySerial.read();
    a++;
  }

  if (a == 141) {                                              // message reçu complet
    delta_temps = (unsigned long)(millis() - Temps_precedent);  // temps écoulé depuis le dernier appel
    Temps_precedent = millis();                                // on conserve la valeur du temps actuel pour le calcul précédent

    Tension_M1 =  ((float)(Lecture333[ 3] * 256 + Lecture333[ 4])) / 100;
    Tension_M2 =  ((float)(Lecture333[ 5] * 256 + Lecture333[ 6])) / 100;
    Tension_M3 =  ((float)(Lecture333[ 7] * 256 + Lecture333[ 8])) / 100;
    Intensite_M1 = ((float)(Lecture333[ 9] * 256 + Lecture333[10])) / 100;
    Intensite_M2 = ((float)(Lecture333[11] * 256 + Lecture333[12])) / 100;
    Intensite_M3 = ((float)(Lecture333[13] * 256 + Lecture333[14])) / 100;

    sens1 = (Lecture333[104])      & 0x01;
    sens2 = (Lecture333[104] >> 1) & 0x01;
    sens3 = (Lecture333[104] >> 2) & 0x01;

    if (sens1) { Intensite_M1 *= -1; }
    if (sens2) { Intensite_M2 *= -1; }
    if (sens3) { Intensite_M3 *= -1; }

    injection = (Lecture333[104] >> 3) & 0x01;  //si sens est true, injection

    // Lecture des Puissances actives de chacune des phases
    PW_inst1 = (float)(Lecture333[15] * 256.0) + (float)Lecture333[16];
    PW_inst2 = (float)(Lecture333[17] * 256.0) + (float)Lecture333[18];
    PW_inst3 = (float)(Lecture333[19] * 256.0) + (float)Lecture333[20];

    //Lecture des puissances apparentes de chacune des phases, qu'on signe comme le Linky
    PVA_M_inst1 = (float)(Lecture333[35] * 256) + (float)Lecture333[36];
    if (sens1) { PVA_M_inst1 = -PVA_M_inst1; }
    PVA_M_inst2 = (float)(Lecture333[37] * 256) + (float)Lecture333[38];
    if (sens2) { PVA_M_inst2 = -PVA_M_inst2; }
    PVA_M_inst3 = (float)(Lecture333[39] * 256) + (float)Lecture333[40];
    if (sens3) { PVA_M_inst3 = -PVA_M_inst3; }

    if (injection) {
      PuissanceS_M_inst = 0;
      PuissanceI_M_inst = ((float)((float)(Lecture333[21] * 16777216) + (float)(Lecture333[22] * 65536) + (float)(Lecture333[23] * 256) + (float)Lecture333[24]));
      PVAS_M_inst = 0;
      PVAI_M_inst = abs(PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3);  // car la somme des puissances apparentes "signées" est négative puisqu'en "injection" au global

      // PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir une énergie en Wh
      Energie_jour_Injectee += ((float)delta_temps / 1000) * (PuissanceI_M_inst / 3600.0);

    } else {  // soutirage
      PuissanceI_M_inst = 0;
      PuissanceS_M_inst = ((float)((float)(Lecture333[21] * 16777216) + (float)(Lecture333[22] * 65536) + (float)(Lecture333[23] * 256) + (float)Lecture333[24]));
      PVAI_M_inst = 0;
      PVAS_M_inst = PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3;

      // PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir pour obtenir une énergie en Wh
      Energie_jour_Soutiree += ((float)delta_temps / 1000) * (PuissanceS_M_inst / 3600.0);
    }

    // PowerFactor_M = ((float)(Lecture333[53] * 256 + Lecture333[54])) / 1000; ce facteur de puissance ne veut rien dire en tri-phasé en cas d'injection sur au moins une phase

    Energie_M_Soutiree = ((float)((float)(Lecture333[119] * 16777216) + (float)(Lecture333[120] * 65536) + (float)(Lecture333[121] * 256) + (float)Lecture333[122])) * 10;
    Energie_M_Injectee = ((float)((float)(Lecture333[135] * 16777216) + (float)(Lecture333[136] * 65536) + (float)(Lecture333[137] * 256) + (float)Lecture333[138])) * 10;

    MK333_dataBrute = "<strong>Triphasé</strong><br>Phase1 : " + String(int(Tension_M1)) + "V " + String(Intensite_M1) + "A</br>";
    MK333_dataBrute += "<br>Phase2 : " + String(int(Tension_M2)) + "V " + String(Intensite_M2) + "A</br>";
    MK333_dataBrute += "<br>Phase3 : " + String(int(Tension_M3)) + "V " + String(Intensite_M3) + "A</br>";
    MK333_dataBrute += "<br>Puissance active soutirée : " + String(PuissanceS_M_inst) + "W</br>";
    MK333_dataBrute += "<br>Puissance active injectée : " + String(PuissanceI_M_inst) + "W</br>";
    MK333_dataBrute += "<br>Puissance apparente soutirée : " + String(PVAS_M_inst) + "VA</br>";
    MK333_dataBrute += "<br>Puissance apparente injectée : " + String(PVAI_M_inst) + "VA</br>";

    MK333_dataBrute += "<br>Puissance apparente phase1  : " + String(PVA_M_inst1) + "VA</br>";
    MK333_dataBrute += "<br>Puissance apparente phase2  : " + String(PVA_M_inst2) + "VA</br>";
    MK333_dataBrute += "<br>Puissance apparente phase3  : " + String(PVA_M_inst3) + "VA</br>";

    if (PVA_M_inst1 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 1 : " + String(abs(PW_inst1 / PVA_M_inst1)) + "</br>";
    if (PVA_M_inst2 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 2 : " + String(abs(PW_inst2 / PVA_M_inst2)) + "</br>";
    if (PVA_M_inst3 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 3 : " + String(abs(PW_inst3 / PVA_M_inst3)) + "</br>";

    MK333_dataBrute += "<br>Energie jour nette soutirée (Linky): " + String(Energie_jour_Soutiree) + "Wh</br>";
    MK333_dataBrute += "<br>Energie jour nette injectée (Linky): " + String(Energie_jour_Injectee) + "Wh</br>";

    MK333_dataBrute += "<br>Energie totale soutirée : " + String(Energie_M_Soutiree) + "Wh</br>";
    MK333_dataBrute += "<br>Energie totale injectée : " + String(Energie_M_Injectee) + "Wh</br>";

    Pva_valide = true;
    filtre_puissance();
    PuissanceRecue=true;  //Reset du Watchdog à chaque trame du JSY reçue
    EnergieActiveValide = true;
    if (cptLEDyellow > 30) {
      cptLEDyellow = 4;
    }
  } else {
    StockMessage("Pas tout reçu, pas traité... nombre de données : " + String(a));
  }
}

Il me reste à faire tourner quelques jours maintenant en l'état, pour m'assurer que les problèmes sont derrière moi définitivement.

que de bonnes nouvelles à vs lire, youpi!!!!

Merci en tout cas.
ESP32 (v11.17): 1 Source UxIx3, 3 routeurs CE (ESP Externe) SSR dont 2 avec Sonde température, 1 routeur Pompe Piscine et PAC avec 2 SSRs
16 panneaux 445WC avec Enphase 7 tri-phasé avec une idée d'extension de qqs PVs plug&play sur le pool house
Jeedom, mqtt et JC pour piloter le tout
Répondre


Messages dans ce sujet
RE: Digression sur le code UxIx3 et les reboot / ENFIN PLUS DE PLANTAGE - par XabiX - 16-08-2024, 11:27 PM

Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)