Definizione numero elementi in array di strutture
Home › Forum › Programmazione IEC 61131 (LogicLab) › Definizione numero elementi in array di strutture
- Questo topic ha 2 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 1 anno, 10 mesi fa da
Roberto.
-
AutorePost
-
Giugno 6, 2023 alle 2:07 pm #72288
Anonimo
InattivoEspongo un breve esempio per motivare il quesito: impiego un array di strutture per la gestione degli allarmi. Ciascun elemento è composto come segue:
t_alStr: STRUCT b : t_bitCfgAl; (* bit di configurazione allarme *) ph : t_ph; (* fase (stato) in cui si trova l'allarme *) elapsed_m : UDINT; (* tempo totale allarme attivo *) count : UDINT; (* conteggio interventi allarme *) insTmmTrig : UDINT; insTmmSp : UINT; (* Tempo [mS] insensibilità *) END_STRUCT;
L’elemento “b” è una struttura del tipo:
t_bitCfgAl: STRUCT reqd : BOOL; (* stato richiesto non in allarme *) rstMan : BOOL; (* richiede reset manuale *) audible : BOOL; (* attiva cicalino *) active : BOOL; (* da elaborare *) loPri : BOOL; (* bassa priorità *) blind : BOOL; (* non luminoso *) input : BOOL; (* ingresso da controllare *) live : BOOL; (* attualmente attivo (in allarme) *) liveRe : BOOL; mem : BOOL; (* richiede reset *) piuPiu : BOOL; END_STRUCT;
L’elemento “ph” è una struttura del tipo:
t_ph: STRUCT ptr : INT; (* Puntatore fase corrente *) oldPtr : INT; (* Puntatore fase di provenienza *) dbg : INT; (* Usato in debug, sfasa i salti *) tmmIn : UDINT; (* Istante assoluto entrata in fase *) tmmElap : UDINT; (* Tempo trascorso dall'entrata in fase *) END_STRUCT;
Il codice del programma elabora le strutture in ciclo for next. Per ottimizzare, definisco il vettore col numero di elementi che mi servono e ovviamente cambio l’indice finale del for next. C’è modo di definire una “costante di compilazione” kostante:=10 da utilizzare poi tanto nella definizione di un ARRAY[0..kostante] OF some_type che nel FOR n := 0 TO kostante DO?
Ho provato nei fora a cercare un pò di termini ma non ho trovato nulla. Ovviamente usando il numero esplicito il problema non si pone, ma tocca rammentare di cambiarlo ovunque e non sempre è solo in due posti.
Giugno 6, 2023 alle 2:18 pm #72293Sergio Bertana
Amministratore del forumStruttura complessa, se posso dare una mia indicazione utilizzerei la nomenclatura delle strutture in lettere maiuscole, a mio parere danno maggiore leggibilità. Quindi t_bitCfgAl diventa T_BIT_CFGAL e t_ph diventa T_PH. Ma questa è una mia abitudine.
Venendo alla tua domanda, per definire delle costanti puoi usare l’attributo CONSTANT.
VAR CONSTANT NrOfItems : USINT := 10; (* Numero elementi array *) END_VAR VAR i : UDINT; (* Auxiliary variable *) END_VAR FOR i:=0 TO NrOfItems-1 DO ... END_FOR;
Ma non è possibile utilizzare una definizione per definire la lunghezza di un array ARRAY[0..kostante] .
Nel tuo ciclo FOR per avere la definizione automatica della lunghezza puoi utilizzare:
FOR i:=0 TO (SIZEOF(t_alStr)/SIZEOF(t_alStr[0]))-1 DO ... END_FOR;
Giugno 6, 2023 alle 6:33 pm #72349Roberto
PartecipanteGrazie della cortese e sempre sollecita risposta.
Mancando il paradigma della “supercostante”, condivido appieno l’approccio che hai adottato impiegando il SIZEOF().
A questo punto forzerei la mano, definendo una variabile che in boot faccio calcolare dalla dimensione dell’array, per poi impiegarla ovunque mi serva, prevenendo la ripetizione del calcolo del numero di item contenuti ad ogni scansione.Nel mio caso, dovessi cambiare il numero di allarmi definiti, l’unico gravame resta la variazione della dimensione dell’array. A runtime il programma automaticamente si adegua per continuare ad elaborarli tutti.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.