Vai al contenuto
PLC Forum


Filtro Ingresso Analogico


zazzamatteofabio

Messaggi consigliati

zazzamatteofabio

Salve a tutti mi chiamo Fabio mi sono da poco accostato al mondo dell'automazione e sono alle prese con un problema per me nuovo.

Devo eseguire un filtraggio di un segnale analogico che varia in maniera brusca e repentina, con picchi significativi sia in positivo che in negativo, che però mantiene (anche graficamente) un valore medio piu o meno costante.

Ho letto le soluzioni a problemi analoghi, ad esempio fatte con calcoli matematici, ma mi servirebbe una soluzione che campioni il segnale con una frequenza da me impostabile: ad esempio ogni 2 secondi.

Ho provato ad eseguire un loop e mettere i valori letti dentro una db (da 40 elementi) per poi fare una semplice media matematica.

Ecco io vorrei temporeggiare ogni ciclo di loop (ad esempio di 1-2 secondi) in modo che il plc, non raccolga i dati alla frequenza di ciclo, ma in base alla frequenza da me impostata..

Grazie

Link al commento
Condividi su altri siti


Adelino Rossi

hai analizzato il motivo per cui il sensore, (di cosa?) trasmette un segnale così variabile?

spesso ci sono delle migliorie hardware che danno un contributo a migliorare il segnale.

Link al commento
Condividi su altri siti

Ciao. :)

..non sono sicuro di aver capito bene ma forse ti basta utilizzare un fronte di salita quando effettui il "prelievo" (MOV_W ?) del valore analogico tramite il tuo clock..

Link al commento
Condividi su altri siti

del_user_27683

Concordo che un filtro hardware sia spesso più efficace, comunque se ho capito bene hai già fatto la routine per memorizzare il valore e fare la media, non basta richiamare il blocco a tempo? oppure in testa al blocco che fa tutto mettere qualcosa del tipo:

UN T100

L S5T#2S

SE T100

BEB

ciao.

Link al commento
Condividi su altri siti

Temporizzando la scansione non ottieni il risultato voluto, perchè se fai una lettura proprio nel momento in cui hai il picco, questo ti falsa in ogni caso il risultato.

Ti ci vuole un filtro passa-basso (hardware o software). Se i picchi anomali sono più o meno della stessa frequenza sei facilitato.

Ciao

Link al commento
Condividi su altri siti

Premesso che per prima cosa dovresti controllare la parte hardware per scongiurare variazioni dovute anche a disturbi (collegamenti, schermature, segali etc..), ci sono vari metodi per filtrare segnali. Dipende dalla tua applicazione identificare il piu adatto.

A me non sembra una buona idea la soluzione proposta da arrow, di campionare semplicemente il valore a intervalli regolari. Come dici tu, se il segnale varia, solamente ti trovi le stesse variazioni con un periodo differente.

- Media matematica:

Campioni ad intervall iregolari, poi ogni x campionamenti fai la media matematica (puoi affinare il sistema eliminando il picco MIN e MAX dalla media).

PRO = precisa; relativamente semplice da programmare; veloce esecuzione

CONTRO= Lenta (il valore si aggiorna ogni x campionamenti); ti servono x WORD o DWORD

- Media continua:

Ti registri gli ultimi x campioni e fai la media su quelli. (ad ogni nuovo campionamento che registri, cancelli l' x esimo)

PRO = precisa; Veloce (valore aggiornato ad ogni campionamento)

CONTRO= Programmazione non semplice; ti servono x WORD o DWORD

- Media (io la chiamo differenziale)

usi questo semplice calcolino: Out= (K*out_Prec + In)/K+1

Dove K è un fattore di filtro,

// fattore 0 = nessun filtro

// fattore 0,5= raggiunge il 98% dopo circa 4 cicli

// fattore 1 = raggiunge il 98% dopo circa 6 cicli

// fattore 50 = raggiunge il 98% dopo circa 200 cicli

Con questa funzione, come risposta al gradino hai una curva come per es la carica-scarica di un condensatore (non so se esponenziale, iperbole o cos altro)

PRO = precisa; Veloce (valore aggiornato ad ogni campionamento); veloce esecuzione sw; non ti serve nemmeno una word in piu; solo 8 righe di codice!

CONTRO= Funziona bene solo con variabili tipo REAL

Modificato: da floppydisco
Link al commento
Condividi su altri siti

- Media continua scorrevole:

Ti registri n campioni e fai la media aritmetica sommando e dividendo per n.

Ad ogni nuovo campionamento che entra in memoria, cancelli il più vecchio, realizzando imn pratica un buffer circolare

In effetti c'è un ritardo per avere il primo risultato pari ad "n" campionamenti, poi ad ogni campionamento si aggiorna il valore.

Il vero ritardo c'è perchè questa media, detta anche "a finestra scorrevole" (sliding window), lavora come un integratore. Presentando un gradino in ingresso, l'uscita è una rampa scalinata dove il tempo totale è pari al periodo di campionamento moltiplicato per "n" campionamenti.

Link al commento
Condividi su altri siti

Se vuoi usare qualcosa di già pronto, puoi provare con la funzione LEAD_LAG.

E' una funzione derivata dalle "Funzioni Speciali" dei plc serie Simatic TI (ex texas).

La trovi nelle librerie Siemens in "Standard Library --> TI-S7 Converting Blocks -> Blocks".

Basta che la selezioni e premi F1 per accedere al manuale in linea.

Link al commento
Condividi su altri siti

..per floppydisco..

A me non sembra una buona idea la soluzione proposta da arrow, di campionare semplicemente il valore a intervalli regolari

..un momento, un momento.. non ho fornito nessuna soluzione..ho solo cercato di interpretare brevemente la richiesta di zazzamatteofabio che non ha (tuttora) ben specificato il suo lavoro fino ad ora svolto.

Si parla di un certo ciclo di loop con all'interno GIA' la media di 40 valori da andare a "vedere" ogni 1 0 2 secondi (probabilmente per avere una lettura non troppo ballerina)..questo è ciò che ho capito .. ma potrei sbagliare.

Ciò non toglie che si possa discutere su come fare ad ottiene un valor medio....

Questo solo per precisare.. :)

Modificato: da arrow
Link al commento
Condividi su altri siti

Scusami, hai ragione. Non avevo inteso bene il tuo messaggio.

:)

Cambiando discorso,

.... Accidenti, questo batta ha sempre una buona risposta a tutto. ne sa una più del diavolo!

Modificato: da floppydisco
Link al commento
Condividi su altri siti

zazzamatteofabio

Grazie a tutti dei suggerimenti. Adesso prendo in mano una per una le varie soluzioni proposte, andandomi a studiare il significato delle operazioni nuove che non conosco: scusate ma avrete capito che sono alle prime armi.

Vi farò sapere...

Grazie

Link al commento
Condividi su altri siti

Aggiungo, oltre alle cose dette qui sopra, che gli anolog input, non tutti, hanno da configurazione hw un filtro impostatile. non è che abbia mai risolto più di tanto nelle mie applicazioni ma magari nella tua può tornare utile.

Il tutto naturalmente se il leggi il valore tramite analog input.

Link al commento
Condividi su altri siti

  • 2 weeks later...
zazzamatteofabio

Ciao a tutti, credo di aver trovato una soluzione al mio problema. Ho usato comandi semplici, e anche se la stesura del programma è un pò "macchinosa", il tutto sembra funzionare.. ho fatto cosi:

Ho creato una sequenza di n temporizzatori con un tempo ciascuno (che sarà poi il mio tempo di campionamento, uguale a 1 secondo) impostabile. Alla fine di questa "cascata" dove successivamente di attivano i temporizzatori ho messo il BEB in modo da fare una sequenza che si ripete.

