Vai al contenuto
PLC Forum


Leggere temperatura ed effettuare una media nelle 24 ore


Ray85

Messaggi consigliati

Innanzitutto buongiorno,

sto cercando di elaborare un programma che possa leggere ciclicamente un valore di temperatura da una temocoppia pt100 installata in una stanza e riuscire a visualizzare su pannello touch la media delle letture fatte nell'arco delle 12/24 ore. 

Potreste aiutarmi?

grazie infinite, Marco

Link al commento
Condividi su altri siti


Quante letture devi fare all'ora?

Una ogni 1' è sufficientemente rapida?

In questo caso sono 720 letture ogni 12 ore

Se si ti basta leggere e sommare il valore letto alla somma dei velori precedentemente letti e decrementare il numero di letture, poi la somma la dividi per 720 quando il contatore è arrivato a 0, ed avrai il valore medio con media aritmentica sulle 12 ore.

Link al commento
Condividi su altri siti

Crei un array con le temperature di cui vuoi fare la media, ad ogni ciclo di acquisizione con l'FC90 che trovi nella biblioteca, shifti l'arrey di un elemento e carichi nel primo elemento l'ultima temperatura.

a questo punto non ti resta che fare la media degli elementi dell'array.

Link al commento
Condividi su altri siti

Tieni presente che se non hai tutti i dati delle ultime 12 ore (in questo caso 720), potresti incominciare a presentare una media basandoti sui dati che realmente conosci.

Facendo la media su 2,3...10....500...719 ed in fine 720 dati buoni. Sempre se l'operatore si aspetta subito di avere un dato medio.

 

Link al commento
Condividi su altri siti

Giuseppe Signorella

Con l'uso degli array, come suggerito da acquamanlavorando con l'indice, dopo le 12/24 ore, puoi scartare la prima lettura fatta (La più vecchia) e sovrascriverla. in questo modo avrai dopo le prime 12/24 ore sempre un dato aggiornato con la media delle ultime 12 o 24 ore in qualunque momento. 

 

Ciao

 

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

Cosi hai una media ogni 12 ore, come dico io, hai sempre la media delle ultime 12 ore.

Dipende cosa devi fare.

Se devi fare una media ogni 12 ore è un conto, differente se devi fare una finestra scorrevole su 12 ore. Son 2 concetti differenti.

Ray85 ha scritto esplicitamente: "... la media delle letture fatte nell'arco delle 12/24 ore."

Se invece vuoi fare una "sliding window" di larghezza pari a 12 ore, conviene creare un FIFO e sommare ad ogni elemento aggiunto;  quando il FIFO è pieno, ad ogni nuovo elemento sottrai dal totale l'elemento che scartato e sommi il nuovo entrato, poi dividi per il numero degli elementi.

Questa è la via più semplice di ottenere una media scorrevole.

Link al commento
Condividi su altri siti

Buona sera,

ho atteso così tanto a scrivere il responso perché credo sia doveroso prima di chiedere aver provato, il più possibile, a risolvere i problemi con le mie forze (anche perché sennò cosa avrei potuto chiedere?).

Ho creato una struct  di 5 elementi : tutti di tipo INT aventi come indirizzo 0.0....2.0....4.0....6.0....8.0....10.0....finendo con end_stract 12.0

Ho costruito in un FC la funzione di shift utilizzando il blocco FC90 , dopo avere impostato il puntatore che indicava l'inizio della tabella e aver messo come LENGHT 5 ho visto, con enorme gioia, che il valore della periferica PEW512 veniva copiato nelle 5 MW che avevo "impostato".

Tutto "fiero" mi son detto allora se creo un fc90 che copia in una sola MW e ripeto per tutte le volte che avrò bisogno del dato (10 volte) alla fine avrò 10 MW col valore letto in quell'istante, non resterà che dividere la somma per dieci ed ecco pronta la mia media...MAGARI.

Ho scoperto ahimè che non posso assegnare una singola MW dove copiare il "valore"..minimo deve essere W#16#2...

POTRESTE SPIEGARMI DOVE SBAGLIO E AIUTARMI A RISOLVERE IL PROBLEMA?

GRAZIE DI CUORE E BUON FINE SETTIMANA.

