Vai al contenuto
PLC Forum


campionamento valori analogici


Fabio Di Fidio

Messaggi consigliati

Buongiorno a tutti, avrei necessità di campionare una serie di valori analogici acquisiti su un FX2n-2ad mitsubishi.

Utilizzo il comando  RD3A per acquisire il dato in tempo reale e riesco a visualizzarlo correttamente in gxworks2.

Il problema è che non so come fare per esempio a salvare i valori acquisiti nel buffer con una frequenza di campionamento (100ms per esempio) per estrapolare il valore massimo della serie. 

Potreste fornirmi un esempio? grazie saluti Fabio

Link al commento
Condividi su altri siti


Devi fare una lettura continua del valore di campionamento ad ogni scansione di programma e al limite trasferire il valore in una pila di dati FIFO e e ogni volta fare il confronto del valore letto con quello più alto registrato quindi sai il valore più alto, non è una funzione che puoi fare da espansione ma devi farla tu da programmazione PLC, mi sembra di ricordare che invece sia possibile tutto direttamente tramite i BFM dell'espansione superiore FX2N-4AD

Link al commento
Condividi su altri siti

Non ci sono funzioni interne per fare il lavoro. Ma dato che, da quel che capisco, fai un campione ogni tanto (100ms o più), fai il lavoro durante l'acquisizione. Mi spiego.

Al momento di partire con l'acquisizione parti azzerando un registro dove metterai il valore massimo, ad ogni arrivo di un campione, oltre che metterlo nel buffer, fai subito un confronto con il massimo salvato e, se maggiore, copiacelo. In questa maniera, al termine dell'acquisizione avrai immediatamente il valore massimo. Lo puoi fare ovviamente anche con il minimo.

Per casomai avere il valore medio della serie, usa poi (alla fine) l'istruzione MEAN.

Link al commento
Condividi su altri siti

Grazie per le risposte.

Quello che mi riesce difficile è proprio salvare il dato in una tabella in progressione per poi ottenere il valore medio.

