Vai al contenuto
PLC Forum


Conteggio Pezzi Con Shift Registro


Stef U.

Messaggi consigliati

Ciao a tutti! Dopo aver letto discussione riguardo allo "shift" di bit utilizzati come registro mi son messo al lavoro per sostituire un complesso (e poco efficiente) sistema di contatori in una mia applicazione con cpu 1212c ac/dc/rly.

In pratica il sistema è questo: Mi trovo alla fine di un nastro trasportatore a rulli dove i pezzi sono quindi in posizioni ben precise. Gli ultimi 3, nel caso in cui siano veramente 3, devono essere prelevati da un pick&place. La lettura dei pezzi viene fatta da una fibra posizionata nella stazione prima delle ultime tre, quindi una quarta stazione. Inoltre dispongo di un segnale di "transizione nastro" che esce dal plc del nastro.

Registri non ne ho mai fatti, ma credo che un registro di 4 bit (1 se c'è il pezzo, 0 se c'è un buco) dovrebbe fare al caso mio. Scrivo in posizione 3, con il segnale dalla fibra, e "shifto" con il segnale di traslazione del nastro.

Ho fatto prove su prove ma non riesco a far funzionare niente di niente. Mi sono riletto piu volte il manuale e la guida il linea del TIA ma non capisco di che funzioni ho bisogno per fare quello di cui ho bisogno.

Per creare il registro di 4 bit, come conviene procedere? un array di bool?

Per traslare il registro uso SHR/SHL? Ma in IN e OUT posso indicare la stessa "variabile"?

Abbiate pazienza, sono molto confuso, sono tre giorni che ci sbatto la testa e non riesco a venirne a capo!

Grazie in anticipo per le risposte ;)

Stefano

Modificato: da Stef U.
Link al commento
Condividi su altri siti


Stamattina ho capito che con un Array bool (0...3) non posso utilizzare la funzione SHR.

Se usassi invece un byte (con cui potrei usare senza problemi SHR), è possibile scrivere un singolo bit, quando la fibra mi segnala la presenza del pezzo?

Credo di si, con <DB>.<variabile>.x<n_bit>, ma mi viene viene segnalato errore. :wacko:

Mi sfugge qualcosa

Link al commento
Condividi su altri siti

Giuseppe Signorella

se c'è il pezzo, 0 se c'è un buco

Facciamo un esempio pratico.

( Con un fattore di contemporaneità di una sola stazione che lavora)

Ipotizziamo di avere 8 stazioni di lavorazioni. Assegniamo ad ogni bit di un byte lo stato di lavorazione di ogni singola stazione. Nel senso che quella singola stazione dovrà effettuare o meno la lavorazione in funzione allo stato del relativo bit.

Bit a zero non effettuare la lavorazione

Bit a uno effettua la lavorazione.

Nel vostro programma, (e sapete voi come fare) decidete se, come e quando dare il via alla sequenza.

Ad inizio programma ci ritroviamo una sequenza nel byte con tutti i bit a zero (0x00) “0000000000”

Il primo bit di destra viene portato ad 1, (00000001) quindi la prima stazione di lavorazione avvia il processo. A fine lavorazione, si fa uno Shift verso sinistra di un posto. Vi ritroverete che il primo bit di destra diventa zero e il secondo passa ad 1 (000000010), quindi abbiamo dato l’OK al processo di lavorazione alla seconda stazione. Terminata la seconda stazione, si effettua di nuovo uno shift di un bit, e d abbiamo il terzo bit ad 1 (00000100) e quindi diamo il via alla terza stazione.

Il ciclo si ripete per n volte fino alla fine.

Ipotizziamo ora un fattore di contemporaneità di 8 stazioni, se volessimo che tutte ed 8 le stazioni debbano lavorare in contemporanea dovremmo avere tutti ed 8 bit ad 1 (0xFF) “11111111”

Se ipotizziamo ora che durante il di processo un pezzo è venuto a mancare, potremmo ritrovarci una situazione di questo tipo

Primo bit di dx a 0 (11111110) La prima stazione si ferma e tutte le altre lavorano.

Facciamo uno shift verso sx nel frattempo viene caricato un nuovo pezzo

Ci ritroviamo la seguente condizione: secondo bit di dx a zero quindi seconda stazione non lavora e tutte le altre si, compresa la prima. (11111101)

Se rifacciamo n shift verso sx, avremmo sempre la stazione nel quale manca il pezzo che non lavorerà.

L’esempio può essere applicato anche ad un numero di stazioni di lavoro maggiori o minori.

Spero che l’esempio sia chiaro.

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

Grazie mille Giuseppe dell'esempio chiarissimo :thumb_yello: il funzionamento a livello teorico è chiarissimo, i problemi come ho accennato del messaggio precedente sono a livello pratico. Mi spiego meglio.

Il primo bit di destra viene portato ad 1

Ecco, come faccio a puntare al primo bit per portarlo a 1?

si fa uno Shift verso sinistra di un posto

Utilizzando la funzione SHL? Se la risposta è si, in IN e OUT posso mettere la stessa variabile, oppure devo utilizzare in OUT una variabile di "appoggio"?

Spero di essermi spiegato ;)

Link al commento
Condividi su altri siti

Giuseppe Signorella

Si, puoi utilizzare tranquillamente la medesima variabile sia in ingresso che in uscita, anzi io te lo consiglio. Devi fare solo attenzione affinchè l'istruzione di shift, sia "condizionata" (eseguita solo quando necessita). ;) .

Per accedere hai singoli bit, puoi utilizzare uno dei seguenti modi:

1) Leggi il valore del byte, e ci sommi il "peso" del bit che devi portare ad 1. (E' la soluzione che io preferisco in questo caso).

2) Ti crei una variabile in un BD con indirizzamento assoluto (non simbolico) e punti direttamente al singolo bit. (Ti consiglio di effettuare una compilazione del blocco dopo esserti creato le variabili, in modo che siano visibili le aree di memoria (indirizzi) assegnati alle rispettive variabili.

Ciao

Link al commento
Condividi su altri siti

Fai OR con 0000.0001 o, se preferisci con 01h

Grazie Livio per la risposta! Ma ho un dubbio: il punto dopo i primi quattro 0 è necessario?

Giuseppe, grazie di nuovo per la spiegazione :thumb_yello: Quando dici:

Leggi il valore del byte, e ci sommi il "peso" del bit che devi portare ad 1. (E' la soluzione che io preferisco in questo caso).

Intendi, con il blocco ADD, sommare per esempio 00000001?

Devi fare solo attenzione affinchè l'istruzione di shift, sia "condizionata" (eseguita solo quando necessita).

Credo anche di aver capito, grazie a questa frase, perchè i primi registri che ho scritto non funzionavano. Lo shift era condizionato solamente dalla variabile bool "traslazione_nastro", che restava settata a 1 per circa 1 secondo. Quindi la traslazione andava a buon fine ma veniva eseguita diverse volte consecutive, svuotandomi il registro. :thumbdown: errore mio.

Interrogando il fronte di salita della stessa variabile il problema dovrebbe essere risolto, giusto?

Come sempre avete chiarito ogni mio dubbio :clap:

Link al commento
Condividi su altri siti

il punto dopo i primi quattro 0 è necessario?

Perbacco! E' solo un separatore per migliorare la leggibilità. Dovrebbe essere chiaro, o no? ;)

Link al commento
Condividi su altri siti

Ho avuto un attimo di tempo e sono riuscito a modificare il programma seguendo i vostri consigli e sono felice di dirvi che funziona a meraviglia :thumb_yello:

Grazie mille a tutti ;)

Stefano

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