Gestire un contatore con valore ritentivo
Home › Forum › Programmazione IEC 61131 (LogicLab) › Gestire un contatore con valore ritentivo
- Questo topic ha 9 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 6 anni, 7 mesi fa da
Sergio Bertana.
-
AutorePost
-
Ottobre 31, 2017 alle 8:56 am #36161
Alessandro Campodonico
PartecipanteDovrei gestire un conteggio appoggiando il valore su di una variabile ritentiva (RETAIN), per il conteggio ho realizzato un mio FB cher esegue i vari controlli ed incrementa un contatore poi appoggio l’uscita su una variabile ritentiva (In DB100.2048). Ma quando spengo e riaccendo il sistema il valore del conteggio mi si azzera, come posso fare.
Ottobre 31, 2017 alle 9:04 am #40003Sergio Bertana
Amministratore del forumIl tuo problema è che alla accensione il FB ha le sue variabili interne tutte azzerate quindi anche il suo valore in uscita è azzerato, siccome tu appoggi il valore in uscita sulla variabile tampone azzeri anche la variabile.
Per utilizzare variabili allocate in memoria tampone (Backup o Retain) all’interno di funzioni o blocchi funzioni devi utilizzare i puntatori passando l’indirizzo della variabile. In questo modo si opererà sull’effettivo valore della variabile, che, essendo tamponata manterrà alla accensione il valore che aveva allo spegnimento. In LogicLab i puntatori sono identificati con il simbolo @, quindi una variabile di tipo @UINT è in realtà un puntatore ad una variabile UINT.
Ho realizzato il progetto RetainCounter (Stampa programma) che illustra con tre diversi FB nei linguaggi LD, IL e ST come gestire le variabili RETAIN da un FB (Download progetto).
Luglio 18, 2018 alle 6:08 am #45121Alessandro Campodonico
PartecipanteBuona sera, sono ancora alle prese con con il mio FB counter, sino ad oggi mi sono arrangiato, creando un programmino nella task boot che mi copiava il valore di una variabile ritentiva all’ingresso del mio FB cosi all’avvio del plc il mio FB prende il valore della variabile ritentiva e quindi non mi si azzera.
Il problema è che questo sistema mi “appesantisce” il programma sia come spazio codice che come spazio variabili, quindi oggi mi trovo a dover modificare FB per far tenere i valori ritentivi in modo corretto ed eliminare quella parte di codice superfluo.
Ho fatto alcune prove utilizzando il programma da te caricato, il primo mio problema che sorge è questo, tutto il mio programma è scritto in linguaggio IL e non sono ancora riuscito a trovare il modo di utilizzare la funzione ADR in questo linguaggio, come devo fare?
Come modifica al mio FB per adattarlo al puntatore devo solo impostare la variabile con la @ e impostarla come variabile input? la variabile di appoggio esterna deve sempre essere una @, o una normale?
Luglio 19, 2018 alle 6:36 am #45124Sergio Bertana
Amministratore del forumPer non dover copiare la variabile, l’unico modo è di passarne l’indirizzo alla funzione o al blocco funzione visto che utilizzi il linguaggio IL ecco come scrivere il programma che utilizza il FB ILRetainCtr. Ho dichiarato nel programma la variabile Counter di tipo ILRetainCtr.
VAR
Counter : ILRetainCtr;
END_VAREd ecco semplice listato IL, come vedi l’ingresso Di00CPU è connesso al clock del counter, ed a Value è passato l’indirizzo della variabile Counters[0] che è di tipo RETAIN.
LD Di00CPU
ST Counter.Clk
ADR Counters[0]
ST Counter.Value
CAL CounterAllego il progetto LogicLab per il download.
Luglio 20, 2018 alle 6:26 am #45125Alessandro Campodonico
PartecipanteMi ero fatto ingannare dal fatto che scrivendo il comando ADR ( in IL ) la scritta non veniva di colore blu che ad esempio succede per ( LD ST ADD SUB GT ECC ECC ) allora pensavo non funzionasse. Ne approfitto allora per chiederti ancora una cosa (scusate se vado OT)
Come si fa per usare le “funzioni” in linguaggio IL se provo a mappare una variabile non mi fa spuntare la casella funzioni, ma solo blocchi funzione, e se provo a scrivere CAL NOMEFUNZIONE ovviamente il compilatore mi dice che non è una variabile.
Luglio 20, 2018 alle 6:47 am #45135Sergio Bertana
Amministratore del forumLa risposta alla tua domanda è nel manuale di LogicLab, con LogicLab vi sono due manuali, uno è quello che spiega il funzionamento del programma (F1 su una qualunque finestra del programma) è l’altro è quello con i riferimenti a tutte le funzioni e FB fornite con i nostri prodotti (F1 su un nome di funzione o FB).
Ma venendo alla tua domanda per eseguire una funzione da IL basta metterne il nome come primo operando di una riga di programma. Occorre ricordare che il primo parametro alla funzione è passato tramite l’accumulatore, mentre gli altri vanno posti in linea alla definizione. Il risultato della funzione è ritornato in accumulatore. Ecco lo screenshot con un esempio.
Luglio 20, 2018 alle 2:01 pm #45136Alessandro Campodonico
PartecipanteHo provato ad esempio ad utilizzare la funzione ValueScale ma il compilatore mi riporta un errore:
G0001 Numero di operandi non valido.
E me lo riposta scrivendo solamente
LD Temperatura
ValueScaleCosa posso fare per risolvere?
Luglio 20, 2018 alle 2:05 pm #45138Sergio Bertana
Amministratore del forumLa risposta è nell’errore, la funzione ValueScale ha più operandi
Input (REAL) Valore in ingresso da scalare.
ILow (REAL) Limite minimo del valore in ingresso da scalare.
IHigh (REAL) Limite massimo del valore in ingresso da scalare.
OLow (REAL) Limite minimo del valore in uscita scalato.
OHigh (REAL) Limite massimo del valore in uscita scalato.E tu non li hai messi. Devi scrivere ad esempio se vuoi trasformare un ingresso 4-20 mA in 10-50 PSI:
LD Sensore (* Input, Valore in ingresso da scalare *)
ValueScale 4.0, 20.0, 10.0, 50.0
ST PressioneSettembre 12, 2018 alle 3:17 pm #45361Alessandro Campodonico
PartecipanteBuongiorno, sono tornato alla prese con il mio FB di conteggio ore funzionamento e i puntatori. Stavo cercando di aggiornare il mio blocco, per evitare di dover copiare sempre i valori ma riscontro un blocco del PLC, mi spiego meglio.
Allora il mio blocco conta il tempo di attivazione del suo ingresso, diviso per secondi, minuti ed ore, quindi al suo interno esegue tutte le istruzioni su queste 3 variabili ( in uscita al blocco )
se non ho capito male per aggiornare correttamente il blocco con i puntatori dovrei “mapparle” correttamente aggiungendo la @ nella lista di queste 3 variabili, successivamente aggiungere sempre la @ nella lista istruzioni dove vengono usate queste variabili, infine assegnare le 3 variabili come input e non come output, cosi facendo in teoria dovrei aver aggiornato correttamente (sempre se non ho capito male ). Andando pero a caricare il programma sul plc ho un blocco, il file log mi riporta questo testo
[E] SFR050 [05/09/2018 10:24:06] 1020, Except: IVECTOR At:0x00000000
[L] SFR050 [05/09/2018 10:24:06] 1000, System power on
[L] SFW184 [05/09/2018 10:24:06] 5005, Starting Op. System SFW184B080
[E] SFW184 [05/09/2018 10:24:06] 6030, LLab Cn, ApplID:0x364F53D4Settembre 12, 2018 alle 3:23 pm #45377Sergio Bertana
Amministratore del forumL’utilizzo dei puntatori fornisce notevole potenza nello sviluppo dei programmi ma è MOLTO PERICOLOSO, se si passa un indirizzo errato al puntatore si può accedere a tutta la memoria del sistema andando a operare anche su zone del sistema operativo.
Nel tuo caso hai probabilmente un indirizzamento errato che blocca il sistema con una eccezione. In seguito all’errore il sistema si riavvia, poi se LogicLab era connesso si arresta in stop. Ma se LogicLab non fosse connesso il sistema tenta di riavviarsi per alcune volte fino a fermarsi in stop.
Quindi nel tuo caso hai sicuramente un errore nel valore passato al puntatore, guarda il progetto di esempio dei post precedenti e clona il programma per il tuo uso.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.