Vai al contenuto
PLC Forum


Memorizzazione Di Ingressi


marantz65

Messaggi consigliati

buonasera a tutti

dovrei memorizzare 3 diversi ingressi che possono andare alti a caso e poterli leggere ciclicamente per poi comportarmi di conseguenza. Devo anche resettarli uno alla volta dopo averlo letto. come posso fare? devo usare merker interni?

Grazie a tutti voi per l'aiuto.

Link al commento
Condividi su altri siti


scusate se ho scritto in due zone diverse del forum, ma non sono riuscito a cancellare il post.

devo memorizzare tre ingressi per poi in un secondo tempo sapere quale è andato alto per primo e per secondo, ecc.

il reset lo devo fare dopo averlo letto.

il set e reset mi riesce con i merker, ma non riesco a capire come leggere il primo che è andato alto.

spero di non venire caz***** se faccio domande

grazie a tutti voi per la pazienza che mi riserverete

**

forse meglio: disapprovato, sgridato, ripreso, richiamato, ammonito

Modificato: da Livio Migliaresi
Link al commento
Condividi su altri siti

Ciao,

E' pù facile a farlo che a spiegarlo, credimi è una cosa molto semplice (se ho capito bene) prova a sforzarti di fare 4 righe di programma.

Prova e riprova il tuo programmino e cerca di trovare cosa hai sbagliato.

Ti assicuro che avrai molta più soddisfazione se riuscirai a arrivarci da solo, piuttosto che ti venga detto in questo forum per filo e per segno come fare. E comunque fare uno sforzo per cercare di risolvere un problema è il minimo visto che per il nostro lavoro sono sforzi e bestemmie per tutta la vita.

;)

Link al commento
Condividi su altri siti

Dimenticavo :

in tanti anni di questo lavoro, so chem, se non ragioni come il plc i nostri programmi non funzioneranno mai!

Lo dico sempre ai nuovi colleghi freschi di scuola : "se voui che i tui programmi funzionino, inizia a ragionare come ragione il controllore(PLC), se continui a vedere il processo con la tuo modo umano di pensare stai sicuro che non andra una mazza!"

Il PLC ragiona cosi :

INIZIO

