fortun Inserito: 28 febbraio 2006 Segnala Inserito: 28 febbraio 2006 Ciao,ho un problema con uno schift register a 32bit che eseguo facendo un loop di 300 iterazioni per far scorrere i dati. Ho scritto una cosa del genereSul fronte di clockIF Presenza Pezzo THEN // VERIFICA LA PRESENZA DEL PEZZO Invalue= 1; // E ASSEGNA INVALUE dello shift ELSE // Invalue= 0; END_IF;FOR Loop:= 0 TO 300DoVariabileDiAppoggio= Memoria[Loop]; //memorizza "n" value in variabile di appoggioMemoria[Loop]:= Invalue; //Immette Invalue in memoria "n" Invalue= VariabileDiAppoggio; //Aggiorna Invalue con Var.di appoggioEnd_For;Il problema è che il ciclo di scansione va alle stelle, e vorrei evitare di farlo su più ciclo di scansione del PLC.Qualcuno ha un'idea migliore per ottenere questo risultato stando bassi con i tempi di ciclo?Grazie Ciao
ifachsoftware Inserita: 28 febbraio 2006 Segnala Inserita: 28 febbraio 2006 Potresti suddividere il loop in tanti loop piu' piccoli e passi dall'uno all'altro con dei merker che setti e resetti di volta in volta.Ciao
fortun Inserita: 28 febbraio 2006 Autore Segnala Inserita: 28 febbraio 2006 Non capisco che differenza c'è se lo fai in pezzi più piccoli ma all'interno dello stesso ciclo di scansione.
irpick Inserita: 28 febbraio 2006 Segnala Inserita: 28 febbraio 2006 non sapendo cosa vuoi ottenere ti ipotizzo :due puntatori:memorizzi incrementando offset per variabile presenza pezzo (array 0,300)2 puntatore per lettura e/o modifica datoeviti shift ciclico.
Livio Orsini Inserita: 28 febbraio 2006 Segnala Inserita: 28 febbraio 2006 ho un problema con uno schift register a 32bit che eseguo facendo un loop di 300 iterazioni per far scorrere i dati.Non capisco. Se è uno shift register da 32 bits lo si completa con 32 colpi di clock, le 300 iterazioni non hanno senso.Se invece è un buffer circolare di 300 parole da 32 bits devi necessariamente compiere le 300 operazioni di lettura e scrittura se vuoi far avanzare tutte le variabli di un passo. In questo caso la tecnica migliore è quella di creare un aray di 300 word ed impostare due puntatori Ir (indice lettura) Iw (indice scrittura), con Iw = Ir+1.Partendo con Iw = 300 e Ir = 299 nel loop farai:For loop = 0 to 300Variabile [iw] = Variabile[ir]Iw--Ir--end_forChiarisci meglio la tua applicazione
fortun Inserita: 28 febbraio 2006 Autore Segnala Inserita: 28 febbraio 2006 Irpick,ti spiego subito, ho una macchina con una catena con 300 tasche ognuna delle quali accoglie un pezzo.Devo eseguire alcune lavorazioni in punti fissi della macchina. Per cui ho bisogno di mappare la presenza dei pezzi con un clock di avanzamento pezzo. non capisco come funzionano i tuoi puntatori mi puoi fare un esempii semplice.Ciao e grazie
fortun Inserita: 28 febbraio 2006 Autore Segnala Inserita: 28 febbraio 2006 Orsini,credo di aver chiarito meglio con la risposta data a irpick l'applicazione. Comunque si tratta di uno schift a 32bit nel senso che eseguo lo shift di doppie parole e non di bit. In pratica quello che ho fatto è creare un array di 300 doppie parole ed eseguo la procedura descritta nella mia prima richiesta.
Livio Orsini Inserita: 28 febbraio 2006 Segnala Inserita: 28 febbraio 2006 Quello che hai fatto si chiama buffer o coda o pila. Se la grandezza del buffer è di 300 words devi fare 300 operazioni lettura e scrittura, non esistono altri modi. L'unica cosa che puoi fare è ottimizzare le operazioni come ti ho suggerito e, come ti ha suggerito Ifach, spezzare il loop in alcuni loop più piccoli. Il tempo totale di escuzione aumenta leggermente, ma il tempo di ciclo del PLC diminuisce proporzionalmente al numero di sotto loop, perchè impiegherà più cicli per completare l'intero aggiornamento. Purtroppo niente è regalato.PS. il termine schift non esiste, si scrive shift da to shift ==> trasferire, spostare
floppydisco Inserita: 1 marzo 2006 Segnala Inserita: 1 marzo 2006 Se ho capito bene, in ogni punto di lavorazione vuoi sapere il dato (DW) relativo al pezzo.Se i punti di lavorazione non sono tanti (10-20), io farei così:-Ti crei un array con 300 DW -poi crei tanti contatori quanti sono i punti di lavoro +1 (punto di ingresso pezzo) incrementati col clock di avanzamento che vanno da 1...300. I contatori dei punti di lavoro saranno sfasati rispetto a quello di ingresso del pezzo come la distanza tra ingresso pezzo e punti di trattamento sulla macchina.-Poi con il contatore ingresso pezzo realizzi un puntatore per scrivere il dato nell'array, e con i contatori tratamento generi dei puntatori per leggere il dato nell'array.E' un po complicato da spiegare, ma se hai un array lungo e pochi punti di trattamento il prog diventa veloce in quanto non sposti i dati ma solo i punti di lettura-scrittura.spero di essere stato chiaro.
irpick Inserita: 1 marzo 2006 Segnala Inserita: 1 marzo 2006 Ciao,penso che "floppydisco" ti abbia già risposto..,poi puoi provare ad elaborare ulteriormente l'idea.
beppeconti Inserita: 1 marzo 2006 Segnala Inserita: 1 marzo 2006 Se hai la possibilità di utilizzare il linguaggio SCL puoi gestire gli shift register con il comando "select ... case" che è più agevole del metodo a puntatori di AWL. Ci puoi mettere anche degli array.CIAo
fortun Inserita: 1 marzo 2006 Autore Segnala Inserita: 1 marzo 2006 Ciao,ho fatto una prova con puntatori che si ...rincorrono come suggerisce irpick e floppydisco. Credo che vada bene ed evito dei loop, inoltre ho poche lavorazioni da eseguire. Si perde un pò in leggibilità perchè con il loop sò ogni pezzo dove si trova fisicamente nella macchina in ogni istante. Utilizzando i puntatori che si rincorrono non è così immediato. Forse è il prezzo da pagare come dice Orsini.Grazie
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