Calcolo potenza istantanea da lettura impulsi contatore
Home › Forum › Programmazione IEC 61131 (LogicLab) › Calcolo potenza istantanea da lettura impulsi contatore
- Questo topic ha 3 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 8 anni, 3 mesi fa da
Luca.
-
AutorePost
-
Marzo 28, 2013 alle 9:28 am #35349
Alessandro
PartecipanteVorrei calcolare la potenza istantanea da un contatore di energia elettrica basandomi sul tempo che passa tra l’arrivo di un impulso e quello successivo. Poi vorrei visualizzare il valore con una variabile UDINT che rappresenta la potenza in W.
La formula è: P=3600/(k*t) dove
k= Costante impulsi/kWh del contatore.
t=Tempo intercorso tra l’arrivo dell’impulso e il precedente.Ho creato una variabile REAL chiamata Aux1 e ho scritto:
Aux1:=(PVars.ImpulseConstant/1000)*TO_REAL((myTimer-PwrTimeCalc)/(1000000));
InstPwr:=TO_UDINT(3600/Aux1)PVars.ImpulseConstant è la costante Impulsi/kWh del contatore (nei test che sto facendo ho impostato 4000)
myTimer: UDINT che rappresenta tempo attuale ricavato con SysGetSysTime(TRUE)
PwrTimeCalc: UDINT che rappresenta il tempo in cui è stato ricevuto impulso precedente ricavato con SysGetSysTime(TRUE)
InstPwr: UDINT che rappresenta a potenza istantanea in W.Quando però vado a guardare nella finestra watch le variabili vedo che IsntPwr è sempre o zero o un valore che presumo indichi l’overflow e Aux1 è sempre zero. Dove sbaglio ?
Marzo 28, 2013 alle 9:48 am #37610Sergio Bertana
Amministratore del forumL’errore che hai commesso è il più classico, nei calcoli in REAL hai omesso il “.0” nella dichiarazione delle costanti numeriche REAL. Quando scrivi TO_REAL((myTimer-PwrTimeCalc)/(1000000)) tu vorresti eseguire i calcoli in REAL ma in realtà i calcoli sono eseguiti in UDINT e quindi si perdono le parti decimali della divisione.
Per scrivere in forma corretta il calcolo dovresti scrivere TO_REAL(myTimer-PwrTimeCalc)/1000000.0. Cioè converto prima in REAL il risultato della differenza dei tempi e poi eseguo la divisione per 1000000.0 (Nota il .0 finale).
Ho scritto un semplice programma che dimostra come eseguire correttamente il calcolo, ti allego la stampa ed il programma sorgente. Come noti ho definito come costante Impulsi/Kwh del contatore 3600.0 quindi se arriva un impulso al secondo la potenza istantanea è di 1000 Wh.
Marzo 28, 2013 alle 10:00 am #37611Sergio Bertana
Amministratore del forumAggiungo una nota, al primo impulso il valore di potenza è errato in quanto è evidente che non avendo il sistema memorizzato il tempo di arrivo impulso precedente la differenza dei tempi genera un valore errato.
Per sistemare il problema bisognerebbe aggiungere una variabile BOOL inizializzata a FALSE che verrà settata a TRUE dopo il primo impulso. Con variabile a FALSE il calcolo della potenza non viene eseguito ma si esegue solo il salvataggio dei tempi.
Gennaio 16, 2017 alle 5:17 pm #39822Luca
PartecipantePer chi fosse interessato, ho affrontato lo stesso problema (calcolo potenza da impulsi) e ho visto che la formula precedente non è la migliore. in pratica, il calcolo viene fatto quando arriva l’impulso, e finchè non arriva il prossimo impulso non si sa realmente quale sia la potenza. per potenze basse gli impulsi arrivano molto raramente (10W = 1 impulso ogni 6 minuti)
il problema è quando la potenza è zero: il programma resta in attesa di un impulso che non arriverà mai, e avrà in mente la variabile calcolata all’ultimo impulso.Quindi ho usato un altro metodo, ossia invece di calcolare la potenza quando arriva l’impulso, conto gli impulsi che arrivano entro tot minuti (variabile input). ad esempio ogni 5 minuti conto quanti impulsi arrivano, e calcolo la potenza con la formula:
P = (NImpulsi / Minuti) x 60.0
Chiaro che pù basso sarà il valore “minuti” e più frequentemente avrò il valore calcolato, ma di contro sarà meno preciso (per assurdo, se fossero 60 avrei il valore esatto).
-
AutorePost
- Devi essere connesso per rispondere a questo topic.