Si fa un esame di coscienza e vede se sta bene (VERIFICA L'HARDWARE)

Si guarda intorno e fa pure una fotografia (FA L'IMMAGINE DEGLI INGRESSI,fotografa lo stato degli INPUT e poi per tutta l'elaborazione del programma gurderà questa foto e basta)

Ci pensa un po' per vedere che deve fare, (elabora il programma (swap cycle)

Se nel frattempo succede un'imprevisto, sospende il pensiero (swap cycle) e va a fare il nuovo evento, quando ha finito torna a quello che stava facendo priama (interrupt di proceso, schedulazioni orologio errori di programmazione ecc...ecc)

Ha finito di pensa ora pu eseguire e decidere cosa muovere, braccia gambe ecc. (AGGIORNA LE USCITE FISICHE DEL PLC)

A quato punto tona all' INIZIO

Link al commento
Condividi su altri siti

Aspetta un'attimo,

ma se de vi fare un FIFO?? ovvere il primo che entra è il primo ad uscire....

Tipo luci di supercar ma solo in una direzione???

Bhe se io fossi in te usere un l'istruzione SHIFT-REGISTER, ogni plc dovrebbe averla!

La soluzione pù elegante senza fare tante righe di codice.

Link al commento
Condividi su altri siti

Il FiFo è una coda circolare, se ragioni su questo hai la soluzione fatta.

Usi un puntatore; ogni volta che memorizzi un elemento del vettore incrementi il puntatore, quando sei arrivato a memorizzare l'ennesimo elemento del vettore non incrementi ma riscrivi l'indirizzo di partenza, così il primo elemento entrato è il primo ad uscire.

Link al commento
Condividi su altri siti

grazie Livio

ho costruito la tabella come da manuale ma se non riesco a capire come scriverci e leggerci non andrò avanti.

per scrivere 5 diversi ingressi devo utilizzare 5 box AD_T_TBL ?

come faccio a leggerli?

il manuale cita esempi con dati composti da 4 numeri tipo 5431 8942 1234 cosa significano?

io devo solo leggere dalla tabella l'ingresso che ho memorizzato.

molti di voi mi hanno spronato a tentare, e praticamente da solo ho realizzato un impianto che stiamo costruendo.

adesso mi sono arenato su questa cavolo di tabella.

sto cercando di pensare ad un altro modo ma mi piace l'idea del fifo.

qualche altro piccolo input grazie

Link al commento
Condividi su altri siti

Puoi fare ciò che chiedi in diversi modi,

Ad esempio se la tua CPU ha il modulo rtc, leggere l'ora ogni qual volta un ingresso va alto e fare poi un confronto.

Un metodo molto semplice, a mio personale giudizio è quello di crearti una pila nel quale inserisci in sequenza l'ingresso che è andato alto.

Mi spiego meglio, puoi crearti un array, o una stringa o qualunque altra cosa che ritieni più idonea. Assegna ad ogni ingresso un valore.

(es. I0.0 =1; I0.1=2; I0.2=3) Un ingresso va alto e leggi la tua stringa, se il primo valore è 0 lo sostituisci con il numero corrispondente dell'ingresso che è andato alto. Va alto un altro ingresso? leggi la tua stringa, vedi che il primo valore è diverso da zero ed accodi ad esso il valore dell'ingresso che è andato alto, ripeti l'operazione tutte le volte che vuoi. In tal modo ti ritrovera una pila di numeri così composta 2133212322232.

Da qui sai che il primo ingresso andato alto è sto I0.1, il secondo I0.0, il terzo I0.2 il quarto sempre I0.2 ecc.

Ogni volta che fai un reset di una lettura o metti tutto a zero, o se resetti il primo ingresso che è andato alto sposti di una posizione tutta la stringa, in modo che il secondo valore prenda il posto del primo.

Non so se è chiaro ciò che intendo dire, ma è più semplice da fare che da spiegare.

Modificato: da baltimora
Link al commento
Condividi su altri siti

ho fatto una tabella fifo come da manuale, che spero registri i miei ingressi, purtroppo dopo 3 giorni che ci sbatto la testa sia sul manuale di Bergamaschi che sul manuale siemens non riesco a trovare come leggervi il primo dato entrato. Vorrei provare ad utilizzare in alternativa un registro di scorrimento, ma si dilungano a spiegare come fare scorrere i dati, tralasciando come inserirli e come leggerli.

aiuto

Link al commento
Condividi su altri siti

Se posso consigliarti ,

lascia stare il FIFO , puoi fare una cosa molto piu' semplice solo utilizzando dei merker

abbina 3 bit per ogni ingresso ( esempio M10.1 , M10.2 e M10.3 per l'ingresso 1 - M20.1 , M20.2 2 M20.3 per l'ingresso 2 - M30.1 M30.2 M30.3 per l'ingresso 3)

se l'ingresso 1 va' alto , controlla che M20.1 e M30.1 siano bassi quindi setta M10.1 e cosi via.

alla fine avrai alti 3 bit e saprai la sequenza di quale ingresso e' salito prima

Ciao

Link al commento
Condividi su altri siti

Grazie Luca

ci ho provato ma non funziona, io devo continuamente leggerli e resettarli uno alla volta, rispettando l'ordine con cui vanno alti.

aiuto non ci riesco

Link al commento
Condividi su altri siti

lascia stare il FIFO , puoi fare una cosa molto piu' semplice solo utilizzando dei merker

abbina 3 bit per ogni ingresso ( esempio M10.1 , M10.2 e M10.3 per l'ingresso 1 - M20.1 , M20.2 2 M20.3 per l'ingresso 2 - M30.1 M30.2 M30.3 per l'ingresso 3)

se l'ingresso 1 va' alto , controlla che M20.1 e M30.1 siano bassi quindi setta M10.1 e cosi via.

Questo sistema è funzionale, ma solo se poi resetti in contemporanea tutti e tre i bit, se lo fai singolarmente, devi attendere che vengano resettati comunque tutti e tre prima di poterlo riutilizzare.

io devo continuamente leggerli e resettarli uno alla volta, rispettando l'ordine con cui vanno alti.

Per fare ciò che chiedi, ti consiglio di provare il sistema che ti ho indicato nel mio precedente post. E' il più semplice è più funzionale

Un metodo molto semplice, a mio personale giudizio è quello di crearti una pila nel quale inserisci in sequenza l'ingresso che è andato alto.

Mi spiego meglio, puoi crearti un array, o una stringa o qualunque altra cosa che ritieni più idonea. Assegna ad ogni ingresso un valore.

(es. I0.0 =1; I0.1=2; I0.2=3) Un ingresso va alto e leggi la tua stringa, se il primo valore è 0 lo sostituisci con il numero corrispondente dell'ingresso che è andato alto. Va alto un altro ingresso? leggi la tua stringa, vedi che il primo valore è diverso da zero ed accodi ad esso il valore dell'ingresso che è andato alto, ripeti l'operazione tutte le volte che vuoi. In tal modo ti ritrovera una pila di numeri così composta 2133212322232.

Da qui sai che il primo ingresso andato alto è sto I0.1, il secondo I0.0, il terzo I0.2 il quarto sempre I0.2 ecc.

Ogni volta che fai un reset di una lettura o metti tutto a zero, o se resetti il primo ingresso che è andato alto sposti di una posizione tutta la stringa, in modo che il secondo valore prenda il posto del primo.

Non so se è chiaro ciò che intendo dire, ma è più semplice da fare che da spiegare.

Provaci, se stai utilizzando una CPU della serie S7 200 (avevi scritto il medesimo post nella sezione dedicata alla S7 200) ti verrà molto semplice farlo, hai tutte le istruzioni che ti necessitano.

Ciao

Modificato: da baltimora
Link al commento
Condividi su altri siti

grazie a tutti per le risposte,

non è la voglia che mi manca, ma essendo un autodidatta le uniche mie fonti attualmente sono il manuale ed il libro di Bergamaschi.

Entrambi non riportano un esempio finito ne di una tabella fifo ne di un registro a scorrimento, che se ho ben capito sono le due possibili soluzioni.

Avete qualche suggerimento per un altro testo che mi possa aiutare?

Ho un appuntamento a gennaio e mi manca solo questa parte per finire.

Grazie

Link al commento
Condividi su altri siti

Scusa ma è fondamentale il tipo di PLC che stai usando o che vorresti usare.

Con Siemens, anche con i piccoli S7-200, è un attimo fare un FIFO, con altri può essere più complesso; idem per i refistri a scorrimento.

Link al commento
Condividi su altri siti

Con S7-2xx ci sono istruzioni specifiche per operare su tabelle, comprese 2 istruzioni LIFO e FIFO; ci sono anche le istruzioni SR,SL, RR, RL che permetto di ruotare o fa scorrere i bits in un byte.

Tutto questo è ben spiegato nel manuale, manuale che andrebbe letto e studiato prima di "smanettare" sui programmi.

Link al commento
Condividi su altri siti

grazie per la risposta

il manuale ed il libro di Bergamaschi sono una lettura quotidiana che mi accompagna da mesi ormai.

Non chiedo che mi scriviate il programma.

Non riesco a capire come funzionano le tabelle.

Come può trasformare un ingresso in un byte.

Come andare a leggervi un dato, ecc.

Non sono uno sprovveduto, leggo e rileggo le pagine relative ai registri ed alle tabelle, ma non ne vengo a capo.

Chiedo solo degli input per proseguire.

Una sorta di imbeccata per capirci.

Grazie a tutti voi

Link al commento
Condividi su altri siti

un ingresso non lo puoi trasformare in un Byte, a meno di usare un byte di tutti 0 o tutti 1 tranne il bit in cui vuoi copiare l'ingresso.

Si possono leggere gli ingressi direttamente a bytes o a word, poi si testano i singoli bits per verificare lo stato dell'ingresso.

Non riesco a capire come funzionano le tabelle.

Le tabelle sono delle matrici, punto. Quindi valgono tutte le proprietà delle matrici. Questo dal punto di vista matematico.

Dal punto di vista logico non sono altro che aree di memoria a cui corrisponde un ben preciso indirizzo.

la tabella più semplice è quella che cossrisponde alla matrice unidimensuionale, cioè un elenco di elementii o, se preferisci, un vettore unidimensionale. Una tabella di n righe e una colonna; ad ogni riga corrisponderà una locazione di memoria se le n righe sono memorizzate in n celle adiacenti la puoi trattare, in lettura e scrittura, molto facilmente usando un puntatore alla memoria che incrementi e decrementi. Le celle possono essere larghe un bit, un byte, una word, una doppia word, etc.

Forse non riesci a spiegarti, ma non capisco cosa non capisci.

Probabilmente ti fa difetto la preparazione di base: algebra di bool e matematica. Il guaio grosso è che certi buchi o si riempono o visi incespica sempre. La scienza è come la natura: non ammette salti e scorciatoie.

Prova a fare delle domande precise e mirate su argomenti che non riesci ad affrontare o che ti bloccano.

Non è che non tisi voglia dare risposte, il fatto è che se non si capisce cosa ti confonde non è possiible darti le informazioni corrette.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Grazie Livio

forse è meglio andare per passi.

1) Devo leggere 5 differenti ingressi, che possono andare alti in qualsiasi momento, e memorizzarli in una tabella.

2) Leggere nella tabella quello che è andato alto per primo, e compiere un ciclo.

3) Leggere il successivo ingresso che è andato alto, compiere un secondo differente ciclo, e così via.

