MABE Inserito: 31 gennaio 2014 Segnala Share Inserito: 31 gennaio 2014 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 More sharing options...
lelos Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
harl Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
Ctec Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
MABE Inserita: 31 gennaio 2014 Autore Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
lelos Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
lelos Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 scansioni l'analogica a 1 millisecondo o a mezzo/millisecondo raddoppiando la risoluzione?? Link al commento Condividi su altri siti More sharing options...
MABE Inserita: 31 gennaio 2014 Autore Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
Ctec Inserita: 31 gennaio 2014 Segnala Share Inserita: 31 gennaio 2014 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 More sharing options...
MABE Inserita: 1 febbraio 2014 Autore Segnala Share Inserita: 1 febbraio 2014 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 More sharing options...
Ctec Inserita: 1 febbraio 2014 Segnala Share Inserita: 1 febbraio 2014 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 More sharing options...
MABE Inserita: 2 febbraio 2014 Autore Segnala Share Inserita: 2 febbraio 2014 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 More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
MABE Inserita: 3 febbraio 2014 Autore Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 (modificato) 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: 3 febbraio 2014 da Ctec Link al commento Condividi su altri siti More sharing options...
MABE Inserita: 3 febbraio 2014 Autore Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
harl Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
lelos Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
MABE Inserita: 3 febbraio 2014 Autore Segnala Share Inserita: 3 febbraio 2014 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 More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 Ti rimando qui http://www.plcforum.it/f/topic/155167-puntatori-cx-programmer/ dove nella discussione cerco di spiegare l'uso dell'indirizzamento indiretto. Se usi tale indirizzamento, esiste la possibilità dell'auto incremento (,IRn+) o autodecremento (,IRn-). Link al commento Condividi su altri siti More sharing options...
MABE Inserita: 3 febbraio 2014 Autore Segnala Share Inserita: 3 febbraio 2014 Ok grazie cercherò di usare l'indirizzamento indiretto. Esiste un esempio applicativo molto semplice da cui prendere eventualmente spunto? Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 3 febbraio 2014 Segnala Share Inserita: 3 febbraio 2014 ehmmm.... Appena avrò tempo farò un tutorial... Link al commento Condividi su altri siti More sharing options...
MABE Inserita: 4 febbraio 2014 Autore Segnala Share Inserita: 4 febbraio 2014 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora