daniele__32 Inserito: 16 ottobre 2020 Segnala Share Inserito: 16 ottobre 2020 Ciao a tutti, chiedevo per curiosita' e anche per cercare il modo ottimale, la presenza di un nuovo allarme . suppongo di avere una DB con 100 bit e di avere il bit 10.0 attivo per anomalia..segue quindi segnalazione acustica e visiva. Come posso trovare in tale DB la presenza di un secondo nuovo allarme in modo da ridare la segnalazione? grazie. Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 16 ottobre 2020 Segnala Share Inserita: 16 ottobre 2020 Ciao, Dipende da chi spegne l'allarme acustico e quello luminoso. Io tengo una area uguale a quella di allarme per la tacitazione e una per akwnoledge. Se l'allarme viene tacitato ma non riconosciuto la sirena per quellalrme non suonerà più, se invece viene anche riconosciuto al prossimo allarme risuonerà.....detta un po' di corsa... Link al commento Condividi su altri siti More sharing options...
daniele__32 Inserita: 16 ottobre 2020 Autore Segnala Share Inserita: 16 ottobre 2020 e io posso resettare da pulsante fisico, d un pulsante da un PC..quindi come lo fai il confronto fra le aree? Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 16 ottobre 2020 Segnala Share Inserita: 16 ottobre 2020 47 minuti fa, daniele__32 ha scritto: quindi come lo fai il confronto fra le aree? Dipende da come hai strutturato il tuo codice. Fai un confronto a bit nel blocco degli allarmi, immagino tu abbia un FC,FB... generale... Ciao Link al commento Condividi su altri siti More sharing options...
Max.bocca69 Inserita: 16 ottobre 2020 Segnala Share Inserita: 16 ottobre 2020 Crei un bit che si alza quando c'è una variazione, basta fare un confronto tra l'attuale e un precedente dove dopo il confronto il precedente é uguale all attuale. Link al commento Condividi su altri siti More sharing options...
leleviola Inserita: 16 ottobre 2020 Segnala Share Inserita: 16 ottobre 2020 (modificato) io faccio un trasferimento della DB o dei bit degli allarmi in un'altra identica struttura di dati al momento dell'acquisizione dell'allarme presente (pressione di un tasto o di un campo RESET sul pannello HMI) e sempre faccio un confronto fra le due strutture di dati e se non sono uguali faccio suonare e segnalare l'eventuale segnalazione sonora o visiva, in automatico se le due strutture sono diverse è automatica l'attivazione della sirena o della segnalazione, quando l'operatore acquisisce ogni nuova condizione la segnalzione non si attiva perchè entrambe le strutture di dati sono identiche, appena un nuovo allarme arriva l'ultima struttura acquisita è diversa da quella attuale e la segnalazione si attiva. E' ovvio che al momento dell'acquisizione allarme l'operatore a video prima di acquisire vede l'allarme attivo e al momento dell'acquisizione allarme se le condizioni lo permettono l'allarme viene azzerato o cancellato e memorizzata l'ultima struttura dei dati allarme, ogni cambiamento di qualsiasi bit allarme crea una nuova segnalazione Modificato: 16 ottobre 2020 da leleviola Link al commento Condividi su altri siti More sharing options...
daniele__32 Inserita: 20 ottobre 2020 Autore Segnala Share Inserita: 20 ottobre 2020 grazie mille a tutti Link al commento Condividi su altri siti More sharing options...
batta Inserita: 21 ottobre 2020 Segnala Share Inserita: 21 ottobre 2020 Ci sono molti modi. Uno di questi, è il seguente: - Struttura di bit di allarmi, con ogni allarme con il suo bel nome simbolico, che aiuta la programmazione - Trasferimento della struttura di bit in un array di word con istruzione GATHER o GATHER_BLK - L'array di word risulta già pronto anche per l'utilizzo come variabili di allarmi nel HMI Siemens, senza bisogno di scambiare byte od altro (con GATHER, il primo bit viene scritto come bit meno significativo della word) - Un array di word dove memorizzare lo stato degli allarmi per poter rilevare entrata nuovo allarme. Funziona tutto anche con blocchi ottimizzati, il che non guasta. Questo è un esempio di codice di una funzione che, oltre a quanto descritto sopra, gestisce anche una maschera per filtrare allarmi e avvisi. La funzione restituisce presenza allarme, presenza avviso, entrata nuovo allarme (on una scansione), entrata nuovo avviso (on una scansione). Con qualche piccola modifica si può adattare alle proprie esigenze, magari eliminando la parte di mascheramento allarmi/avvisi se non serve, o aggiungendo un comando in ingresso per fare il reset degli allarmi. Da notare che gli array, all'interno della funzione, sono dichiarati con dimensione non definita, quindi va sempre bene, per array di word di qualunque dimensione. Importante, ovviamente, che l'array dove memorizzare lo stato degli allarmi e quello (eventuale) di mascheratura allarmi/avvisi, siano di dimensioni adeguate. FUNCTION "RilevaAllarmi" : Void { S7_Optimized_Access := 'TRUE' } AUTHOR : batta VERSION : 0.1 VAR_OUTPUT AlmPresent : Bool; AlmNew : Bool; WrnPresent : Bool; WrnNew : Bool; END_VAR VAR_IN_OUT actAlmArray : Array[*] of Word; oldAlmArray : Array[*] of Word; wrnMaskArray : Array[*] of Word; END_VAR VAR_TEMP tmpFirstElement : DInt; tmpLastElement : DInt; i : Int; tmpAlmWord : Word; tmpWrnWord : Word; tmpPrevStatusWord : Word; END_VAR BEGIN // Rileva primo e ultimo elemento dell'array #tmpFirstElement := LOWER_BOUND(ARR := #actAlmArray, DIM := 1); #tmpLastElement := UPPER_BOUND(ARR := #actAlmArray, DIM := 1); #AlmNew := #AlmPresent := FALSE; #WrnNew := #WrnPresent := FALSE; // Allarmi e avvisi sono nelle stesse aree. // Per distinguere se si tratta di allarme o di avviso, si controlla lo stato dell'area MASK: // bit TRUE = Avviso; bit FALSE = Allarme // FOR #i := #tmpFirstElement TO #tmpLastElement DO // Appoggia allarmi, avvisi e stato precedente a variabili locali #tmpAlmWord := #actAlmArray[#i] AND NOT #wrnMaskArray[#i]; #tmpWrnWord := #actAlmArray[#i] AND #wrnMaskArray[#i]; #tmpPrevStatusWord := #oldAlmArray[#i]; //Rileva entrata nuovo allarme IF (#tmpAlmWord AND #tmpPrevStatusWord) <> 0 THEN #AlmNew := TRUE; END_IF; //Rileva presenza allarme IF #tmpAlmWord <> 0 THEN #AlmPresent := TRUE; END_IF; //Rileva entrata nuovo avviso IF (#tmpWrnWord AND #tmpPrevStatusWord) <> 0 THEN #WrnNew := TRUE; END_IF; //Rileva presenza avviso IF #tmpWrnWord <> 0 THEN #WrnPresent := TRUE; END_IF; //Memorizza stato inverso allarmi e avvisi #oldAlmArray[#i] := NOT #actAlmArray[#i]; END_FOR; END_FUNCTION Link al commento Condividi su altri siti More sharing options...
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