Vai al contenuto
PLC Forum


Array In Udt


mariogioni

Messaggi consigliati

salve a tutti, ho poca esperienza di S7 (conosco solo AWL) e avrei bisogno di un consiglio su questo:

- ho creato un UDT con un 2 INT, 5 BOOL e un ARRAY di INT (ELEM[1..30])

- ho creato un DB con un certo numero di elementi del tipo UDT appena creato (VAR0, VAR1 ecc.)

- ho creato un FC da richiamare diverse volte passando come parametro le variabili appena create

- all'interno dell'FC ho la mia VARX riesco così a puntare a #VARX.ELEM[1], qual'è il modo più pulito per puntare ad un elemento indicizzato?

Grazie

Link al commento
Condividi su altri siti


Difficile dare una risposta senza sapere cosa devi fare.

Molto cambia anche dal linguaggio, che potrebbe essere AWL o SCL.

In AWL un sistema potrebbe essere quello di caricare nel registro indirizzi, oppure in una variabile DINT, l'indirizzo della prima variabile dell'array, e poi sommare l'offset calcolato in base all'indice della variabile da puntare.

Ma, ripeto, senza sapere cosa devi fare, difficile indicare il modo migliore.

Link al commento
Condividi su altri siti

Grazie per la risposta, io conosco solo AWL (penso di non avere nemmeno il pacchetto SCL), la mia idea era di raggruppare in una variabile UDT tutte le funzioni di un silo, tra cui c'è anche un'array per fare una media mobile, ho messo l'array in testa alla dichiarazione così all'interno del DB1 la variabile SILO1 parte da "0" la SILO2 parte da "50" ecc. (sto cambiando il formato della UDT ma il concetto non cambia).

Ora vorrei richiamare la FC con parametro SILO1, SILO2 ecc... , il mio problema è che all'interno dell'FC posso usare la variabile come #SILOX.ELEM[1], #SILOX.ELEM[2]... ma non riesco a trovare il formato per indicizzarla.

Quando passo all'FC la variabile SILO2 dovrei avere tutto, perchè dovrebbe interessarmi sapere che è il DB1 offset 50 piuttosto che DB99 offset 99?

Potrei passare alla FC le informazioni necessarie per calcolare l'indirizzo fisico ma sicuramente c'è un modo più furbo e pulito che mi sfugge.

Link al commento
Condividi su altri siti

Sei sicuro che non ti convenga utilizzare una FB con DB di istanza (un DB per ogni silo) al posto di una FC?

Se proprio non vuoi utilizzare una FB potresti creare nei dati locali della FC la struttura completa di variabili di un silo (puoi utilizzare sempre l'UDT).

Alla funzione potresti passare un parametro numerico per indicare il silo.

Con questo numero crei l'idirizzo di partenza dei dati del silo interessato.

Poi copi i dati dal DB nei dati locali della FC.

Elabori la funzione e, prima di uscire, salvi i dati locali nel DB.

Una simile complicazione però mi pare potrebbe avere senso solo se il numero dei sili è molto elevato, e non vuoi avere un altrettanto elevato numero di DB di istanza.

A mio avviso, anche se i sili fossero un centinaio, meglio creare 100 DB di istanza che complicarsi la vita.

Link al commento
Condividi su altri siti

Passare il numero del silo è una soluzione, in realtà io pensavo di potermi distaccare dall'indirizzamento fisico, per una questione di ordine formale, non è una necessità pratica, volendo potrei anche riutilizzare il solito codice che con un solo DB e un solo ciclo indice fa tutto.

Nel tempo libero mi piace migliorare anche esteticamente le routine che ho già, pensavo di creare una serie di oggetti (il silo è solo un esempio) del tutto svincolati dalla memoria fisica e mi sembrava di riuscirci prima di trovare il problema dell'array, mi piaceva l'idea che questi oggetti potessero essere usati e capiti anche da conosce poco i DB. Volevo che chiuque potesse richiamare la funzione passando semplicemente la variabile SILO2 precedentemente create in un DB a piacere.

Forse ho frainteso lo scopo della dichiarazione variabili che per certi aspetti mi sembra più di facciata che sostanziale o più probabilmente l'AWL non è la scelta giusta, d'altra parte conosco solo quello.

grazie ancora.

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