Vai al contenuto
PLC Forum


Confronto Di Word Con Or Esclusivo A Parola


manuel.cmp

Messaggi consigliati

Salve a tutti, sono un nuovo utente e da un pò di tempo ho iniziato a cimentarmi con questo plc.

Lo sto usando applicato ad un rack vipa.

Il mio problema consiste nel voler settare la sirena di allarme ogni volta che esce un'allarme nuovo dell'impianto.

Mi spiego se ci riesco.

Ho puntato tutti gli allarmi del fantomatico impianto su due "dbw" ad ogni bit corrisponde un'allarme.

In tutto allora ho 32 bit e alla comparsa di uno qualsiasi la sirena inizia a suonare.

Ho poi aggiunto il pulsante di tacitazione della sirena.

Quello che desidero fare è che se si verifica un'allarme qualsiasi e la sirena inizia a suonare la posso andare a tacitare

ma se non resetto l'allarme e compare un altro allarme la sirena deve riprende a suonare.

Naturalmente al reset degli allarmi tutto si ripristina e torna a zero.

Sto programmando in AWL e penso si debba usare la funzione di OR ESCLUSIVO DELLA WORD ma non ne sono sicuro ed anche provando

sto avendo parecchie difficoltà.

Qualcuno saprebbe illuminarmi?

Grazie a tutti

Link al commento
Condividi su altri siti


Ciao io farei una cosa così, anche se con AWL sono un po' arrugginito:

L DBxxx.DBDyy          //Doppia word con allarmi
L Allarmi_prec         //Valore ciclo precedente della doppia word di allarmi
<>D                    //Confronto dei valori
= Sirena               //Abilito allarme (si può anche resettare la tecitazione

L DBxxx.DBDyy          //Carico doppia word di allarmi
T Allarmi_prec         //E aggiorno valore
Link al commento
Condividi su altri siti

Secondo me se vuoi un allarme cumulativo basta che leggi se la parola è > di 0. Se lo è vuol dire che hai almeno un bit settato. Il reset poi rimetterà la parola col valore zero

Link al commento
Condividi su altri siti

Con il sistema proposto da "elettrix01" il bit "Sirena" rimane alto per una scansione sia quando entra un nuovo allarme, sia quando un allarme esce.

Con quello proposto da "Lucky67" invece, si rileva solo la presenza o meno di allarmi, ma non succede nulla se entra un nuovo allarme quando sono già presenti altri allarmi.

Sto programmando in AWL e penso si debba usare la funzione di OR ESCLUSIVO DELLA WORD ma non ne sono sicuro

Con un OR esclusivo tra lo stato attuale e quello precedente degli allarmi, il risultato dell'operazione sarebbe diverso da zero sia con allarme entrante, sia con allarme uscente.

Si dovrebbe quindi filtrare il risultato dell'OR esclusivo mettendolo in AND con lo stato attuale degli allarmi.

Io di solito faccio così:

      L     #WordAlmAct                 //Carica stato attuale allarmi
      L     #WordAlmOld                 //Carica stato allarmi precedente scansione
      INVI                              //Inverte stato allarmi precedente scansione
      UW                                //Se il risultato di AND WORD è <> 0,
      L     0                           //significa che è entrato almeno un nuovo allarme
      <>I   
      =     #NewAlm

      L     #WordAlmAct                 //Memorizza stato attuale allarmi
      T     #WordAlmOld                 //per prossimo controllo

Con l'istruzione INVI vengono invertiti tutti i bit della word. Mi troverò quindi il bit a zero se l'allarme era già presente, ed il bit a 1 se l'allarme non era presente.

Ecco che quindi avrò la combinazione di due bit entrambi alti solo se l'allarme ora è presente, ma non lo era nella precedente scansione.

In forma più stringata si potrebbe anche scrivere così:

      L     #WordAlmOld                 //Carica stato allarmi precedente scansione
      INVI                              //Inverte stato allarmi precedente scansione
      L     #WordAlmAct                 //Carica stato attuale allarmi
      T     #WordAlmOld                 //Memorizza stato allarmi per prossimo controllo
      UW                                //Se il risultato di AND WORD è <> 0,
      L     0                           //significa che è entrato almeno un nuovo allarme
      <>I   
      =     #NewAlm
Link al commento
Condividi su altri siti

Per ripetere il controllo per un certo numero di variabili di allarmi, mi sono costruito una funzione alla quel passo il numero del DB contenente le variabili degli allarmi, il byte di inizio dell'area degli allarmi attivi, il byte di inizio dell'area dove vado a memorizzare lo stato degli allarmi, il numero di word da controllare.

