Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
problème de calcul de la puissance (grosse puissance)
#1
Bonjour,
j'ai fait une installation avec JSY 333 G , l'esp communique bien avec, il a la bonne tension et la bonne intensité.
avec ça tout devrais dérouler,  sauf que la puissance affichée par le routeur correspond à la puissance réelle/ 10
En gros la puissance affichéeX10 me paraît très cohérente

je suis en version 14.25
le routeur est placé sur mon installation qui consomme pas mal d'énergie (entre 15 et 75 kw) avec 44 kw de panneau solaire


   

le soucis a t'il déjà été remonté?
quelle manip il faudrait que je fasse ?

merci pour tout ce travail qui est super bien fait et expliqué

florian
Répondre
#2
Bizarre.
Si vous avez l'IDE Arduino, je commencerais, pour voir, par passer les tous les calculs UxIx3 en flottant.

à commencer par ces trois lignes : qui correspondent directement aux valeurs en VA affichées dans la page données brutes:
Triphasé
Phase1 : 231.66V x -1.90A = -440VA
Phase2 : 233.53V x +1.98A = +463VA
Phase3 : 231.88V x +2.14A = +497VA

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

devient :
PVA_M_inst1 = (Lecture333[35] * 256.0) + Lecture333[36];
PVA_M_inst2 = (Lecture333[37] * 256.0) + Lecture333[38];
PVA_M_inst3 = (Lecture333[39] * 256.0) + Lecture333[40];

Rien d'autre n'est fait sur ces données avant affichage.

On ne sait jamais comment le compilateur interprète le code et gère les "overflow" de calcul.
l'ESP32 a toute la puissance de calcul pour.
V14.21 modifiée. 1 serveur UxIx3, 1 Linky de référence, 1 client Triac CE tampon + 1 client SSR CE tampon + 1 client SSR sur CE tri + 3 clients SSR sur 3 radiateurs bain d'huile d'appoint. Variateurs de fréquence Piscine.
8 panneaux (3 SE 2 S, 3 SO ) 425Wc sur 4 HM800 produisent 20kWh par jour au 16 Mars.
Répondre
#3
Bonjour,
Du coup j'ai televerser avec les changements que vous m'avez préconisé mais rien a changer
Du coup j'ai essayé de modifier le code en multipliant le calcul par 10
Avec ce code // *************************************************
// * Client lecture JSY-MK-333 * Triphasé *
// * Développement initial de Pierre F (Mars 2024) *
// * update PhDV61 Juin 2024 et Août 2024*
// *************************************************

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

