Vai al contenuto
PLC Forum


Sequenza In Tabella Fifo


marantz65

Messaggi consigliati

Buonasera a tutti e Buone Feste

purtroppo si lavora anche a Natale

ho un problemino con una tabella fifo, la tabella funziona correttamente, con una sequenza di ingressi diversi tra loro.

se leggo 2 volte consecutive lo stesso ingresso esce solo 1 volta.

come posso fare?

Marino

Link al commento
Condividi su altri siti


Dipende da come lo leggi. Se usi l'istruzione FIFO lo leggi una volta sola perchè il dato viene trasferito e cancellato.

Per leggere il medesimo dato piùvolte devi avvalerti della lettura tramite puntatore.

Link al commento
Condividi su altri siti

rettifico quanto scritto prima:

ogni volta che leggo un ingresso, compio un ciclo della durata di 10 secondi, al suo termine con l'istruzione fifo leggo l'ingresso successivo.

durante questo ciclo se va alto un diverso ingresso fifo lo legge correttamente, mentre se va alto lo stesso ingresso non lo legge.

riesco a fare leggere due volte consecutive lo stesso ingresso solo se aspetto la fine del ciclo di 10 secondi.

non vorrei buttare via tutto e ricominciare con un metodo diverso, anche perche ho problemi ad utilizzare un puntatore, avrei bisogno di vedere un esempio reale, con il manuale non riesco a capire se si comporta come la fifo o no, cioè quale istruzione usare per scrivere l'ingresso, quale per muovere il dato e quale per leggerlo.

Che sia alle prime armi lo sapete già.

Sempre debitore

Marino

Link al commento
Condividi su altri siti

Forse sono io che sto invecchiando ma non capisco quello che stai facendo o vorresti fare. Non capisco come tu possa leggere un ingresso con un'istruzione FIFO. Cosa fa l'istruzione FIFO te lo già spiegato nell'altra discussione.

Sempre nell'altra discussione ti ho detto chiaramente che se non studi il manuale con ordine non puoi pretendere di capire quello che stai facendo, soprattutto perchè sembra che timanchino le basi fondamentali di programmazione.

Prova a spiegare meglio quello che stai facendo. I riferimenti a come si usano i puntatori li trovi sul manuale, è inutile che ti copi la pagina del manuale che speiga come il 200 usa i puntatori.

Link al commento
Condividi su altri siti

Ciao,

secondo me dipende dal segnale di shift del fifo.

E' un ingresso reale (E) oppure è un bit d'appoggio (M,DB, ecc)?

sè è un'appoggio verifica il resto del programma, ho l'impressione che l'IN non segua lo stato logico che pensi.

Ciao e buone feste.

Link al commento
Condividi su altri siti

per Livio

certo che non sono un programmatore, mi sto calando in questa materia per problemi di lavoro.

le lacune informatiche mi sono ripromesso di colmarle studiando il linguaggio C, nel frattempo devo risolvere questo problema.

continuare a ripetermi che devo leggere un manuale privo per la maggior parte dei casi di esempi chiari, non mi aiuta, mi spiace se non appartengo alla sfera degli informatici, anche io quotidianamente devo spiegare ed istruire altre persone, ed è piacevole e comodo insegnare a chi capisce al volo, ma devo comunque spiegare e fare capire le cose a tutti, anche ai testoni (come me).

per Claudio

gli ingressi sono letti su un fronte positivo, con l'istruzione ADD_T_TBL e dopo l'esecuzione dell'istruzione fifo controllo il segnale uscito ed innesco il mio ciclo di 10 secondi.

Grazie a tutti voi per la pazienza

Link al commento
Condividi su altri siti

Giuseppe Signorella
per Livio

certo che non sono un programmatore, mi sto calando in questa materia per problemi di lavoro.

le lacune informatiche mi sono ripromesso di colmarle studiando il linguaggio C, nel frattempo devo risolvere questo problema.

