Vai al contenuto
PLC Forum


Analisi Segnale Analogico Plc Cj2M


MABE

Messaggi consigliati

Buongiorno a tutti

vi espongo il mio problema

PLC CJ2M CPU33 con MAD42

Devo monitorare tramite segnale analogico l’andamento della pressione in una camera.
La pressione in questo serbatoio cresce gradualmente, ad un certo punto però affinchè il collaudo sia corretto, deve esserci un brusco aumento di pressione (parliamo comunque di qualche decimo di bar), per poi ritornare a crescere gradualmente
La soluzione che io ho fatto prevede un loop
Al tempo T1 leggo la pressione P1
Al tempo T2 leggo la pressione P2
Se la differenza P2-P1 è superiore ad un certo limite è avvenuto il picco di pressione, se invece è inferiore non è avvenuto il picco, quindi viene ripetuto il loop.
Con questa soluzione io però non riesco a determinare esattamente il valore di pressione in cui parte il picco, ma un intervallo di pressione entro il quale è avvenuto il picco.

esiste un modo che mi permetta di leggere il valore della pressione nel momento in cui c'è il picco?

ad esempio:

fare campionamento con un tempo costante (1ms,10ms,100ms oppure 1 sec) dipenderà da quanto dura il processo, e salvare il dato di ogni campionamento su una DM e poi fare l'analisi del processo in un secondo momento.

Ma in questo caso come faccio fare un loop che mi incrementi di uno la Dm nella quale vado ad allocare il valore della pressione?

e poi da questa lista di DM, come faccio a determinare la DM, corrispondente alla pressione alla quale è partito il picco di pressione?

Ancora una cosa

alla macchina è collegato un pannello NS5: e' possibile visualizzare l'andamento della pressione in un grafico in cui in ascissa metto il tempo ed in ordinata la pressione?

Grazie in anticipo a chi mi può dare qualche dritta

Link al commento
Condividi su altri siti


ciao

hai già guardato i paramatri della mad42?


ci sono vari settaggi , tra quali il valore medio del campionamento e quanti farne , il valore di picco ,ecc....

Link al commento
Condividi su altri siti

io ho usato il comando max che legge il valore massimo tra vari valori e lo registro, quindi se ho capito bene facendo leggere sempre e poi impostando dei valori esempio se il valore tra p1 e p2 è maggiore di x fai il valore max, teoricamente se il valore tra p1 e p2 è maggiore di 10 attivi il comando max che tiene in memoria il valore massimo

Link al commento
Condividi su altri siti

Per fare un buffer come vuoi tu, con incremento automatico del puntatore alla cima dello stack, c'è l'istruzione PUSH, che inserisce un dato e automaticamente incrementa lo SP (stack pointer) al successivo.

Altrimenti te lo devi fare mediante l'uso dell'indirizzamento indiretto.

Poi su questi dati ci puoi fare quel che vuoi, come trovare il massimo (appunto la MAX), il minimo, ecc...

I dati devono essere a 16 bit (INT o UINT).

Se utilizzi le istruzioni "preconfezionate" (tipo PUSH, MAX, MIN, ecc...), queste lavorano su tutte le aree di memoria compreso le EM.

Essendo questa area di 32768 word ritentive non usate da nessun modulo specifico, può essere opportunamente usata come buffer di lettura.

Se effettui una lettura ogni 10ms, per esempio, avrai un buffer di almeno 327secondi (5m45s) con una buona risoluzione (100 campioni al secondo).


Per la creazione di grafici sullo NS5, c'è l'apposito oggetto Grafico a Linee.

Link al commento
Condividi su altri siti

Innanzitutto grazie per le risposte

il valore che io però devo determinare non è un max, ma è il valore per il quale c'è un rapido aumento di pressione, dopodichè la pressione torna a salire gradualmente

spero di avere allegato correttamente un grafico di esempio

Link al commento
Condividi su altri siti

ciao

non vedo il grafico.

per rapido aumento cosa intendi come valore numerico del plc?

che cambia dal valore precedente di 10-100 -1000 ?

il segnale analogico che ti dà lo strumento è stabile? altrimenti io campionerei in automatico e fare la media (sempre con le funzioni automatiche senza scrivere nessuna riga di programma).

Link al commento
Condividi su altri siti

cambia di circa 100 punti

ma se gli fai fare la media con le funzioni automatiche come faccio a stabilire il valore della pressione in cui ho questo picco?

scusate ma non riesco a inserire il grafico

Con le barrette traccio l'andamento della pressione

/ (fine prova)

/

I

I (inizio del picco di pressione)

/

/

/ (inizio prova)

io devo intercettare il valore della pressione quando c'è l'inizio del picco di crescita verticale, poi come vedete la pressione tende a salire ancora ma gradualmente