Ray85

Link al commento
Condividi su altri siti

No non ci siamo capiti, es se vuoi campionare la temperatura una volata al minuto per 12 ore, crei un array di 720 elementi, ed fai eseguire l'FC90 una sola volta al minuto, in questo modo dopo 12 ore avrai nell'array 720 misure di temperatura dell'ultime 12 ore.

A questo punto devi sommare tutte e 720 misure e dividerle per 720 cosi trovi la media della temperatura delle ultime 12 ore.

Quando fai la somma ricordati usare il doppio intero, se usi l'intero probabilmente vai fuori scala.

Per evitare la noia di fare una somma di 720 variabili, puoi creare una variabile DINT, ad ogni minuto, prima di eseguire l'FC90 sommi alla tua variabile la temperatura letta e sottrai quella l'ultimo elemento dell'array, cosi ottieni (dopo 12 ore e resta aggiornata) nella tua variabile DINT la somma di tutte e 720 temperature, e ti basta dividerla per 720 per ottenere la media. 

Link al commento
Condividi su altri siti

Alberto, Ciao.

Perdonami ho provato ma non riesco proprio a far funzionare il sistema. 

Ho creato 10 istanze per semplificare da fa cicale una volta ogni ora per avere una media su 10 ore.

Purtroppo devo aver sbagliato programmazione tanto che la cpu in PLCSIM va in SF. 

Puoi farmi un esempio veloce (da due o tre variabili) così che io possa vedere con mano e capire una volta per tutte?

Saresti gentilissimo.

Buona notte, Marco (Ray85)

Link al commento
Condividi su altri siti

Avevo scritto:

"Se si ti basta leggere e sommare il valore letto alla somma dei valori precedentemente letti e decrementare il numero di letture, poi la somma la dividi per 720 quando il contatore è arrivato a 0, ed avrai il valore medio con media aritmentica sulle 12 ore."

E' estremamente banale, si tratta di eseguira A = A +B dove B è il valore letto, avendo cura di definire a A come intero doppio; poi fare C = C-1 e se C = 0 eseguire A / 720.

Link al commento
Condividi su altri siti

    Questo è un esempio per una media di 10 misure campionate ogni minuto.

  U     T     10
      SPBN  M1
      L     "Media".Sommatoria
      L     PEW  512
      +D    
      L     "Media".Misure[10]
      -D    
      T     "Media".Sommatoria

      L     L#10
      /D    
      T     "Media".Media

      CALL  "WSR"
       RESET :=M0.0
       S_DATA:=PEW512
       START :="Media".Misure
       LEN   :=W#16#A
       E_TYPE:=B#16#5
       Q     :=M0.1

M1:   UN    T     10
      L     S5T#1M
      SE    T     10

Link al commento
Condividi su altri siti

Ciao acquaman, ho provato, studiato e devo dire che ho capito il senso e sono riuscito a metterlo in pratica sul mio sistema.

Solo alcuni chiarimenti : con il "termine" W#16#A si definisce una word di che tipo?

Come mai, nella variabile LEN del blocco fc90 non posso mettere w#16#1? 

Infine, mi aspettavo di veder "scorrere" le letture lungo le mie variabili nell'array, invece il valore della PEW 512 viene copiato in tutti gli indirizzi. potresti spiegarmi il motivo?

 

Grazie, Marco.

 

Link al commento
Condividi su altri siti

W#16#A è una costante in esadecimale, A si intende 10 nella LEN devi mettere il numero di elementi che vuoi shiftare in esadecimale, se sono 720 minuti devi mettere 2D0.

Ogni minuti l'array deve shiftare di una posizione e il valore della PEW512 viene caricato solo nel primo elemento dell'array.

 

Link al commento
Condividi su altri siti

Quote

Infine, mi aspettavo di veder "scorrere" le letture lungo le mie variabili nell'array, invece il valore della PEW 512 viene copiato in tutti gli indirizzi. potresti spiegarmi il motivo?

E' probabile che il tuo  CALL  "WSR" venga elaborato ciclicamente, devi eleborarlo solo per un ciclo ogni minuto, forse non hai seguito alla lettera l'esempio di Acquaman.

 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...