Vai al contenuto
PLC Forum


trovare nuovo allarme


daniele__32

Messaggi consigliati

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


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

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

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

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: da leleviola
Link al commento
Condividi su altri siti

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

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