Vai al contenuto
PLC Forum


Stack In Omron - aggiornamento stack


robysan72

Messaggi consigliati

ciao

avrei bisogno una mano sull'aggiornamento dello stack.

Sto gestendo un magazzino (per semplicità diciamo di 10 posizioni) con uno stack di 10 celle.

Fino ad oggi non ho avuto problemi in quanto le operazioni su questo avvenivano in automatico con l'istruzione FIFO.

Ora però si presenta la necessità di prelevare a volte da magazzino a prescindere dallo stack.

Quindi ad esempio diciamo che l'operatore toglie il codice '1111' memorizzato in posizione 5.

Come faccio a compattare lo stack?

Ho provato con l'istruzione SRCH (DATA SEARCH) che dovrebbe restituirmi su IR00 la posizione del codice cercato (nella fattispecie 1111) ma in realtà se vado a leggere il registro di IR00 vedo che c'è scritto '1111' ... bella scoperta!!!

Se invece avessi la possibilità di ottenere la posizione del codice cercato con una successiva istruzione di SDEL (DELETE STACK) opportunamente parmetrizzata potrei compattare lo stack togliendo il codice non più presente.

Sperando di essere stato chiaro vi saluto e ... auguri di buone feste per chi è ancora con i piedi sotto la scrivania!

Robysan

Link al commento
Condividi su altri siti


L'istruzione SRCH ti restituisce l'indirizzo della locazione di memoria dove si trova il dato cercato. Chiaro che se cerchi 1111 e l'istruzione trova il dato in tabella, IR00 punta al valore cercato.

Prova a usare lo stesso indirizzo IR00 da passare alla SDEL per la posizione di cancellazione, dovrebbe andare.

Ciao

Link al commento
Condividi su altri siti

sì avevo già provato ad inserire IR0 come oggetto da cancellare ma non lo accetta : l'istruzione SDEL viene contrassegnata in rosso (provare per credere).

Allora l'ho passato come <,IR0> ma la virgola davanti significa purtroppo che punta al contenuto del registro e non alla posizione cercata.

Non ne esco...

Link al commento
Condividi su altri siti

Ciao!

Forse non ho capito bene qual'è il problema, ma se al posto del codice 1111 riesci in qualche modo a metterci 0000, allora dopo puoi usare l'istruzione ASFT per compattare il tutto.

Non ho mai provato ma dovrebbe funzionare... :P

Buone feste a tutti!

edogol

Link al commento
Condividi su altri siti

Puoi usare tranquillamente l'istruzione SDEL, devi praticamente mettere nel secondo operando dell'istruzione

l'OFFSET che ti devi scostare dall'ultimo indirizzo vuoto dello STACK.Te lo puoi calcolare in quanto conosci

l'indirizzo fisico della tua cella (che contiene 1111) caricato in IR0 da SRCH e la profondità dello STACK, contenuta nel terzo e quarto parametro dello STACK.

Fai la Differenza Lunga (istruzione -L) della profondità dello STACK e IR0 e ti trovi l'OFFSET da usare nel secondo operando dell'istruzione SDEL.

Mi auguro di essere stato chiaro.

Ciao!

Link al commento
Condividi su altri siti

Con un puntatore che passa per tutta l'area del fifo fai un cmp su tutti i valori fino a trovare quello che vuoi, quando lo trova metti a 0 il DM con quel valore e ASFT compatta l'area. Nei miei programmi mi capita abbastanza spesso di farlo.

Caio, Andrea.

Link al commento
Condividi su altri siti

puoi gestire un magazzino con un array bidimensionale o tridimensionale

o qualora si necessiti di piu dati di array di strutture , dove ogni elemento dell`array , cioe una struttura non

e` altro che una riga della tabella .

Il numero digitato dall`operatore lo interpreti come l`indice dell`array o meglio dire il puntatore

alla tabella .In questa maniera puoi estrapolare tutti i dati che vuoi

ciao

Link al commento
Condividi su altri siti

Con un puntatore che passa per tutta l'area del fifo fai un cmp su tutti i valori fino a trovare quello che vuoi, quando lo trova metti a 0 il DM con quel valore e ASFT compatta l'area. Nei miei programmi mi capita abbastanza spesso di farlo.

Ricorda però di aggiornare il puntatore dello stack!!Con l'indirizzo della prima cella libera..

Link al commento
Condividi su altri siti

della prima cella libera? Basta usare un puntatore che vada da DM0 a DM10 (il range usato in asft) cercare il valore e cancellarlo. Il puntatore può continuare a scorrere all'interno di quel range senza preoccuparsi di quale sia la prima cella libera..

Link al commento
Condividi su altri siti

Ti chiedo scusa, ma non si stava parlando di uno STACK?

Secondo me la cosa più semplice da utilizzare quando si tratta di gestione magazzino o dati impilati,è appunto lo stack,con l'utilizzo delle istruzioni studiate al caso,senza dover ricorrere a mille stratagemmi..

Ciao.

Link al commento
Condividi su altri siti

Per stack che cosa intendi? Non è un'area di memoria in cui vengono inseriti i dei dati ed istruzioni da elaborare?

Nelle funzioni ASFT e SRCH ci si possono inserire solo delle aree di DM, almeno che io sappia. Il punto è che secondo me non ha senso invischiarsi con puntatori IR qualndo con un seplicissimo puntatore di DM e poche istruzioni si può risolvere il problema.

E' chiaro che questo è solo il mio punto di vista, per fare la stessa cosa ci sono almeno 10 modi diversi.

Ciao

Link al commento
Condividi su altri siti

Con le Cpu CJ1 e CS1, il set delle istruzioni è stato notevolmente potenziato.

Si possono creare delle matrici monodimensionali (STACK) con l'istruzione SSET,o polidimensionali con l'istruzione DIM.I due differiscono nelle istruzioni a corredo.

Per lo STACK ci sono istruzioni che ti permettono di inserire dati nella PILA di canali che lo compongono

(PUSH), estrarre gli ultimi o i primi dati scritti (LIFO, FIFO),cancellare (SDEL).E' direttamente lo STACK che

nei suoi primi quattro canali tiene in memoria l'indirizzo sia dell'ultima cella che della prima libera.

Tutto questo è molto più semplice, che utilizzare righe e righe di codice, che appesantiscono il programma

sia nella velocità che nella memoria..

Ciao.

Link al commento
Condividi su altri siti

Non so quante istruzioni ci vogliono a fare una cosa del genere usando matrici e stack direttamente; per come la vedo io usando un semplice puntatore con 5 istruzioni circa ha finito.

Ciao.

Link al commento
Condividi su altri siti

Serve una sola istruzione per la definizione dello stack e una istruzione per eseguire le funzioni

desiderate su di esso(inserire, cancellare, prelevare il primo o l'ultimo valore inserito).

A questo bisogna aggiungere che le istruzioni delle tabelle possono essere eseguite in background,

che quando abbiamo a che fare con programmi molto lunghi, puo tornare molto utile..

Ciao.

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