A ciascuno degli ingressi viene abbinato un ciclo diverso.

In qualsiasi momento durante un ciclo uno degli ingressi puo andare alto e se non è gia stato memorizzato occorre farlo.

Certo che sono agli inizi, e si vede,i miei studi di programmazione sono scolastici e di molti anni fa.

Purtroppo devo risolvere questo problema e fare funzionare questo automatismo.

La cosa sta funzionando, unico blocco è questa sorta di prenotazione in ingresso che non riesco a fare.

Grazie a tutti voi per la pazienza.

Marino

Link al commento
Condividi su altri siti

prepari un array di 5 elementi, sis preca un poco di memoria ma vien più facile.

Assegni un codice ad ogni ingresso

Nel main lanci la sub per leggere gli ingressi; se riconosci alto uno dei cinque ingressi vai a cercarcare il primo elemento vuoto del vettore e scrivi il codice corrispondente all'ingresso.

A seguire nel main ti fai il test del primo elemento del vettore, se non è vuoto conterrà un codice, con l'istruzione FIFO scali tutto di un posto nel vettore, poi lanci la sub correspondente all'ingresso che hai riconosciuto.

Questo è un modo per risolvere il tuo problema. Ce ne sono almeno altri 5 differenti, però i credo che questo sia il più semplice per una persona alle prime armi.

Link al commento
Condividi su altri siti

Grazie Livio ma abbi pazienza, non trovo un esempio di realizzazione di un array, tantomeno sul manuale.

Come assegno il valore di un ingresso andato alto?

Quale istruzione mi consente di andare a poi a leggerlo?

Se non vedo un esempio non capisco, mi spiace.

Il libro di Bergamaschi usa per esempio la funzione AD_T_TBL per inserire un dato in una tabella. Ma usa come dato VW100.

Cosa vuole dire, che devo usare 5 box per i 5 ingressi, il primo con VW100, il secondo con VW101, e così via?

Poi come andrò a leggerli?

Devo farli uscire uno alla volta con la istruzione FIFO?

Grazie

Marino

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