Vai al contenuto

Gestire uscite logiche con indirizzamento ad indice

Home Forum Programmazione IEC 61131 (LogicLab) Gestire uscite logiche con indirizzamento ad indice

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #35197
    Emiliano
    Partecipante

    Avrei la necessità di poter gestire le uscite logiche utilizzando un indirizzamento ad array od eventualmente a pointer. In pratica ho un programma che gestisce il carico/scarico di serbatoi, per ogni serbatoio devo gestire un uscita logica. Ho creato una struttura dati di gestione serbatoio in cui sono definiti tutti i parametri di gestione, riporto per semplicità solo i due membri della struttura interessati.

    SERBATOIO : STRUCT
        IsAperto : BOOL; { DE:”Comando Aperto/Chiuso” }
        Uscita : USINT; { DE:”Uscita logica di gestione” }
    END_STRUCT;

    In pratica il membro IsAperto indica se devo attivare o meno l’uscita, il membro Uscita indica quale uscita reale è da gestire per quel serbatoio. In questo modo variando il valore di Uscita posso cambiare l’uscita reale a mio piacimento senza dover modificare il programma PLC.

    Siccome i serbatoi sono molti ho creato un array di strutture SERBATOIO una per ogni serbatoio da gestire e l’ho chiamata Serbatoi.

    Serbatoi : ARRAY[ 0..3 ] OF SERBATOIO; { DE:”Array gestione serbatoi” }

    Ora vorrei poter gestire (Con un ciclo FOR) l’uscita di ogni serbatoio (Indicata dal valore in Uscita) con il valore in IsAperto, come posso fare ?

    #37196
    Sergio Bertana
    Amministratore del forum

    L’argomento è complesso in quanto tira in ballo la gestione della immagine di processo gestita automaticamente da LogicLab. Cerco di spiegare il concetto, nella gestione degli I/O un sistema PLC opera ad immagine di processo, gli ingressi sono copiati in memoria ad inizio loop e le uscite sono gestite a fine loop, questo garantisce che lo stato di un I/O sia stabile per tutto il loop di esecuzione.

    Ma LogicLab gestisce il multitasking, quindi abbiamo più di una task in esecuzione (E solo una delle task gestisce fisicamente gli I/O), per garantire l’immagine di processo sono gestite diverse aree di appoggio I/O, il tutto avviene in modo trasparente al programma utente. Ma l’accesso diretto alla locazione di memoria dell’I/O funziona solo se viene eseguita nella task dove realmente sono gestiti gli I/O, nel caso di SlimLine gli I/O sono gestiti nella task Slow.

    Quindi l’accesso alla locazione di memoria dell’I/O può essere gestita solo nella task Slow, dove per gestire l’indirizzamento ad indice dell’output dei 4 serbatoi puoi realizzare un programma del tipo.

    FOR i:=0 TO 3 DO
      Ptr:=ADR(%QX0.0)+Serbatoi[i].Uscita;
      @Ptr:=Serbatoi[i].IsAperto;
    END_FOR;

    Ti allego la Stampa ed il Download programma sorgente.

    #37197
    Sergio Bertana
    Amministratore del forum

    Per delegare a LogicLab l’onere di gestire correttamente l’immagine di processo (Questo è preferibile su sistemi targets che gestiscono molte tasks concorrenti), si può definire un array di appoggio delle uscite logiche e poi con un programma logico anche in LD appoggiare i dati dall’array di appoggio sulle uscite reali. Nel mio programma di esempio ho definito l’array OImage che contiene l’immagine delle uscite, il ciclo FOR di gestione uscite sarà:

    FOR i:=0 TO 3 DO
      OImage[Serbatoi[i].Uscita]:=Serbatoi[i].IsAperto;
    END_FOR;

    Un appostito programma ladder provvederà poi a copiare l’immagine delle uscite sulle uscite reali. In questo caso come si vede dal programma di esempio è possibile gestire le uscite anche da task Back, mentre l’esempio precedente funziona solo se la gestione delle uscite è nella task Slow la stessa che ne gestisce l’appoggio sulle periferiche. Stampa e Download programma sorgente. Riporto anche lo screenshot del debug del programma.

    #37198
    Emiliano
    Partecipante

    Ieri sera mentre a casa, ho provato il codice allegato, compilandolo con il target Emulatore funziona tutto bene ed ero contento! Questa mattina sono ritornato con i piedi per terra, perché compilandolo per il PLC, mi segnala il seguente errore: Complex variables cannot have process image. Ecco il codice ST.

    VAR
      IN1 AT %IX0.0 : ARRAY[ 0..15 ] OF BOOL;
      OUT1 AT %QX0.0 : ARRAY[ 0..7 ] OF BYTE;
      I : USINT;
    END_VAR

    FOR I:=0 TO 7 DO
      OUT1[I]:=IN1[I];
    END_FOR;

    #37199
    Sergio Bertana
    Amministratore del forum

    L’errore è spiegato con quanto detto sull’imagine di processo, l’emulatore non ha la gestione dell’immagine di processo, pertanto l’indirizzo reale degli I/O è sempre lo stesso per tutte le tasks.

    Lo SlimLine esegue la gestione degli I/O con immagine di processo nella task Slow e nelle altre tasks usa una copia della immagine. Quindi al di fuori della task Slow non è possibile accedere all’indirizzo reale degli I/O, se si esegue il programma in una task diversa ti darà l’errore che mi hai riportato.

    Ho modificato il tuo progetto eseguendo il programma Main nella task Slow, e funziona perfettamente, allego Stampa e Download programma.

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