Link al commento
Condividi su altri siti

Se non devi elaborare in tempo reale, ti consiglio, come sopra, di registrare i dati nel buffer, poi, finita l'acquisizione e con tutti i dati a disposizione, fai le elaborazioni.

Dato il buffer, a questo punto, puoi trovare il valore massimo (la MAX ti dà il valore massimo oppure l'indirizzo del valore massimo, quindi il suo tempo dallo start).

Poi le altre elaborazioni le puoi fare sui valori precedentemente memorizzati (puoi calcolare le derivate, quindi l'andamento delle variazioni dei valori letti per individuare picchi, avvallamenti, ecc.), come evitare valori spurii che possono essere interpretati come falsi picchi (se la derivata, cioè la variazione dei valori è troppo alta, si scartano i dati).

Questa diventa un'elaborazione meramente matematica, ma hai tutto il tempo di farla (che so, prima fai una scansione per eliminare i falsi picchi, poi rilevi i punti di interesse, e così via).

Se gli eventi non sono di per se' rapidi (la pressione ha un basso gradiente), consiglio di campionare un po' meno frequentemente (ogni 10ms, per esempio) e di sfruttare il calcolo dei valori medi proprio dei moduli MAD per evitare spurie e false letture.

E' difficile da spiegare, devi implementare algoritmi matematici.

Link al commento
Condividi su altri siti

grazie ctec

credo che la tua soluzione sia la più corretta.

step1: creare il buffer di dati, e qui sono già in difficoltà.

non ho capito come si utilizza il comando PUSH, ho simulato ma non riesco a creare un buffer

Link al commento
Condividi su altri siti

Prima di poter usare le operazioni sullo stack (quali la PUSH), è necessario definire lo stack stesso.

Questo si fa mediante l'istruzione SSET. Necessita di due parametri, chiamati TB e N.

Il primo, definisce l'inizio dello stack. Le prime 4 word conterranno due parametri essenziali al suo funzionamento, ed è bene evitare di scriverci sopra liberamente.

Le prime due word contengono l'indirizzo (in formato interno) della word che costituisce la fine dello stack (End Of Stack).

Le seconde due word contengono l'indirizzo (in formato interno) della word che sarà occupata dal prossimo dato inserito tramite PUSH (Stack Pointer).

Dalla quinta word in poi, c'è il buffer vero e proprio con i dati eventualmente inseriti.

L'altro parametro N definisce la grandezza dello stack (quante word conterrà).

Pertanto l'occupazione totale di memoria dello stack sara di 4+N word.

Quando si effettua una PUSH, il dato in essa specificato viene inserito nella word puntata dallo Stack Pointer, dopodichè questo viene automaticamente incrementato di uno a puntare alla memoria successiva.

Attenzione che quando si definisce uno stack, solo le prime 4 word (EoS e SP) vengono scritte, mentre tutte le altre contengono i vecchi valori.

Per le operazioni di analisi dei dati, quindi, fare attenzione e usare l'indirizzamento indiretto (gli IR) per muoversi nello stack.

Per esempio, per vedere il contenuto dell'ultimo valore inserito, mettere in IRn l'indirizzo contenuto nello SP, sottrarre uno (punta al successivo, rammentate), leggere il contenuto della memoria puntata.

Non so se son stato chiarissimo...

Link al commento
Condividi su altri siti

Sono in difficolta'

In pratica ho fato un piccolo programmino di simulazione

Quando si alza il contatto 0.00 si attiva l'istruzione SSET dove ho messo come primo indirizzo di Stack D10 e come numero di canali &10

Quando si alza il contatto 0.01 si attiva l'istruzione PUSH, dove come primo indirizzo di Stack ho messo D10 e come canale di origine H0

Parto con la simulazione , metto a 1 il contatto0.00

Scrivo &17 nell canale H0

Metto a 1 il contatto 0.01

Vedo in D14 il valore &17

E qui entro in difficolta'

Le ho provate tutte ma non riesco a procedere con lo stack

Abbasso il contatto 0.01 e in D14 mi ritrovo 0

Scrivo &19 in H0, ma se alzo il contatto 0.01, mi ritrovo &19 in D14, mentre il valore precedente di H0 non lo vedo piu'.

Dove sbaglio?

Link al commento
Condividi su altri siti

Direi che l'errore sta nel non aver usato istruzioni impulsive.

Quando alzi 0.00, a ogni scansione ridefinisci lo stack (che quindi è come svuotato).

Se poi metti a uno 0.01, riempi lo stack in un istante (in 10 scansioni, per la precisione).

Ho simulato mettendo i tuoi dati, ma usando @SSET e @PUSH (impulso fronte positivo), e funziona tutto.

Oppure metti gli impulsi nei contatti 0.00 e 0.01, a tua scelta.

Link al commento
Condividi su altri siti

e' vero ora funziona.

una domanda ancora

supponiamo di avere nello stack i seguenti valori:

d14=19

d15=21

d16=23

d17=27

d18=29

d19=31

come faccio per determinare che il valore in cui è avvenuto il picco è 23?

Grazie ancora

Link al commento
Condividi su altri siti

Usi l'istruzione MAX. Ci metterai D14 come inizio area,

Se come sopra hai definito lo stack da 10 word, per esempio, e utilizzando D50 come control words, avrai

MAX D50 D14 D100

e in D100 avrai il valore massimo.

Nelle Control Word metterai:

D50 = numero di dati su cui effettuare il calcolo (non mettere tutto lo stack perchè vecchi valori potrebbero falsare il risultato)

D51 = bit 15 = 0 se valori in stack UINT, 1 se valori INT

bit 14 = 1 se vuoi avere l'indirizzo interno del valore massimo in IR0 (utile per poi fare altre elaborazioni, quali vedere i valori precedenti o successivi per analizzare le variazioni...)

Modificato: da Ctec
Link al commento
Condividi su altri siti

ma l'istruzione MAX mi trova il massimo valore nell'intervallo, quindi nel mio caso, mi trova 31

invece la mia necessità è che il PLC trovi il valori 23 che è quello per cui si verifica l'incremento rapido

Link al commento
Condividi su altri siti

D51 = bit 15 = 0 se valori in stack UINT, 1 se valori INT

bit 14 = 1 se vuoi avere l'indirizzo interno del valore massimo in IR0 (utile per poi fare altre elaborazioni, quali vedere i valori precedenti o successivi per analizzare le variazioni...)

questa mi interessa perchè involontariamente è stata usata ma mi deve essere scappata questa parte in parole povere ctec che vuol dire

Link al commento
Condividi su altri siti

Eh, per trovare quel che vuoi tu, cioè una variazione "repentina" non c'è una istruzione già fatta.

Ti dovrai fare una routine, magari una FB dove analizzi punto per punto i dati.

L'algoritmo, immagino, controllerà il valore al tempo n e lo confronta con il valore n-1 e se c'è una variazione maggiore di un valore preimpostato, allora prende quello come massimo.

Dovrai fare un ciclo che scansiona i valori e analizza i dati.

Link al commento
Condividi su altri siti

ciao

usa i puntatoti per spostarti nelle dm e confronta il valore attuale con quello successivo , se varia di un certa quantità che tu sai che significa picco , risali al valore.

Link al commento
Condividi su altri siti

Harl, cosa non ti è chiaro?

Il bit 15 semplicemente specifica se i valori hanno il segno o meno, cosa importante per una funzione che calcola massimi e minimi...

Il bit 14 è invece parecchio utile. In pratica, se attivo (bit14=1) oltre a restituire il valore massimo, mette in IR0 l'indirizzo del valore in tabella che corrisponde a questo massimo.

Molto utile per esempio per il lavoro del messaggio di prima a MABE. Se IR0 punta alla memoria del valore massimo, IR-1 punta al precedente e IR+1 al successivo, facilitando quindi calcoli su variazioni o potendo usarlo poi in una MOV indicizzata per spostare il valore da qualche altra parte.

Link al commento
Condividi su altri siti

si concordo devo fare un loop

che dovrebbe essere così:

parte il loop

confronto DM15 con DM14 se il valore è inferiore al limite L, rientro nel loop

confronto DM16 con DM15 se il valore è inferiore a L, rientro nel loop, se superiore allora ho raggiunto il picco.

Ma la domanda è questa esiste un comando che mi fa incrementare di una alla volta la DM, che devo usare per fare il confronto?

Link al commento
Condividi su altri siti

Allora ho fatto questa prova:

prima di tutto ho mosso D14 e D15 rispettivamente in IR0 e IR1

MOVR D14 IR0

MOVR D15 IR1

Faccio la differenza tra IR1 e IR0 e il risultato lo alloco in IR3

-(460) IR1 IR0 IR3

e qui il software mi da errore (motivo?).

comunque a questo punto vorrei fare il confronto tra IR3 ed un limite L, se inferiore rientro nel loop

Incremento di 1 le DM dicui fare la differenza

MOVR D14 IR0+

MOVR D15 IR0+

Rifaccio la differenza, risultato in IR3

e qui ho un altra domanda, se rientro nel loop, per incrementare nuovamente le IR, devo ripetere queste righe?

MOVR D14 IR0+

MOVR D15 IR0+

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