Gestire uscite logiche con indirizzamento ad indice
Home › Forum › Programmazione IEC 61131 (LogicLab) › Gestire uscite logiche con indirizzamento ad indice
- Questo topic ha 4 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 13 anni fa da
Sergio Bertana.
-
AutorePost
-
Aprile 6, 2012 alle 6:19 am #35197
Emiliano
PartecipanteAvrei 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 ?
Aprile 6, 2012 alle 6:57 am #37196Sergio Bertana
Amministratore del forumL’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.
Aprile 6, 2012 alle 7:13 am #37197Sergio Bertana
Amministratore del forumPer 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.
Aprile 6, 2012 alle 8:04 am #37198Emiliano
PartecipanteIeri 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_VARFOR I:=0 TO 7 DO
OUT1[I]:=IN1[I];
END_FOR;Aprile 6, 2012 alle 8:09 am #37199Sergio Bertana
Amministratore del forumL’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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.