continuare a ripetermi che devo leggere un manuale privo per la maggior parte dei casi di esempi chiari, non mi aiuta, mi spiace se non appartengo alla sfera degli informatici, anche io quotidianamente devo spiegare ed istruire altre persone, ed è piacevole e comodo insegnare a chi capisce al volo, ma devo comunque spiegare e fare capire le cose a tutti, anche ai testoni (come me).

Livio Orsini non ti sta rimproverando perché hai delle lacune in materia, ma ti sta incitando a colmarle.

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

continuare a ripetermi che devo leggere un manuale privo per la maggior parte dei casi di esempi chiari, non mi aiuta, mi spiace se non appartengo alla sfera degli informatici,

Purtroppo non c'è altro modo per venirne fuori.

Se ti copio la pagina del manuale, dove spiega come si usano in puntatori nel 200, non ti aiuto a capire ma perdo solo tempo.

Gli esempi sul manuale sono scarni ma sono abbastanza chiari (cosa invero strana per Siemens).

Anche per i concetti base della programmazione non è possiible che un'altra persona li conosca al posto tuo.

Purtroppo questa è la realtà. Si può aiutare una persona che sta imparando, indirizzandola su come e dove studiare, ma non ci si può sostituire alla medesima.

Anche se io risolvessi il tuo esercizio non ti avrei aiutato, perchè alla prossima volta saresti d'accapo.

Inoltre se vuoi un aiuto devi spiegare chiaramente cosa stai facendo e cosa non sai o non capisci, altrimenti non ti si può aiutare.

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

Grazie Livio per la pazienza

purtroppo due giorni sulle pagine dei puntatori non sono servite a gran che...

Se ti dovessi elencare quello che non capisco...

1 come inserire un dato nella tabella che deve essere letta attraverso il puntatore.

2 se devo solo memorizzare un numero (1,2,3, ecc,) perchè devo usare una word.

3 ammesso che si riesca poi a leggere il valore (numero ) nella cella puntata, come andare a leggere il successivo.

la tabella fifo che ho fatto funziona benino per quello che sto facendo, (non è un esercizio scolastico, stiamo costruendo un serie di impianti/automatismi che a breve verranno installati).

la tabella viene aggiornata continuamente con la lettura di 4 ingressi attraverso l'istruzione AD_T_TBL che memorizza un numero da 1 a 4 in VW300.

L'istruzione FIFO sposta il contenuto di VW300 in VW400 e, se ho ben capito, lo cancella

Poi leggo il dato in VW400 (LDW= VW400, 1) e a seconda del numero letto innesco un ciclo diverso della durata di 10-30 secondi durante i quali uno qualsiasi dei 4 ingressi può andare alto e quindi essere memorizzato.

Funziona tutto se gli ingressi sono sempre diversi, se due volte consecutive va alto lo stesso ingresso lo riesco a leggere solo 1 volta.

Riesco a leggerlo una seconda volta solo se attendo la fine del ciclo.

Sono riuscito ad ingannare la cosa memorizzando un secondo ingresso in parallelo, che va alto solo durante il ciclo, con un numero differente, ma la cosa mi sembra un artificio e non mi piace, in alcuni casi potrebbe non funzionare.

Quello che vi sto chiedendo non è la soluzione, ma un esempio concreto dal quale trarre spunto.

Nel manuale la FIFO è spiegata bene (almeno per me) mentre le altre soluzioni che mi avete suggerito non lo sono (sempre secondo me).

Sono nelle condizioni di non avere tutto il tempo che vorrei per mettermi a studiare, cosa che comunque mi sono ripromesso di fare, e questo so benissimo non essere un vostro problema.

Se mi spiego male mi spiace, sono anche disposto se vi interessa a mandarvi il file sul quale sto lavorando

Grazie a tutti voi e Buone Feste

Link al commento
Condividi su altri siti

Giuseppe Signorella
Funziona tutto se gli ingressi sono sempre diversi, se due volte consecutive va alto lo stesso ingresso lo riesco a leggere solo 1 volta.

