Vai al contenuto
PLC Forum


Shift di un'Array Struct


bhef

Messaggi consigliati

Buongiorno a tutti. Come state??

 

Ho un problema con TIA Portal.

Premessa purtroppo che devo utilizzare esclusivamente DB Ottimizzate e linguaggio KOP altrimenti avrei già risolto. 

Mi spiego:

Ho un'array di struct di 10 elementi (0...9) e dovrei copiare gli elementi dal 2 all'8 nel 3 al 9 dello stesso array. Praticamente dovrei fare uno shift.

 

Ho provato ad utilizzare MOVE_BLK_VARIANT che soddisfa tutte le mie richieste ma il problema è che funzione solamente se la copia avviene su due array diversi.

Se provo a copiare nello stesso array la copia avviene solo per il primo elemento indicato, in questo caso il 2, in tutti gli elementi seguenti fino al 9.

 

In allegato trovate la DB e l'FC su cui sto lavorando.

Cattura.PNG

Link al commento
Condividi su altri siti


22 minuti fa, bhef ha scritto:

dovrei copiare gli elementi dal 2 all'8 nel 3 al 9 dello stesso array. Praticamente dovrei fare uno shift.

Non mi è chiaro. Intendi uno shift ma partendo dall'elemento 2 dell'array? cioè, elemento 8 nel 9, 7 nell'8, 6 nel 7..... 2 nel 3?

 

24 minuti fa, bhef ha scritto:

Premessa purtroppo che devo utilizzare esclusivamente DB Ottimizzate e linguaggio KOP altrimenti avrei già risolto.

Perché devi usare assolutamente il KOP? Fatti una funzione, in SCL, che faccia esclusivamente lo shift, con l'array passato come IN/OUT. Se devi programmare in KOP, richiami questa funzione, passando i parametri, come faresti con una istruzione qualsiasi.

Link al commento
Condividi su altri siti

Buongiorno Batta!

 

Esattamente devo fare quello che hai detto (elemento 8 nel 9, 7 nell'8, 6 nel 7..... 2 nel 3)

 

Purtroppo devo farlo in KOP e con DB ottimizzate per disposizioni del cliente....

Ci sto sbattendo la testa da stamattina, immagino non si possa proprio fare con queste disposizioni...

Link al commento
Condividi su altri siti

1 ora fa, bhef ha scritto:

Purtroppo devo farlo in KOP e con DB ottimizzate per disposizioni del cliente....

I clienti vanno anche addomesticati.
Capisco che, spesso, il cliente chieda di usare solo il ladder per rendere il programma comprensibile anche dai loro manutentori, che non sono abituati ad usare altri linguaggi, ma facciamo ora un ragionamento:

Questo è un esempio di quello che si potrebbe fare in ladder

immagine.png.4e4ec4bc9f2a554b0d6ae909639d71b0.png

 

Mentre questo è un esempio di ciò che si potrebbe fare in testo strutturato

IF "Execute" THEN
    FOR #i := 8 TO 2 BY -1 DO
        "DB_MyArray".Element[#i + 1] := "DB_MyArray".Element[#i];
    END_FOR;
    "Execute" := FALSE;
END_IF;

Io penso che, anche chi conosce solo il ladder, con massimo due minuti di spiegazione sarebbe in grado di comprendere quelle poche righe di testo strutturato, e che le troverebbe più semplici di quanto scritto in ladder.

 

Ma, al di là di questo, se proprio non riesci a farli ragionare, e non accettano nemmeno una riga in strutturato, ti puoi sempre preparare la tua bella funzioncina, scritta in strutturato, la proteggi in modo che non possano nemmeno guardare cosa c'è scritto dentro, e la richiamo nel programma in ladder.

Alla fine, se tu usassi MOVE_BLK_VARIANT, qualcuno ti chiederebbe di guardare cosa c'è dentro a quella funzione?

 

Altra soluzione, potrebbe essere con MOVE_BLK_VARAIANT, da usare due volte: crei, nell'area "temp", un array identico a quello su cui devi lavorare; al primo richiamo di MOVE_BLK_VARIANT copi gli elementi nell'array temporaneo, e poi dall'array temporaneo di nuovo nell'array di origine, spostando i dati come meglio credi.
Personalmente, questa soluzione non mi piace nemmeno un po'.




 

 

Link al commento
Condividi su altri siti

Ti do al 100% ragione.

 

Neanche a me la soluzione finale piace perchè è un programma abbastanza pesante (considera che l'esempio in allegato è appunto un esempio) nella realtà stiamo parlando di 200 elementi di array con strutture belle pesanti all'interno.

Link al commento
Condividi su altri siti

36 minuti fa, bhef ha scritto:

nella realtà stiamo parlando di 200 elementi di array con strutture belle pesanti all'interno.

In questo caso, a mio avviso, è da valutare se si deve per forza fare lo shift di tutti gli elementi dell'array, o se sia più conveniente lavorare con gli indici degli elementi anziché far scorrere gli elementi.
Per esempio, se serve per fare un registro FIFO o qualcosa di simile, ci sono modi molto più efficienti (lavorando, appunto, con gli indici degli elementi, e non spostando gli elementi), con i quali la dimensione dell'array è ininfluente.
Per farsi un'idea, Nelle "LGF_Library" (scaricabili gratuitamente dal sito Siermens), c'è un ottimo esempio di registro FIFO (e anche LIFO). Questa funzione, oltre a lavorare con gli indici del registro, sfrutta le variabili "Variant", quindi, alla funzione FIFO, puoi collegare come parametro un qualsiasi array.

Link al commento
Condividi su altri siti

Buongiorno Batta.

Le ho scaricate l'altro giorno quelle librerie con all'interno FIFO e LIFO.

Oggi provo a dare un'occhiata e se ho novità vi scrivo.

 

Buona giornata

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