Vai al contenuto
PLC Forum


Attivazione in sequenza di outputs (Elsist)


Annalisa Frasso

Messaggi consigliati

Annalisa Frasso

Salve, premetto che è da poco che mi sono avvicinata al mondo del plc e la mia formazione mi ha dato solo informazioni base di C++.

Ho acquistato un plc Slimline Elsist ed utilizzo come tool di programmazione LogicLab. Sto incontrando delle difficoltà nel dover scrivere un programma che, con un unico input, azioni in sequenza 10 outputs che devono attivarsi in maniera impulsiva ad una distanza di 5 secondi l'uno dall'altro. Per fare ciò con un unico output ho realizzato un programmino in LD utilizzando la FB ONOFFCYCLE impostando i tempi opportuni. Vorrei sapere se esistono FB più adatte per ciò che devo fare io e delle indicazioni su come fare. Vi ringrazio anticipatamente per la disponibilità.

Link al commento
Condividi su altri siti


La FB che hai usato ti da un'onda "quadra" con duty cycle random entro i limiti da te impostati e non mi pare la soluzione migliore.

Io ti consiglierei di usa la FB blink con un tempo di ON a 2500 (ms) e un tempo di OFF uguale in modo da a vere un periodo di 5 sec.
A questo punto abbini un contatore in up con preset pari al numero delle uscite che devi attivare e poni come clock del contatore il fronte di salita dell'uscita della FB "BLINK".
Il contatore ha un'uscita pari al valore di conteggio che ti abiliterà, tramite una comparazione, l'uscita relativa al numero raggiunto dal conteggio stesso.
Ad esempio se il contatore arriva al valore 5. comparando tale valore con il valore "k" (una costante) = 5 attiverai l'uscita 5. 
Al valore di preset si attiverà l'uscita Q che, abbinata a un merker, userai per resettare il contatore e ricominciare il ciclo.

Link al commento
Condividi su altri siti

Annalisa Frasso

Grazie per il consiglio,  la FB blink fa proprio al caso mio! Approfitto della sua disponibilità per avere chiarimenti sulla FB counter up da abbinare alla blink. In particolare:

come converto il valore in CV negli outputs corrispondenti?

come si collegano l'uscita Q, un merker (che non ho capito benissimo cosa sia) e il reset per far ricominciare il ciclo?

Mi scuso se i passaggi che chiedo sono alquanto banali, ma prendetele come domande fatte da una neofita che ha tanta voglia di imparare!!

Grazie della disponibilità!!

Link al commento
Condividi su altri siti

il merker è una memoria a un bit che ti serve per trasferire l'informazione da un ramo ad altri rami del programma.
innanzitutto un merker lo devi dichiarare come variabile (locali o globali). Per adesso per comodità mettilo nelle variabili globali. Dovrai dargli un nome, ad esempio "fine ciclo". Una volta che l'hai nominato e salvato (importante salvare progetto sennò non riconosce la dichiarazione) avrai che quel merker si chiamerà "fine ciclo". 
Se adesso dai un'occhio all'immagine ti ho messo il ramo del counter e un ramo per un'uscita. Le altre "n" uscite dovranno comparare il valore de CV con i numeri 2, 3, 4...n

Cattura_elsist.JPG

Link al commento
Condividi su altri siti

Annalisa Frasso

Ho seguito tutte le indicazioni ricevute, ma purtroppo in simulazione non mi funziona...credo sia un problema di definizione di qualche variabile che non riesco ad identificare. Di seguito ci sono gli screen sia del programma che delle variabili globali. Tra le variabili locali vi sono le due FB e la variabile definita appunto "variabile" di tipo UDINT. Inoltre per le altre uscite ho creato dei rami analoghi al primo.Qual'è il problema?

global.thumb.png.f7645f4b57e7ccdba9b8b39

 

LD1.png

Modificato: da Annalisa Frasso
Link al commento
Condividi su altri siti

Allora:
Non puoi mettere il blocco di conteggio con il reset e l'enable sull'uscita di "BLINK" sennò il reset finale sarebbe quanto meno random. BLINK devi farlo su un suo ramo e la sua uscita "OUT" andrà alla variabile "clock" che hai già creato. Il merker "sempre_vero", scusami non te l'ho spiegato. Per "sempre_vero" intendo un merker interno del plc che si chiama "SysAlwaisOn" e significa che è sempre a"1" indipendentemente da altre condizioni di programma (con plc in RUN ovviamente).Lo trovi nella libreria "target Variabili".

Per ultimo: hai messo degli indirizzi sugli ingressi I/O un pò strani...io è un bel pò che non utilizzo il simulatore ma sei sicura che siano giusti? Se non ricordo male devi mettere degli indirizzi bassi tipo "iX0.0" e seguenti e poi cambiare il target dispositivo....però su questo non ci giuro e quindi se hai problemi poi li vediamo dopo..comincia a cambiare la struttura del programma.