La funzione mi restituisce un bit che rileva la presenza di uno o più allarmi attivi, ed un bit che si attiva per una scansione quando entra un nuovo allarme.

Di seguito c'è il sorgente di questa funzione.

ATTENZIONE!!!

Compilando la funzione senza apportare modifiche, verrà generata la FC121. Se nel progetto esiste già una FC121 questa verrà irrimediabilmente sovrascritta, senza nessuna richiesta di conferma dal sistema.

Basta modificare a piacere il numero della FC da generare, nella prima riga del sorgente.

N.B.: le aree degli allarmi attivi e allarmi old devono essere nello stesso DB.

Per ottenere una funzione leggera, non ho implementato controlli sulla correttezza dei parametri passati (es. sovrapposizione delle aree allarmi attivi e allarmi old, se il DB esiste ed altro). Dovrà essere quindi cura del programmatore accertarsi di inserire dati corretti.

FUNCTION FC 121 : VOID
TITLE =Memorizza All., rileva All. attivo, All. in memoria e nuovo All.
AUTHOR : batta
VERSION : 0.1


VAR_INPUT
  DB_Alm : BLOCK_DB ;	//DB allarmi
  By_Str_Act : INT ;	//Numero primo byte blocco variabili allarmi attivi
  By_Str_Old : INT ;	//Numero primo byte blocco variabili allarmi precedente scansione
  N_Word : INT ;	//Numero di WORD di allarme
END_VAR
VAR_OUTPUT
  Act : BOOL ;	//Presenza allarme attivo
  New : BOOL ;	//Presenza nuovo allarme
END_VAR
VAR_TEMP
  Adr_AlmAct : DWORD ;	//Indirizzo in formato DWORD della variabile allarmi attivi da controllare
  Adr_AlmOld : DWORD ;	//Indirizzo in formato DWORD della variabile allarmi precedente scansione
  ID : INT ;	//Indice per LOOP
END_VAR
BEGIN
NETWORK
TITLE =Inizializza a ZERO flags risultato

      SET   ; 
      R     #Act; 
      R     #New; 

NETWORK
TITLE =Inizializza indirizzi

//Trasforma numero byte del blocco variabili allarmi
//in puntatore in formato DWORD

      L     #By_Str_Act; 
      ITD   ; 
      SLD   3; 
      T     #Adr_AlmAct; 

      L     #By_Str_Old; 
      ITD   ; 
      SLD   3; 
      T     #Adr_AlmOld; 

NETWORK
TITLE =Controlla presenza all. attivo e nuovo all.

//Apri DB allarmi
      AUF   #DB_Alm; 

//Inizializza indice per LOOP
      L     #N_Word; 
NEXT: T     #ID; 

//Per rilevare nuovo allarme, eseguo AND tra variabile allarmi attivi
//e variabile con bit invertiti allarmi precedente scansione.
//Se risultato <> ZERO, significa nuovo allarme.
      L     DBW [#Adr_AlmOld]; //Carica stato allarmi precedente controllo
      INVI  ; //Inverti stato di tutti i bit
      L     DBW [#Adr_AlmAct]; //Carica stato allarmi attivi
      T     DBW [#Adr_AlmOld]; //Memorizza stato allarmi attivi per prossimo controllo
      UW    ; //Rileva nuovo allarme
      L     0; 
      <>I   ; 
      S     #New; //SET nuovo allarme

//Rileva presenza allarme
      L     DBW [#Adr_AlmAct]; //Carica allarmi attivi
      L     0; //Controlla presenza allarmi attivi
      <>I   ; 
      S     #Act; 

//Incrementa di una word (16 bit) indirizzo variabile allarmi attivi
      L     #Adr_AlmAct; 
      +     L#16; 
      T     #Adr_AlmAct; 

//Incrementa di una word (16 bit) indirizzo variabile allarmi in memoria
      L     #Adr_AlmOld; 
      +     L#16; 
      T     #Adr_AlmOld; 

      L     #ID; 
      LOOP  NEXT; 

END_FUNCTION
Link al commento
Condividi su altri siti

Vi ringrazio per le risposte. Adesso procederò a fare delle prove con le varie opzioni da voi consigliatemi e vi saprò dire riguardo i risultati

Credo comunque che la via della funzione sia la più pratica almeno una volta che si è creata ma credo anche che sia un pò fuori

ancora dalla mio livello di programmazione.

Provo. Grazie delle risposte.

Link al commento
Condividi su altri siti

Ciao,

allora ho provato le soluzioni e devo dire che la soluzione indicatomi da Batta è proprio quello che cercavo,

certo non ho usato or esclusivo come credevo di dover fare ma il risultato è proprio quello che

cercavo.

Grazie ancora

ciao

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