Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Shift Register - Come eseguire uno schift register con molte iterazioni?


Messaggi consigliati

Inserito:

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 genere

Sul fronte di clock

IF Presenza Pezzo THEN // VERIFICA LA PRESENZA DEL PEZZO

Invalue= 1; // E ASSEGNA INVALUE dello shift

ELSE //

Invalue= 0;

END_IF;

FOR Loop:= 0 TO 300

Do

VariabileDiAppoggio= Memoria[Loop]; //memorizza "n" value in variabile di appoggio

Memoria[Loop]:= Invalue; //Immette Invalue in memoria "n"

Invalue= VariabileDiAppoggio; //Aggiorna Invalue con Var.di appoggio

End_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


Inserita:

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 :)

Inserita:

Non capisco che differenza c'è se lo fai in pezzi più piccoli ma all'interno dello stesso ciclo di scansione.

Inserita:

<_<

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 dato

eviti shift ciclico.

Inserita:
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 300

Variabile [iw] = Variabile[ir]

Iw--

Ir--

end_for

Chiarisci meglio la tua applicazione

Inserita:

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

Inserita:

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.

Inserita:

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

Inserita:

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.

Inserita:

Ciao,penso che "floppydisco" ti abbia già risposto..,

poi puoi provare ad elaborare ulteriormente l'idea.

Inserita:

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

Inserita:

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

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