Stef U. Inserito: 20 gennaio 2014 Segnala Share Inserito: 20 gennaio 2014 (modificato) 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: 20 gennaio 2014 da Stef U. Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 20 gennaio 2014 Segnala Share Inserita: 20 gennaio 2014 Mi unisco all'interesse per questa discussione in quanto anch'io sto provando a 'shiftare' Link al commento Condividi su altri siti More sharing options...
Stef U. Inserita: 20 gennaio 2014 Autore Segnala Share Inserita: 20 gennaio 2014 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. Mi sfugge qualcosa Link al commento Condividi su altri siti More sharing options...
Giuseppe Signorella Inserita: 20 gennaio 2014 Segnala Share Inserita: 20 gennaio 2014 (modificato) 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: 20 gennaio 2014 da Giuseppe Signorella Link al commento Condividi su altri siti More sharing options...
Stef U. Inserita: 20 gennaio 2014 Autore Segnala Share Inserita: 20 gennaio 2014 Grazie mille Giuseppe dell'esempio chiarissimo 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 More sharing options...
Livio Orsini Inserita: 20 gennaio 2014 Segnala Share Inserita: 20 gennaio 2014 Ecco, come faccio a puntare al primo bit per portarlo a 1? Fai OR con 0000.0001 o, se preferisci con 01h Link al commento Condividi su altri siti More sharing options...
Giuseppe Signorella Inserita: 20 gennaio 2014 Segnala Share Inserita: 20 gennaio 2014 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 More sharing options...
Stef U. Inserita: 21 gennaio 2014 Autore Segnala Share Inserita: 21 gennaio 2014 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 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. errore mio. Interrogando il fronte di salita della stessa variabile il problema dovrebbe essere risolto, giusto? Come sempre avete chiarito ogni mio dubbio Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 21 gennaio 2014 Segnala Share Inserita: 21 gennaio 2014 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 More sharing options...
Stef U. Inserita: 21 gennaio 2014 Autore Segnala Share Inserita: 21 gennaio 2014 Ah ecco! Quando ho visto il punto sono rimasto abbastanza perplesso. Grazie Livio. Link al commento Condividi su altri siti More sharing options...
Stef U. Inserita: 23 gennaio 2014 Autore Segnala Share Inserita: 23 gennaio 2014 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 Grazie mille a tutti Stefano 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