In una db dedicata ho dichiarato un numero n di variabili, e ad ogni fronte di salita di un temporizzatore carico per quell'istante il valore analogico nella variabile.

Ad esempio con l'attivazione di T1 carico il valore analogico in Db2.DbD1, con T2 in dbd2 ecc...

Formo la mia tabella di n elementi, faccio la media matematica, che viene aggiornata ogni secondo da un nuovo valore anche se ho un picco grande, esso fa media con i precedenti e il risultato è "ammorbidito" notevolmente.

Sono per il momnto contento, non mi resta che provarlo sul campo..

Grazie ciao

Link al commento
Condividi su altri siti

Mi dispiace dirlo, ma hai fatto una cosa inutilmente complicata.

Rileggiti i suggerimenti dei post precedenti.

Link al commento
Condividi su altri siti

Mi dispiace dirlo, ma hai fatto una cosa inutilmente complicata.

Condivido e ho anche qualche dubbio sull'efficacia

Link al commento
Condividi su altri siti

:blink: :blink: :blink:

alla faccia del "semplice"... usare un banale clock e un indice di puntamento era troppo complicato?

In uno degli ultimi impianti che ho fatto, dovevo calcolare valore minimo, medio e massimo di 32 grandezze fisiche per ogni ciclo di lavorazione... se usavo questo tuo metodo, a parte diventare scemo per scrivere il codice, facevo fuori tutti i timer come niente... ti sono stati dati ottimi consigli: seguili...

Comunque, se il problema era quello di filtrare i disturbi, campionando a 1 sec, altro che "ammorbidimento"... non so quanti timer hai usato, ma con #n timer il tuo segnale medio (oltre che essere "ammorbidito") avrà un "ritardo" di #n secondi: non so cosa ci devi fare, ma non mi pare molto "accettabile"...

PS: a parte tutto, non ho capito il senso del BEB

ciao

Link al commento
Condividi su altri siti

zazzamatteofabio

Si lo so, ma da qualche mese oltre a fare quadri devo risolvere problemi come questo, con le poche conoscenze di plc, e comandi che ho.

Sto studiando in questo periodo, e sono sicuro che le parole di chi ci lavora da tanto con questi dispositivi sono oro colato.

Mi serve solo il tempo per capire le cose nuove e metterle in pretica

ciao

Link al commento
Condividi su altri siti

zazzamatteofabio

Una domanda: io ho interpretato quello che ha detto Livio Orsini, ovvero: "Ti registri n campioni e fai la media aritmetica sommando e dividendo per n"..

Come posso fare per "registrare"? Ho usato il mio sistema proprio per fare questo. Mi potete dire anche usando un linguaggio da neofiti come dovrei fare per campionare-registrare?

grazie

Link al commento
Condividi su altri siti

Come posso fare per "registrare"?

Accidenti, ma non potevi chiedere prima?

A parte le considerazioni sulle complicazioni, quello che hai realizzato è ben diverso.

Dunque vediamo di chiarirti qualche dubbio se ci riesco.

Per prima cosa è meglio avere un tempo preciso; ti programmi il timer di sitema (in configurazione Hw) in modo da avere un interrupt ogni 100 ms (p.e.) Quindi ogni decimo di secondo il programma lancerà OB35.

In OB35 fai la lettura degli ingressi analogicci e memorizzila lettura in un array di word, avrai tanti array quanti ingressi analogici devi leggere.

Quanto deve essere grande l'array? Quanto il numero di misure che vuoi fare come media. Ipotizziamo 10 misure così la media è su 1" (ma puoi anche fare 20 o altro valore).

Nell'OB di inizializzazione inizializzi un contatore con il valore delle letture da fare, 10 in questo esempio, e poi inizializzi un numero di puntatori pari al numero di array.

Riepilogando. Se ipotizziamo di avere 4 canali analogici e 10 letture avremo:

anal_arr1[10] ==> pnt_arr1--->0

anal_arr2[10] ==> pnt_arr2--->0

