biondo Inserito: 28 novembre 2009 Segnala Inserito: 28 novembre 2009 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 TimxUscite del mio FB --> DM contenente il mio numero di paginaPensavo 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.... , 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.
pcontini Inserita: 28 novembre 2009 Segnala Inserita: 28 novembre 2009 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!!
biondo Inserita: 28 novembre 2009 Autore Segnala Inserita: 28 novembre 2009 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
0.0 Inserita: 30 novembre 2009 Segnala Inserita: 30 novembre 2009 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.
biondo Inserita: 30 novembre 2009 Autore Segnala Inserita: 30 novembre 2009 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
0.0 Inserita: 30 novembre 2009 Segnala Inserita: 30 novembre 2009 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.
bonibellid Inserita: 3 gennaio 2010 Segnala Inserita: 3 gennaio 2010 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora