Vai al contenuto
PLC Forum


Gestione Allarmi - FB in ST parametrizzabile CJ1M cpu 22


Messaggi consigliati

Inserito:

Salve a tutti, vorrei raccogliere alcune informazioni,poichè sto tentando di crearmi un FB in linguaggio ST per gestire gli allarmi; ecco cosa vorrei realizzare:

Un blocco in cui inserire la wd iniziale e finale dei miei allarmi,supponiamo di avere 10 stazioni, di solito mi tengo 16 bit per ogni stazione, quindi 16x 10 160 bit ossia 10word (w100-w109),non tutti i bit chiaramente sono utilizzati, alcuni rimango di scorta.Al verificarsi di un allarme, vorrei richiamare la sua pagina relativa,(non uso pannelli Omron)se ci sono piu' allarmi contemporaneamente,visualizzo la pagina del primo,attendo un tempo TimX,poi visualizzo la pagina dell'allarme della stazione sucessiva e cosi' via.

Per spostarmi da una pagina all'altra devo scrivere il numero di pagina agganciato al relativo allarme in una word.

Ingressi del mio FB --> word ch iniziale degli allarmi (es. W100), word finale degli allarmi (es. W109)

tempo di pausa in decimi Timx

Uscite del mio FB --> DM contenente il mio numero di pagina

Pensavo di usare una sorta di shift register in cui far scorrere in modo ciclico un "1" per 10wd, poi contemporaneamente fare un AND logico delle mie 10wd con le 10wd che "scorrono" in modo che al verificarsi de un allarme,il mio risultato è > di 0,fermo il clock dello shift register per il tempo TimX, e in qualche modo mi calcolo la pagina corretta da visualizzare.....

Il mio problema è che non mastico tanto il linguaggio ST.... :senzasperanza: , potrei usare dei cicli for ? che succede alla cpu se si va in loop con il ciclo for ? Si possono usare degli array e in che modo ? qualcuno ha esperienza a riguardo ??

Grazie in anticipo per eventuali suggerimenti. :thumb_yello:


Inserita:
Il mio problema è che non mastico tanto il linguaggio ST.... ,

potrei usare dei cicli for ?

che succede alla cpu se si va in loop con il ciclo for ?

Si possono usare degli array e in che modo ?

- Darei un'occhiata al manuale W447-E1-08 - "OPERATION MANUAL Function Blocks/Structured Text"

- I cicli FOR si possono usare tranquillamente

- Se va in loop, probabilmente superi il tempo massimo di ciclo e va in allarme la CPU

- Gli array si possono usare (anche a bit) nella forma - array[indice] -

Ricorda poi che i temporizzatori in ST te li devi costruire te!!

Inserita:

ok....per i timer intendi che mi costruisco un contatore diciamo che incrementi una variabile interna ogni decimo di secondo...poi confrontando il valore impostato dal FB TimX con il valore che si incrementa tengo traccia del tempo trascorso ...??

Hai qualche esempio per gli array...? E' possibile usare un array del tipo Allarmi[num_tot_allarmi] dove l'indice "num_tot_allarmi" viene caricoto da una variabile ingresso del FB ??

Qualcuno ha già esperienza con una gestione di allarmi simile ?? se sì come ha risolto ??

Grazie :rolleyes:

Inserita:

Ciao,

non puoi usare la funzione timer in un blocco FB con il linguaggio ST. Quindi, si, ti devi costruire dei contatori all'interno del blocco.

Gli array e la loro dimensione devono essere dichiarati in fase di progettazione del blocco, non è possibile creare array o dimensionarli in maniera dinamica.

Per l'indice dell'array puoi usare sia una variabile interna che una passata come parametri di ingresso al blocco.

Inserita:

Ok la funzione classica Tim xxx #100 non si può usare e fin qui capisco , ma come fai a creare un contatore , voglio dire come dai il clock alla variabile che incrementi o decrementi per poi usarla quando il PV e = SV ? devo sfruttare i collegamenti esterni al blocco ??

Hai qualche esempio ??

Te ne sarei molto grato..... :)

Ciao

Inserita:

Ciao,

l'unico modo (almeno che io sappia, e mi piacerebbe molto essere smentito) è appunto quello di incrementare o decrementare una variabile in base ad un bit di clock del sistema. Il bit lo puoi mettere sia come variabile di ingresso, sia come variabile esterna, sia come variabile interna tramite settaggio AT.

Qui trovi un esempio.

Per quanto riguarda gli array....ci sarebbe un modo per evitare di dichiarare la dimensione, che magari è grande, in fase di progettazione della variabile.

Potresti dichiarare la variabile array con AT = DM0 con dimensione array = 1, a questo punto (tramite l'indice dell'array) puoi puntare a qualsiasi DM.

Spero di essermi spiegato bene.

Questo sistema funziona con le ultime versioni di CX-Programmer e CPU, con quelle più "vecchie" non so.

Buon lavoro.

  • 1 month later...
Inserita:

Alto Modo Che Conosco Ma Sicuramente Più Complessa E' Quella Di Sfruttare La Nidificazione Degli FB Ossia:

Costruisci Un FB Ladder Dove All'interno Metti Un Timer o Più Timer Se Ti Crei Un Indice.

Dall'FB In ST Richiami L'FB Ladder Passandogli Variabili Di Ingresso E Uscita.

E' Chiaro Che Per L'Utilizzo Di 1 Solo Timer La Procedura Non Conviene Ma Se Dovessi Utilizzarne Diversi La Cosa Diventa Più Semplice.

Per Un Solo Timer Eventualmente Ti Conviene Incrementare Una Variabile All'Interno Dell'FB E Confrontare Il Target.

Per La Tua Ciclica Allarmi Sicuramente Ti Conviene Costruirla In Formato Ladder, Perchè Per Eseguirla In Modo Semplice E Funzionale Devi Settare Una Memoria Con Il Fronte Di Salita Dell'Allarme, Che Ti Interblocci Lo SFT, Ogni Qualvolta Che L'Allarme Attivo Deve Essere Visualizzato. La Memoria Fa Partire Il Timer Che Al Termine Del Conteggio Riporta La Memoria a 0 e Fa Ripartire Lo SFT.

Ciao.

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