Riesco a leggerlo una seconda volta solo se attendo la fine del ciclo.

Quale ciclo? Quello di lavorazione associato all'ingresso?

Da ciò che scrivi, lasci comprendere che il problema non sia da ricercarsi nella tua tabella FIFO o non so cosa tu abbia fatto, ma in un qualche evento che avviene durante il ciclo di lavorazione. Un po come se tu leggessi il dato, ma visto ch'è già in lavorazione lo perdi perché non puoi rimetterlo in lavorazione.

Se hai utilizzato l'istruzione FIFO come ha detto Livio Orsini, il dato viene letto e poi cancellato. Se tu leggi un valore differente, probabilmente attivi una lavorazione differente e quindi va tutto bene. Ma se leggi il dato di una lavorazione già in corso, e dopo la lettura il dato viene cancellato dalla FIFO, tu lo hai perso, se non ti preoccupi di (mantenerlo).

Nel manuale la FIFO è spiegata bene (almeno per me) mentre le altre soluzioni che mi avete suggerito non lo sono (sempre secondo me).

Se il numero degli eventi da memorizzare non è elevato, e sai manipolare le stringhe, ti avevo suggerito una soluzione davvero semplice da realizzare ed efficace. Se non è chiara te la spiego più dettagliatamente.

4 ingressi associati a 4 fronti di salita e/o discesa che muovono rispettivamente una lettera e/o un numero di tipo char in una variabile. (unica per tutti e 4 gli ingressi (ovviamente se non hai più ingressi che vanno alti in contemporanea). Hai una stringa che ti leggi la lunghezza (LEN) la metti in una variabile e fai lunghezza + 1 ("se la lunghezza è 0 fai + 1 ed avrai 1"; "se la lunghezza è 1 fai + 1 ed avrai 2"; "se la lunghezza è 4 fai + 1 ed avrai 5" ecc ecc) questa è la posizione in cui andrai ad inserire la nuova char.

Per leggere è ancora più semplice: tu dovrai sempre leggerti la posizione del primo carattere. poi ti accorci la stringa di un carattere (il primo).

Ovviamente esegui questa operazione (accorcia) solo dopo aver messo in lavorazione il ciclo corrispondente, altrimenti ti succede la stessa cosa di sopra.

Non la vedo tanto difficile.

Ciao

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

Funziona tutto se gli ingressi sono sempre diversi, se due volte consecutive va alto lo stesso ingresso lo riesco a leggere solo 1 volta.

Riesco a leggerlo una seconda volta solo se attendo la fine del ciclo.

Qui proprio si entra nella capacità di programmazione intesa non nel sapere usare le istruzioni, ma nel prepare la miglior strategia per risolvere un problema fisico.

Per prima cosa devi tener conto di ogni volta che l'ingresso va alto e far eseguire il programma relativo ogni volta che l'ingrsso ha effettuato una transizione da basso ad alto?

Se è così credeo che dovrai rivedere la tua strategia generale.

Per prima cosa cosa fa il programma che dura 10" - 30" ? E' inammissibile che il PLC, ma qualsiasi altro strumento, entri in un programma che duri un'enormità di tempo senza uscirne mai. Per un sistema normale un programma che dura 50 ms ha una durata pericolosa. Se un'intero ciclo di PLC durasse un tempo di quest'ordine di grandezza, dovrebbe intervernire l'allarme di watch dog!

Per prima cosa spiega cosa fa questo accidenti di programma e vediamo di organizzarlo in modo umano, poi affrontiamo anche il discorso de riconoscimenti ripetuti degli ingressi.

come inserire un dato nella tabella che deve essere letta attraverso il puntatore.

Tramite il puntatore.

Immagina di avere una tabella (vettore, matrice) di 10 righe ed una colonna, poniamo che la tabella inizi con la byte200 e termini con la byte 209.

Come puntatore puoi usare uno dei rigistri accumulatori, per comodità usiamo VD300 come puntatore, il puntatore è sempre un Doppia word!

Nella sub di inizializzazione del programma dovremo inizializzare il puntatore, quindi memorizzamo in VD300 l'indirizzo di inizio.

	   MOVD   &VB200, VD300 
il simbolo "&" che precede la variabile indica, in tutti i linguaggi che ammettono questa notazione, che si tratta non di un valore ma di un indirizzo, quindi VD300 contiene ora l'indirizzo della prima locazione della tabella (vettore, matrice). Ora nel programma applicativo andiamo a memorizzare nella tabella un valore, non so in quele cella e non mi interessa, interessa che sia memorizzato nella prima cella libera. Per fare questo devo conoscere dove ho il dato da memorizzare; per comodità ammettiamo sia una costante: 25.

				   MOVB 25, *VD300

				   INC VD300

Le due istruzioni precedenti memorizzano la costante 25 nell byte di memoruia indirizzato dal contenuto della Dword 300. L'operatore "*" se precede un indirizzo non è operatore di moltiplicazione ma di puntatore ad una memoria. L'instruzione INC incrementa di uno il valore del contenuto di VD300, così il puntatore punta già alla prossima cella. Se le celle invece che di dimensioni di un Byte vossero di una Vord dovresti incrementare di 2 e di 4 se fosse una doppia word.

Se hai limitato la tabella (vettore, matrice) ad una grandezza prestabilita dovrai effetture un test per verificare che il puntatore non abbia superato il limite della pila.

Non ti scrivo come fare, lascio che sia tu a capirlo; così come non tispiego come fare a leggere un elemento della tabella: dovresti capirlo ragionando su come si esegue la scrittura.

se devo solo memorizzare un numero (1,2,3, ecc,) perchè devo usare una word.

Dipende da come rganizzi la tabella (vettore, matrice); la dimensione minima è il byte.

Se mi spiego male mi spiace, sono anche disposto se vi interessa a mandarvi il file sul quale sto lavorando

No! Niente codice. Devi imparare ad esprimerti correttamente e chiaramente. Quando riuscirai a spiegare in modo chiaro e conciso quello che vuoi ottenere, come lo fai e l'eventuale difetto che riscontri, significa che avrai imparato come si ragiona per programamre. Imparare a ragionare è la base della programamzione, altrimenti sarai sempre un poveraccio che cerca di far girare i programmi a mazzate. Purtroppo una buona parte dei programamtori di PLC si comporta in questo modo. :angry::toobad:

Link al commento
Condividi su altri siti

Non finirò mai di ringraziarvi

prima di smontare il tutto però cerco di spiegarvi cosa stiamo facendo:

1- da 4 linee diverse arrivano pezzi di diverso taglio che convergono in un unico punto.

2- con lo stesso ordine di entrata devono uscire, seguendo 4 strade diverse.

3- possono arrivarne 2 consecutivamente dalla stessa linea.

4- quello che chiamo ciclo è la durata del trattamento che subiscono prima di prendere la via in uscita, che dura dai 10 ai 30 secondi circa.

5- i differenti ingressi letti determinano i diversi cicli (1,2,3 o 4)

io ad ogni ingresso memorizzo con l'istruzione ADD_T_TBL i numeri da 1 a 4 in vw300.

con l'istruzione fifo sposto vw300 in vw400 e ne leggo il valore.

se vw400=1 attivo ciclo 1, se vw400=2 attivo ciclo 2 e cosi via.

la lettura di vw400 viene fatta ad ogni termine ciclo e temporizzata ogni 3 secondi se non ci sono cicli in atto

Vi ringrazio per la vostra pazienza

Marino

Link al commento
Condividi su altri siti

Il tuo problema si potrebbe risolvere senza costruzione di tabelleFiFo, però se per te è più semplice seguiamo pure questa filosofia

Per prima cosa gli ingressi andranno memorizzati solo quando avviene una transizione 0==>1, quindi devi usare l'istruzioneche legge il fronte di salita (EU) dell'ingresso.

Ad ogni transizione riconosciuta inserisci il codice corrispondente all'ingresso in un elemento della tabella.

Hai 4 trattamenti differenti che puoi effettuare in funzione del tipo di pezzo entrato.

Ti crei 4 subroutines che gestiscono i 4 trattamenti differenti. Nelle sub non deve esserci assolutamente alcun ciclo di attesa o altro che ne prolunghi l'esecuzione. Il programma entra ed esce compiendo le operazioni possibili dalla stato attuale e saltando quelle già effettuate o che non possono essere esguite.

Assegni 4 merkers ai 4 flags che indicano se le soubroutines sono attive o no.

Con l'istruzione FIFo leggi il primo elemento della tabella, verifichi che il flag della sub corrispondente a quel pezzo non sia in esecuzione, se il flag è basso lo alzi e leggi un altro elemento della tabella. Se il flag è alto significa che stai già lavorando con quel tipo di pezzo., alzi un flag che sospende l'analisi della tabella. Questo flag sarà abbassato quando il flag della subroutine corrispondente al codice contenuto nella memoria di uscita della tabella (DATA) segnalerà che è terminato il programam di trattamento.

Nel programma main chiami le subroutines corrispondenti ai flags alzati.

Ci saranno sicuramente cose che non ti sono chiare, altra cose trascurate, problemi di esecuzione non considerati perchè questo è lo scheletro generale del programma, la strategia di base.

Ora tu analizza e confronta, poi chiedi chiarimenti.

Link al commento
Condividi su altri siti

l'uso delle sub è fondamentale per almeno 2 motivi:

  • Facilità di messa a punto e debugging
  • Facilità di manutenzione dei programmi.

Immagina di dover modificare uno dei cicli di trattamento. Riscrivi o modifichi solo la sub interessata, senza toccare il resto del programma.

Nel caso del 200, che ha un'organizzazione software all'america che io prefirisco a quella tedesca dello step 7, nel Main ci devo essere solo le scelte ed i controlli di base per richiamare le varie sub specifiche. Secondo una regola empirica un main più lungo di circa 50 righe è un errore ed il programam è amle organizzato.

Anche usando step7 si usa OB1 come main che richiama i vari FB e FC, oltre alle eventuali FS. Gli altri OB dovrebbero essere dedicati a funzioni ben precise legate allo Hw.

Link al commento
Condividi su altri siti

Grazie Livio

non avendo mai usato le subroutine devo imparare a gestirle.

domanda 1: posso attivare in una sub un timer TOF utilizzando un merker settato nel main? se si come?

domanda 2: posso settare un merker nel main e resettarlo in una sub? (domanda intrinseca nella prima)

domanda 3: ho letto che non serve l'istruzione RET o END di una sub, viene messa in automatico dal programma, è vero?

in pratica mi sono arenato all'ingresso nella sub, non riesco a far partire un timer e di conseguenza non riesco a proseguire con il ciclo.

certo che sarebbe molto più semplice la gestione separando i 4 cicli (hanno tempistiche diverse tra loro), con l'attuale programma (tutto nel Main)siamo a 43 righe e non è ancora finito

Grazie

Marino

Link al commento
Condividi su altri siti

Buon Anno Nuovo

sono riuscito (momentaneamente con 2 ingressi) a rifare il tutto, ma ho alcuni dubbi.

dubbio 1: all'ingresso in una sub devo attivare un timer TOF, non avendo nessun evento da usare l'unico espediente che ho trovato è usare il merker sm0.6 che da un impulso ad ogni ciclo. esiste un altro metodo per attivare il timer?

dubbio 2: dopo il passaggio da stop a run o all'accensione del plc, al primo ingresso in una sub il primo timer TOF si attiva mentre il secondo timer, attivato subito dal contatto del primo su un fronte di salita non si attiva, mentre dal secondo ingresso nella sub in poi tutto fila liscio. non capisco come mai. potrebbe essere l'impiego iniziale del sm0.6?

Grazie a tutti voi

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