anal_arr3[10] ==> pnt_arr3--->0

anal_arr4[10] ==> pnt_arr4--->0

cnt = 10

flg_prima_media = falso

Ad ogni lettura memorizzi il valore di A/D nell'array corrispondente, incrementi il puntatore.

Dopo aver letto il 4.o canale decrementi il contatore; se il contatore è >0 e flg_prima_media = falso esci da OB35.

Quando cnt = 0 per la prima volta fai la somma di ogni elemento di un array e dividi per 10 (ripetendo per tuti e 4). Il valore ottenuto è il valore medio delle prime 10 letture. Riporti a 10 il contatore, riporti a 0 i puntatori eflg_prima_media = vero.

Con flg_prima_media = vero, ad ogni fai la somma di ogni elemento di un array e dividi per 10.

Avendo riazzerato i puntatori vai a riscrivere le memorie, hai così creato uno stack circolare.

Ad ogni volta che cnt=0 ricarichi cnt e azzeri i puntatori.

Con questo metodo hai un primo ritardo di n (in questo caso 1"), poi ad ogni lettura aggiorni la media.,

Immagina, per esempio, di avere un canale sempre a 0 poi, a gradino, quel canale legge 10v e li mantiene costanti. La tua uscita passerà da 0 a 10v con una rampa pari a 1". Oppure immagina di avere uno spike di 10v solo per una lettura. L'uscita passerà da 0 a 0.1 e manterrà questo valore per un tempo pari a 10 letture (1").

Link al commento
Condividi su altri siti

Se vuoi una soluzione semplice e che non ha bisogno di variabili di appoggio dove archiviare le letture per poter calcolare il valore medio, usa il sistema proposto da "floppydisco":

Out= (K*out_Prec + In)/K+1

(Vedi post #6)

Semplice, impegna poche risorse, efficace.

Unica accortezza (anche questo già detto da "floppydisco"), per il calcolo devi usare tassativamente variabili in virgola mobile.

Link al commento
Condividi su altri siti

  • 4 weeks later...
zazzamatteofabio

Ciao a tutti ho provato il sistema proposto da Livio Orsini e con soddisfazione lo vedo girare.. Grazie!

Adesso provo la soluzione proposta da Floppydisco.. a presto

Link al commento
Condividi su altri siti

Buongiorno.

Avendo un problema molto analogo a zazzamatteofabio,ma con dei picchi molto piu bassi,ho pensato di utilizzare la soluzione proposta da batta e floppydisco.

Ho scritto due righe di codice,ma succede che la variabile OUTPUT anziché rimanere stabile si incrementa violentemente.

Ho postato il codice,in modo che potete vederlo e darmi un consiglio.

Codice

Grazie

Modificato: da mazzinga
Link al commento
Condividi su altri siti

in efetti se leggi tutto il post trovi anche questo:

Dove K è un fattore di filtro,

// fattore 0 = nessun filtro

// fattore 0,5= raggiunge il 98% dopo circa 4 cicli

// fattore 1 = raggiunge il 98% dopo circa 6 cicli

// fattore 50 = raggiunge il 98% dopo circa 200 cicli

Per tanto il tuo fattore è 1 per tanto 6 cicli di plc e se non hai un ciclo da 200-300ms è normale che l'uscita vari rapidamente,

giusto per fare due conti spiccioli spiccioli tempo ciclo 50 - 100ms per 6 fa 300 - 600ms a te le conclusioni.

In fine hai fatto un piccolo errore nel codice quello che hai scritto equivale a Out= ((K*out_Prec + In)/K)+1 e non è quella del post numero 6.

Modificato: da TravelMen
Link al commento
Condividi su altri siti

In fine hai fatto un piccolo errore nel codice quello che hai scritto equivale a Out= ((K*out_Prec + In)/K)+1 e non è quella del post numero 6.

Grazie hai ragione l'errore stava nell'interpretare la formula,ho fatto le modifiche e l'uscite non incrementa più rimane stabile.

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...