Vai al contenuto

Definizione numero elementi in array di strutture

Home Forum Programmazione IEC 61131 (LogicLab) Definizione numero elementi in array di strutture

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #72288
    Anonimo
    Inattivo

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

    #72293
    Sergio Bertana
    Amministratore del forum

    Struttura 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;
    #72349
    Roberto
    Partecipante

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

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.