Quindi campiono con una certa frequenza (so farlo), salvo il dato in una casella del buffer, ne salvo un altro, e cosi via fino ad arrivare a 20 (ne ignoro il metodo, avrei bisogno di un esempio), calcolo la media (con l'struzione Mean non dovrei avere problemi, ma non saprei come far prendere i valori dalla tabella). Purtroppo sono ancora agli inizi con Gxworks2.

Grazie per comprensione. 

Link al commento
Condividi su altri siti

Gx Work2? Siamo al 3 da anni, che PLC devi programmare un FX3 immagino o addirittura un FX2n? Con un FX3 va un po' meglio come istruzioni, comunque magari scaricati il manuale di programmazione, esiste dal 2006 anche quella in italiano con la descrizione delle varie istruzioni, per il tuo caso puoi usare l'istruzione WSFR che prende una pila di dati di n1 parole e ogni volta che esegui l'istruzione sposta di n2 parole la parola di dati che gli dai in ingresso, poi una volta fatto lo scorrimento di dati fai la media di tutte le n1 parole di dati facendone la media con l'istruzione MEAN. Ovviamente la media devi farla quando hai raggiunto un numero di valori che hai fatto scorrere corrispondente al numero di parole della pila di dati cioè n1 parole

Link al commento
Condividi su altri siti

 

6 minuti fa, Ctec ha scritto:

Domani sarò in sede, e magari ti faccio un semplice esempio, che va dappertutto.

grazie gentilissimo

 

Modificato: da Fabio Di Fidio
Link al commento
Condividi su altri siti

13 ore fa, leleviola ha scritto:

Gx Work2? Siamo al 3 da anni, che PLC devi programmare un FX3 immagino o addirittura un FX2n? Con un FX3 va un po' meglio come istruzioni, comunque magari scaricati il manuale di programmazione, esiste dal 2006 anche quella in italiano con la descrizione delle varie istruzioni, per il tuo caso puoi usare l'istruzione WSFR che prende una pila di dati di n1 parole e ogni volta che esegui l'istruzione sposta di n2 parole la parola di dati che gli dai in ingresso, poi una volta fatto lo scorrimento di dati fai la media di tutte le n1 parole di dati facendone la media con l'istruzione MEAN. Ovviamente la media devi farla quando hai raggiunto un numero di valori che hai fatto scorrere corrispondente al numero di parole della pila di dati cioè n1 parole

Sto programmando un FX3U con modulo aggiuntivo per letture analogiche: quindi comando rd3a k0 k1 d0 per leggere ogni tot millis e  sposto i dati acquisiti nel buffer per poi leggerli e fare operazioni aritmetiche. L'istruzione corretta è SFWR che scrive i dati raccolti in una serie con la possibilità di leggerli a posteriori con SFRD con puntatore.

Per caso con gx work3 c'è una funzione che permette di fare tutto in un colpo solo? Giusto perchè se è così lo installo subito!!!

Link al commento
Condividi su altri siti

Eccomi, fatto nella pausa.

Dato che non serve un FIFO, te prelevi n campioni di cui calcolerai media e limiti. Io quindi consiglio di usare un buffer normale, indicizzato.

Nell'esempio il buffer parte da D100 (purtroppo il GX non consente di usare gli indici variabili degli array, per cui come indice uso Z0) e dovrà essere lungo almeno tante word quanti sono i campioni da contenere.

image.png.53dca42711837dd3ed8791b5c13a93de.png

A parte le ovvie inizializzazioni, il bit Campiona metterà nel buffer il dato letto in Lettura, e incrementa il puntatore idx (Z0). Nel frattempo, salviamo anche il valore se è oltre i vecchi valori massimo e minimo. E questo è semplicemente la fase di riempimento del buffer.

Poi si provvederà a trovare il valore medio:

image.png.6da27bcbe7f7ef07d59daa65d9da8886.png

Qui al momento dell'attivazione di Calcola (che dovrà essere fatto al momento del termine del salvataggio dei campioni voluti), effettua l'inizializzazione dei dati che servono e poi esegue un loop (un passo a scansione) per calcolare il valore medio. Sono stati usate le operazioni in virgola mobile per gestire valori anche grandi (tanti campioni). Il valore ritornato in Medio è comunque un intero arrotondato per difetto.

Qui ti metto anche le variabili definite:

image.png.43024b803d79b3e4a86ac9d330576213.png

 

Scritto così funziona su qualsiasi PLC, purché abbia gli indici

 

Il GX3 non lo puoi usare con gli FX3, ma solo con gli FX5. Oggetti molto più performanti e flessibili.

Le funzioni usabili non dipendono mai dal sistema di programmazione, ma dal PLC in uso.

Link al commento
Condividi su altri siti

Se i campioni sono in un numero tale da esser sicuri che la loro somma rientri in un intero a 32bit, si può semplificare il calcolo così:

image.png.0c9955858411a7e48ab738ba5aeee48d.png

Mi piace poco perché non esistono le funzioni di conversione di tipo, per esempio qui sopra le prime due istruzioni servono a convertire un INT (16 bit) in un DINT (32bit), e il RisDiv addirittura sono due valori 32bit (divisione e resto) di cui prendiamo solo il valore basso (16 bit) del risultato divisione e lo mettiamo in Medio. Brutta cosa...

Link al commento
Condividi su altri siti

Che dire ti ringrazio per il tempo dedicatomi, in pratica l' applicazione richiede una volta sola un campionamento ogni100ms di 20 valori per determinare il massimo  registrato di un pezzo metallico di circa 70mm che passa sotto un sensore induttivo analogico (valori a 12 bit da 0 a 4095) . Una volta ottenuto,  tale valore servirà da punto di partenza per tutti gli altri che scorreranno di seguito. Non avendo mai lavorato con buffer e indici non avevo idea di come si potesse fare ed ora è tutto molto più chiaro. Vorrei comunque seguire anche l'altra via cioè quella del FIFO giusto per fare pratica anche con quella funzione (credo che ci sia meno codice da scrivere ma il risultato dovrebbe essere sempre quello). Grazie ancora saluti Fabio 

Link al commento
Condividi su altri siti

la cosa che non capisco nel tuo esempio è che  confronti la lettura con un minimo e un massimo noti (impostati nell' inizializzazione), o sbaglio? Io invece devo trovare il massimo tra i valori campionati. C' è qualcosa che mi sfugge?

Link al commento
Condividi su altri siti

Imposto il massimo iniziale a 0, e qualsiasi valore superiore verrà aggiornato. Per il minimo, si imposta il più grande valore intero positivo impostabile (32767), dato che sul FX3U non hai gli interi senza segno.

A ogni campionamento, si confronta il valore precedente (la prima campionatura con quello preimpostato) con quello letto, e se superiore al vecchio massimo, lo si aggiorna (vedi MOV dopo il confronto), e se inferiore al vecchio minimo, lo si aggiorna (vedi MOV dopo il confronto).

Alla fine dei campionamenti, avrai automaticamente il valore Massimo e Minimo di tutti quelli letti.

Link al commento
Condividi su altri siti

  • 6 months later...

Salve a tutti,  scusate per l'ora, tanti Auguri di Buona Pasqua a tutti, ho un problema che che da giorni mi assilla, è leggendo un po di tutto compreso manuali , video, schede tecniche. ho tanta confusione. Ma con la discussione che ho letto,      l'ho vista molto vicina al mio problema.Ho un pannello hmi mistsubischi gd2107 -w... con   , impostazione porta di comunicazione rs232, fx 19200 baude. D'altra parte ho un clone fx3u 32MT 232 38.4k e vedo anche un A+ B- rs485 come pin a parte. impostazione Gx work : ch1 7 even 1 standard 242 19200.  pin out gs2107 2 3 5. fx 2 3 5.  AIUTO !!!! quel tipo di clone ha bisogno di un convertitore per comunicare con il pannello hmi ?  collegando il cavo seriale alle porte 232 il collegamento non avviene.  un piccolo aiuto ve ne sarei grado. Grazie in anticipo 

Link al commento
Condividi su altri siti

  1. Nuovo utente chenon ha letto il regolamento, altrimenti non tisaresti accodatoad una discussione, ma ne avresti aperta una nuova.
  2. Dire clone è dire poco dovresti dare qualche indicazione in più su questo clone di PLC Mitsubishi

Buona Pasqua anche a te e, se vuoi, apri una nuova discussione.

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...