bhef Inserito: 10 aprile 2020 Segnala Share Inserito: 10 aprile 2020 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. Link al commento Condividi su altri siti More sharing options...
batta Inserita: 10 aprile 2020 Segnala Share Inserita: 10 aprile 2020 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 More sharing options...
bhef Inserita: 10 aprile 2020 Autore Segnala Share Inserita: 10 aprile 2020 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 More sharing options...
batta Inserita: 10 aprile 2020 Segnala Share Inserita: 10 aprile 2020 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 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 More sharing options...
bhef Inserita: 10 aprile 2020 Autore Segnala Share Inserita: 10 aprile 2020 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 More sharing options...
batta Inserita: 10 aprile 2020 Segnala Share Inserita: 10 aprile 2020 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 More sharing options...
bhef Inserita: 14 aprile 2020 Autore Segnala Share Inserita: 14 aprile 2020 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 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