Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Estimation d'injection avec TIC + CACSI
#1
Bonjour,
On voit que l'usage de la TIC a une limitation quand on a un CACSI; la réactivité à ouvrir le triac est lente.
Cela vient du fait que le Linky ne fournit pas la puissance injectée; on considère donc que c'est 0W.
L'ouverture du triac étant piloté par un asservissement, la réactivité va dépendre de l'écart (Puissance-Pw). L'écart étant faible, la réactivité à la montée est faible.

Quand on observe les données du Linky, on peut voir que même si SINSTS (puissance apparente) est à 0VA, IRMS n'est pas toujours à 0A.
On peut donc estimer grossièrement la puissance injectée quand la valeur SINSTS est à 0VA (et seulement quand c'est 0VA).
L'estimation ne sera pas précise car la précision sur la mesure en courant est à 1A, soit 230VA environ. Cela ne devrait pas être trop gênant car le principal est de corriger sur de forts écarts (Puissance-Pw).

Estimation injection = 
(SINSTS1 == 0 ? -1 : 1) *  URMS1 *  IRMS1 +  (SINSTS2 == 0 ? -1 : 1) *  URMS2 *  IRMS2 + (SINSTS3 == 0 ? -1 : 1) *  URMS3 *  IRMS3
(formule probablement à revoir pour le triphasé)

Exemple ici en triphasé. SINSTS=0
Estimation injection = 1*236-2*235-2*235 = -704W


IRMS1 001 /
IRMS2 002 1
IRMS3 002 2

URMS1 236 E
URMS2 235 E
URMS3 235 F
SINSTS 00000 F
SINSTS1 00178 G
SINSTS2 00000 8
SINSTS3 00000 9

Dans ce cas, on pourrait utiliser la valeur -704VA plutôt que 0VA du SINSTS.

Cela éviterait d'avoir à booster la réactivité quand on détecte SINSTS collé à 0VA sur plusieurs secondes.

La modification doit pouvoir tenir dans le fichier Source_Linky.ino. Je peux tester une version béta sous vous le souhaitez.

Cordialement,
Ludovic
Répondre
#2
On risque un asservissement instable. Lorsque que l'on régule bien, la valeur en VA augmente fortement et c'est là ou il ne faut pas changer le réglage.

Cdlt
Répondre
#3
(14-07-2024, 08:40 AM)F1ATB a écrit : On risque un asservissement instable. Lorsque que l'on régule bien, la valeur en VA augmente fortement et c'est là ou il ne faut pas changer le réglage.

Cdlt

Il faudrait regarder les valeurs IRMS et URMS quand la régulation se passe bien. Les valeurs "RMS" pourraient être différentes de la puissance apparente SINSTS.
Mais si le résultat est de même nature que la puissance apparente, alors cela ne fonctionnerait pas.
Cordialement
Répondre
#4
Ma curiosité m'a poussé à faire une tentative...
En cas de CACSI détecté (absence EAIT), ET si PuissanceS_M==0, on calcule de l'estimation de la puissance injectée pPuissance (sur réception du champ SMAXSN1).
Si pPuissance < -100, on force PuissanceI_M = pPuissance. S'il y a moins de 100W estimés en injection, on ne change rien.

A ma surprise, cela fonctionne bien; on gagne beaucoup en réactivité.
https://zupimages.net/viewer.php?id=24/28/hro8.png
Les pics à -475W sont issus de ce changement; j'ai un lave-linge qui tourne et fait varier régulièrement la puissance consommée.
Dans mon réglage, je garde la consigne PW=50W, car l'estimation de puissance injectée n'est que grossière, et n'est valable que pour des valeurs <-100W
Je vais continuer à observer le comportement avec cette solution, afin de vérifier que cela ne génère pas d'instabilité.

Je met les bouts de codes ici:
int pIRMS1, pIRMS2, pIRMS3 = -1, pURMS1, pURMS2, pURMS3, pSINSTS1, pSINSTS2, pSINSTS3, pPuissance;
void LectureLinky() {  //Lecture port série du LINKY
...

                if (!EAITvalid && Tm > 8000) {  //Cas des CACSI ou EAIT n'est jamais positionné
                  EAITvalid = true;
  cacsi = true;
  StockMessage("Detection mode CACSI/TIC");
                }
...

          if (code.indexOf("IRMS1") == 0) {
            Intensite_M = val.toFloat();  //Phase 1 uniquement
          }
          if (code.indexOf("URMS1") == 0) {
pURMS1 = val.toInt();
          }
          if (code.indexOf("URMS2") == 0) {
pURMS2 = val.toInt();
          }
          if (code.indexOf("URMS3") == 0) {
pURMS3 = val.toInt();
          }
          if (code.indexOf("IRMS1") == 0) {
pIRMS1 = val.toInt();
          }
          if (code.indexOf("IRMS2") == 0) {
pIRMS2 = val.toInt();
          }
          if (code.indexOf("IRMS3") == 0) {
pIRMS3 = val.toInt();
          }
          if (code.indexOf("SINSTS1") == 0) {
pSINSTS1 = val.toInt();
          }
          if (code.indexOf("SINSTS2") == 0) {
pSINSTS2 = val.toInt();
          }
          if (code.indexOf("SINSTS3") == 0) {
pSINSTS3 = val.toInt();
          }
          if (code.indexOf("SMAXSN1") == 0) {
pPuissance = 0;
if (cacsi && PuissanceS_M == 0) { // estimation de la puissance d'injection si PuissanceS_M==0
pPuissance = (pSINSTS1 == 0?-1:1) * pURMS1 * pIRMS1;
if (pIRMS3 != -1) { // triphasé
pPuissance += (pSINSTS2 == 0?-1:1) * pURMS2 * pIRMS2;
pPuissance += (pSINSTS3 == 0?-1:1) * pURMS3 * pIRMS3;
}
if (pPuissance > -100) { // pas d'estimation si l'écart est faible
pPuissance = 0;
}
}
PuissanceI_M = -pPuissance;
          }

Cordialement
Répondre
#5
Bonjour,

Voilà un premier retour après quelques jours de fonctionnement avec une estimation d'injection (TIC et CACSI):
https://www.zupimages.net/viewer.php?id=24/29/9qhv.png
(la courbe de température interne en dents de scie est le résultat du déclenchement du ventilateur si t >= 35°C)

La régulation est rapide maintenant qu'il y a une estimation de l'injection.
La marge de 150W semble être adaptée (avec une précision à 230W, cela affiche 80W d'injection par exemple s'il y a 1A)
Je n'ai pas encore vu d'instabilité dans l'asservissement.

Code source modifié ici:
https://drive.google.com/file/d/1iHNg7w1...XV99gzrfTS

Cordialement
Répondre
#6
(14-07-2024, 05:47 PM)Ludovic35 a écrit : Ma curiosité m'a poussé à faire une tentative...
En cas de CACSI détecté (absence EAIT), ET si PuissanceS_M==0, on calcule de l'estimation de la puissance injectée pPuissance (sur réception du champ SMAXSN1).
Si pPuissance < -100, on force PuissanceI_M = pPuissance. S'il y a moins de 100W estimés en injection, on ne change rien.

A ma surprise, cela fonctionne bien; on gagne beaucoup en réactivité.
https://zupimages.net/viewer.php?id=24/28/hro8.png
Les pics à -475W sont issus de ce changement; j'ai un lave-linge qui tourne et fait varier régulièrement la puissance consommée.
Dans mon réglage, je garde la consigne PW=50W, car l'estimation de puissance injectée n'est que grossière, et n'est valable que pour des valeurs <-100W
Je vais continuer à observer le comportement avec cette solution, afin de vérifier que cela ne génère pas d'instabilité.

Je met les bouts de codes ici:
int pIRMS1, pIRMS2, pIRMS3 = -1, pURMS1, pURMS2, pURMS3, pSINSTS1, pSINSTS2, pSINSTS3, pPuissance;
void LectureLinky() {  //Lecture port série du LINKY
...

                if (!EAITvalid && Tm > 8000) {  //Cas des CACSI ou EAIT n'est jamais positionné
                  EAITvalid = true;
  cacsi = true;
  StockMessage("Detection mode CACSI/TIC");
                }
...

          if (code.indexOf("IRMS1") == 0) {
            Intensite_M = val.toFloat();  //Phase 1 uniquement
          }
          if (code.indexOf("URMS1") == 0) {
pURMS1 = val.toInt();
          }
          if (code.indexOf("URMS2") == 0) {
pURMS2 = val.toInt();
          }
          if (code.indexOf("URMS3") == 0) {
pURMS3 = val.toInt();
          }
          if (code.indexOf("IRMS1") == 0) {
pIRMS1 = val.toInt();
          }
          if (code.indexOf("IRMS2") == 0) {
pIRMS2 = val.toInt();
          }
          if (code.indexOf("IRMS3") == 0) {
pIRMS3 = val.toInt();
          }
          if (code.indexOf("SINSTS1") == 0) {
pSINSTS1 = val.toInt();
          }
          if (code.indexOf("SINSTS2") == 0) {
pSINSTS2 = val.toInt();
          }
          if (code.indexOf("SINSTS3") == 0) {
pSINSTS3 = val.toInt();
          }
          if (code.indexOf("SMAXSN1") == 0) {
pPuissance = 0;
if (cacsi && PuissanceS_M == 0) { // estimation de la puissance d'injection si PuissanceS_M==0
pPuissance = (pSINSTS1 == 0?-1:1) * pURMS1 * pIRMS1;
if (pIRMS3 != -1) { // triphasé
pPuissance += (pSINSTS2 == 0?-1:1) * pURMS2 * pIRMS2;
pPuissance += (pSINSTS3 == 0?-1:1) * pURMS3 * pIRMS3;
}
if (pPuissance > -100) { // pas d'estimation si l'écart est faible
pPuissance = 0;
}
}
PuissanceI_M = -pPuissance;
          }

Cordialement

Super boulot Ludovic !
Répondre
#7
Merci.
Il faudrait vérifier si ça fonctionne toujours aussi bien avec un cumulus en monophasé / 3000W.
J'ai 3 résistances en tri (soit 1400W sur 2+1 phases); je ne vois donc pas le comportement sur de plus fortes puissances.
Cordialement
Répondre
#8
(22-07-2024, 03:14 PM)Ludovic35 a écrit : Merci.
Il faudrait vérifier si ça fonctionne toujours aussi bien avec un cumulus en monophasé / 3000W.
J'ai 3 résistances en tri (soit 1400W sur 2+1 phases); je ne vois donc pas le comportement sur de plus fortes puissances.
Cordialement

Je ne pourrais pas vérifier car je n'utilise plus de cumulus depuis lontemps à cause du taux de calcaire dans l'eau, je me situe au pied des Corbières et les chauffe eau durent aux maximum 3 ans , cependant , je me lave quand meme... avec un chauffeau électrique instantané de 5kw et dont le cricuit d'eau est vidé totalement après chaque utilisation.

Je suis juste heureux de voir des personnes qui recherchent et mettent les mains "dans le camboui" et grand merci à André de mettre à disposition les codes source !
Répondre
#9
Bonjour,
Ci-dessous, une capture montrant la réactivité de l'asservissement avec une lecture de la TIC quand une charge de 2000W s'allume puis s'éteint.
https://zupimages.net/viewer.php?id=24/30/0yid.png

La charge asservie sur un SSR en multi-sinus est de 1500W (l'autre charge, le CE, est plein).
On peut voir qu'il y a une estimation d'injection à 560W (~= 3A*230V-150W_marge). La précision étant à 1A, on retrouve des variations de ~230W.
On observe que c'est aussi rapide sur la fermeture du SSR que sur sa fermeture; environ 15s au total.

Cordialement,
Répondre


Atteindre :


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