Link al commento
Condividi su altri siti

Annalisa Frasso

Bene, ho fatto tutte le modifiche!! Ho creato un primo ramo con BLINK ed in OUT ho messo la variabile clock come COIL POSITIVE. Sul secondo ho eliminato la variabile sempre_vero e messo al suo posto la variabile SysAlwaysOn ed in più nelle variabili locali ho aggiunto a "variabile" il valore iniziale 0. Per quanto riguarda gli indirizzi il data block 255 è riferito agli I/O della CPU. Inoltre avrei un altro dubbio: siccome Q si attiva quando CV e PV coincidono, in PV dovrei mettere il numero degli outputs+1?

Comunque fatto tutto, andando a caricare il programma nel simulatore nella finestra Output di LogicLab mi esce questo errore:

Code generation .. 
Generating constants
Generating function block CTU
Generating function block BLINK
Generating program PRO
Generating unresolved
Generating dynamic links
aborted.
PRO(2$CL:8) - error G0008:  ST => Invalid access to variable

0 warnings, 1 errors.

Come mai?

Link al commento
Condividi su altri siti

Per quanto riguarda gli indirizzi il data block 255 è riferito agli I/O della CPU.

Allora usi la cpu reale per fare il debug...avevo capito che usavi l'emulatore e provavi senza HW. Meglio così. 

 siccome Q si attiva quando CV e PV coincidono, in PV dovrei mettere il numero degli outputs+1?

SI. 

Come mai?

Su due piedi, se hai seguito il tutto non saprei perchè...si dovrebbe vedere l'intero programma e l'intera lista variabili. Tanto per sapere come mai hai definito "variabile" come UDINT? Se l'hai fatto hai messo almeno l'indirizzo in "AUTO" e non mappato? Se l'hai messo mappato devi assicurarti che sia divisibile per 4 mentre se hai mappato un indirizzo a 16 bit dovrà essere divisibile per 2.

Anche il bit "fine ciclo" mappalo "AUTO".

Link al commento
Condividi su altri siti

COIL POSITIVE

Ci ho fatto caso adesso...perchè positive coil? Coil normale è sufficiente. Il fronte di salita  del clock lo vai a leggere a livello di counter e quindi non complicarti la vita. 

Link al commento
Condividi su altri siti

Annalisa Frasso

Bene ci sono riuscita!!!l'errore era proprio su fine_ciclo, quindi impostandola come auto non mi da più errore. Un'ultima cosa...in questo modo i tempi di on/off degli outputs non coincidono con quelli impostati nel blink. Cioè praticamente io imposto in blink un timelow di 4500 e timehigh di 500 perchè voglio che ogni output sia attivo per 500ms e che per l'attivazione tra l'uno e l'altro passi un tempo di 4500ms, invece così ogni output è attivo fino a quando non si attiva il successivo. C'è un modo per modificare questo aspetto?

Link al commento
Condividi su altri siti

La cosa più veloce, visto il programma attuale già in essere, è anteporre ad ogni uscita del comparatore un TOF con tempo 500ms e collegare l'uscita del timer con l'output fisico.
L'uscita di TOF dovrai appoggiarla su un merker poichè l'attivazione del TOF la dovrai fare con un fronte positivo del merker stesso.
Buon lavoro

Link al commento
Condividi su altri siti

Annalisa Frasso

Ho risolto l'ultimo problema, ma diversamente perchè un solo timer non mi dava problemi, ma mettendone altri non mi funzionava più niente..allora ho ragionato un attimo: siccome il contatore mi trasforma l'uscita dalla blink in un segnale che dura complessivamente la somma dei tempi fissati nella blink ho impostato un tempo complessivo di 1000mS (500+500) ed al posto di far attivare ad 1 l'uscita1, a 2 l'uscita2 ecc. faccio andare a vuoto il contatore per 4 conteggi (complessivamente 4 sec) quindi ad 1 si attiva l'uscita1, mentre l'uscita2 si attiva a 5 e così via...forse non è il modo più corretto che ci sia, ma funziona e questo soprattutto grazie al suo prezioso aiuto!!!! Grazie ancora @Lucky67!!

Link al commento
Condividi su altri siti

forse non è il modo più corretto

Si forse non è il più efficiente ma se hai raggiunto il tuo scopo va bene. 

perchè un solo timer non mi dava problemi, ma mettendone altri non mi funzionava più niente

Curioso...sarebbe interessante capire il perchè...se hai dato ai timer dei nomi differenti non vedo perchè più di un timer dovrebbe inficiare il funzionamento... 

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...