void Requete_JSY333() {
  int i;
  if (RAZ_JSY) {  // RAZ Message proposé par F6AAM
    byte msg_send[] = { 0x01, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xFA };
    // Envoi commande de remise à zéro sur le JSY-MK-333
    for (i = 0; i < 13; i++) {
      MySerial.write(msg_send[i]);
    }
    RAZ_JSY = false;
    delay(500);
  }
  byte msg_send[] = { 0x01, 0x03, 0x01, 0x00, 0x00, 0x44, 0x44, 0x05 };
  for (i = 0; i < 8; i++) {
    MySerial.write(msg_send[i]);
  }
}

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;

  Requete_JSY333();

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

  if (a == 141) {                                              // message complet reçu
    delta_temps = (unsigned long)(millis() - Temps_precedent);  // temps écoulé depuis le dernier appel
    Temps_precedent = millis();                                // conserve le temps actuel pour le calcul suivant

    Tension_M1 = ((Lecture333[3] * 256 + Lecture333[4])) / 100.0;
    Tension_M2 = ((Lecture333[5] * 256 + Lecture333[6])) / 100.0;
    Tension_M3 = ((Lecture333[7] * 256 + Lecture333[8])) / 100.0;

    Intensite_M1 = ((Lecture333[9] * 256 + Lecture333[10])) / 100.0;
    Intensite_M2 = ((Lecture333[11] * 256 + Lecture333[12])) / 100.0;
    Intensite_M3 = ((Lecture333[13] * 256 + Lecture333[14])) / 100.0;

    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 vrai, l'opération est en injection

    // Lecture des puissances actives de chaque phase
    PW_inst1 = Lecture333[15] * 256 + Lecture333[16];
    PW_inst2 = Lecture333[17] * 256 + Lecture333[18];
    PW_inst3 = Lecture333[19] * 256 + Lecture333[20];

    // Lecture des puissances apparentes de chaque phase et multiplication par 10
    PVA_M_inst1 = (((Lecture333[35] * 256) + Lecture333[36]) * 10);
    if (sens1) { PVA_M_inst1 = -PVA_M_inst1; }
    PVA_M_inst2 = (((Lecture333[37] * 256) + Lecture333[38]) * 10);
    if (sens2) { PVA_M_inst2 = -PVA_M_inst2; }
    PVA_M_inst3 = (((Lecture333[39] * 256) + Lecture333[40]) * 10);
    if (sens3) { PVA_M_inst3 = -PVA_M_inst3; }

    if (injection) {
      PuissanceS_M_inst = 0;
      // Puissance active (lecture des indices 21 à 24) multipliée par 10
      PuissanceI_M_inst = (((float)(Lecture333[21] * 16777216UL +
                                      Lecture333[22] * 65536UL +
                                      Lecture333[23] * 256UL +
                                      Lecture333[24])) * 10);
      PVAS_M_inst = 0;
      PVAI_M_inst = abs(PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3);

      // Intégration de la puissance active sur delta_temps pour obtenir une énergie en Wh
      Energie_jour_Injectee += ((float)delta_temps / 1000.0) * (PuissanceI_M_inst / 3600.0);
    } else {  // soutirage
      PuissanceI_M_inst = 0;
      // Puissance active (lecture des indices 21 à 24) multipliée par 10
      PuissanceS_M_inst = (((float)(Lecture333[21] * 16777216UL +
                                      Lecture333[22] * 65536UL +
                                      Lecture333[23] * 256UL +
                                      Lecture333[24])) * 10);
      PVAI_M_inst = 0;
      PVAS_M_inst = PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3;

      Energie_jour_Soutiree += ((float)delta_temps / 1000.0) * (PuissanceS_M_inst / 3600.0);
    }

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

    MK333_dataBrute = "";
    MK333_dataBrute = "<strong>Triphasé</strong>";

    if (Intensite_M1 < 0)
      MK333_dataBrute += "<br>Phase1 : " + String(Tension_M1) + "V x " + String(Intensite_M1) + "A = " + String(int(PVA_M_inst1)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase1 : " + String(Tension_M1) + "V x +" + String(Intensite_M1) + "A = +" + String(int(PVA_M_inst1)) + "VA</br>";

    if (Intensite_M2 < 0)
      MK333_dataBrute += "<br>Phase2 : " + String(Tension_M2) + "V x " + String(Intensite_M2) + "A = " + String(int(PVA_M_inst2)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase2 : " + String(Tension_M2) + "V x +" + String(Intensite_M2) + "A = +" + String(int(PVA_M_inst2)) + "VA</br>";

    if (Intensite_M3 < 0)
      MK333_dataBrute += "<br>Phase3 : " + String(Tension_M3) + "V x " + String(Intensite_M3) + "A = " + String(int(PVA_M_inst3)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase3 : " + String(Tension_M3) + "V x +" + String(Intensite_M3) + "A = +" + String(int(PVA_M_inst3)) + "VA</br>";

    if (PuissanceS_M_inst == 0)
      MK333_dataBrute += "<br>Puissance active injectée    : " + String(PuissanceI_M_inst) + "W</br>";
    else
      MK333_dataBrute += "<br>Puissance active soutirée    : " + String(PuissanceS_M_inst) + "W</br>";

    if (PVAS_M_inst == 0)
      MK333_dataBrute += "<br>Puissance apparente injectée : " + String(PVAI_M_inst) + "VA</br>";
    else
      MK333_dataBrute += "<br>Puissance apparente soutirée : " + String(PVAS_M_inst) + "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));
  }
}
La c'est assez cohérent sauf que j'ai des décrochage qui ne sont pas normal. Ça passe de +32kw a -32kw sans raison particulière je pense que mon code doit pas être bon ...


Pièces jointes Miniature(s)
   
Répondre
#4
il y a une erreur dans uxi3.ino
Au lieu de :
PuissanceS_M_inst = ((float)((float)(Lecture333[21] * 16777216) + (float)(Lecture333[22] * 65536) + (float)(Lecture333[23] * 256) + (float)Lecture333[24]));

// Utilisez :
PuissanceS_M_inst = ((float)((float)(Lecture333[21] * 16777216) + (float)(Lecture333[22] * 65536) + (float)(Lecture333[23] * 256) + (float)Lecture333[24])) * 10;

// Et de même pour l'injection :
PuissanceI_M_inst = ((float)((float)(Lecture333[25] * 16777216) + (float)(Lecture333[26] * 65536) + (float)(Lecture333[27] * 256) + (float)Lecture333[28])) * 10;
Répondre
#5
Non, pour moi il n'y a pas d'erreur.
Ces 4 bytes  en 21-22-23-24 contiennent la valeur en Watts sur les 3 phases comme indiqué dans la doc du JSY-MK-333.
Il n'y a pas à multiplier par "10".

10  Three-phase total active power 0109H, 010AH read  Unsigned number, value=DATA, unit is W (The 0109H register corresponds to the high 16 bits)

L'erreur est ailleurs.
Chez moi, toutes les valeurs sont cohérentes, et cohérentes avec celles du Linky.

   

Avez-vous essayé de forcer le calcul en flottant déjà pour la puissance apparente qui apparait sur la première ligne des données brutes ??
Vos tensions et intensités ont l'air correctes.

Après si ce n'est toujours pas bon, c'est que peut-être il y a un problème de formatage de la page web et il faudra alors questionner André.

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

//Lecture des puissances apparentes de chacune des phases, qu'on signe comme le Linky
PVA_M_inst1 = (Lecture333[35] * 256.0) + Lecture333[36]*1.0; // kVa
PVA_M_inst2 = (Lecture333[37] * 256.0) + Lecture333[38]*1.0;
PVA_M_inst3 = (Lecture333[39] * 256.0) + Lecture333[40]*1.0;
V14.21 modifiée. 1 serveur UxIx3, 1 Linky de référence, 1 client Triac CE tampon + 1 client SSR CE tampon + 1 client SSR sur CE tri + 3 clients SSR sur 3 radiateurs bain d'huile d'appoint. Variateurs de fréquence Piscine.
8 panneaux (3 SE 2 S, 3 SO ) 425Wc sur 4 HM800 produisent 20kWh par jour au 16 Mars.
Répondre


Atteindre :


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