Vai al contenuto
PLC Forum


Controllo stato bit all'interno di una DB


mikir94

Messaggi consigliati

Ciao a tutti,

Sto cercando una soluzione rapida e indolore per controllare lo stato dei bit di una DB,   ( step 7  s7-300 )

Mi spiego meglio :

Ho un db composta da circa 100 Word e ad ogni bit corrisponde un allarme,

Quello che voglio fare è controllare se un bit dalla dbw0 alla dbw 100 ha come valore 1 o 0  senza dover controllare una word per volta

 

Spero in un vostro aiuto !

Ciao!!

Link al commento
Condividi su altri siti


Scusa ma è una domanda strana.

 

U DBx.DBXm.n

 

dove x è il numero del DB

m il numero del byte della DB

n è il numero del bit del bYtae

 

Esempio

U db10.dbx14.3

 

probabilmente la tua domanda è più complessa prova a spiegarti meglio

Link al commento
Condividi su altri siti

Quote

 

probabilmente la tua domanda è più complessa prova a spiegarti meglio

Quote

 senza dover controllare una word per volta

 

 

Al volo mi verrebbe di fare una FB di controllo e poi passare in continuazione come parametro di input le dbw scansionate a loro volta da un "incrementatore" con un tempo che stabilisci tu...

Link al commento
Condividi su altri siti

Puoi controllare che la word sia diversa da 0 per sapere se qualcosa è in allarme, senza sapere cosa effettivamente sia in allarme.

Ad esempio:

db1.dbx0.0 = emergenza premuta, e lo sai.

Se vuoi fare un controllo generale su una qualsiasi emergenza intervenuta, controllerai così:

L DB1.DBW0 // carico la dbw0

L 0 // carico 0

<>I // se la word è diversa da 0

= bit di appoggio o altre istruzioni di compare in or tra loro

 

Altrimenti..

Uno snippet che puoi usare (l'ho fatto al volo, perdona la "rudezza" del codice)

      UN    #TRIGGER
      SPB   END
      L     0
      T     #WORD_DIVERSE_DA_0
      T     #BIT_TOTALI_A_1
      L     P##START_ADDR
      LAR1  
      L     W [AR1,P#0.0]
      T     #NUM_DB
      L     D [AR1,P#2.0]
      LAR1  
      AUF   DB [#NUM_DB]
LOOP: L     DBW [AR1,P#0.0]
      L     0
      <>I   
      SPBN  _0
      L     #WORD_DIVERSE_DA_0
      +     1
      T     #WORD_DIVERSE_DA_0
      L     DBW [AR1,P#0.0]
      T     #APP
      CALL  "BITSUM"
       IN     :=#APP
       RET_VAL:=#APP_B_1
      L     #APP_B_1
      L     #BIT_TOTALI_A_1
      +I    
      T     #BIT_TOTALI_A_1
_0:   NOP   0
      L     #SW_EXEC
      +     1
      T     #SW_EXEC
      L     #LENGHT
      L     #SW_EXEC
      ==I   
      SPB   END
      +AR1  P#2.0
      SPA   LOOP
END:  SET   
      R     #TRIGGER

Copia incolla questo codice in un fc nuovo.

La funzione richiama il blocco standard bitsum, quindi dovrai caricare anche quello (lo trovi nella libreria, FC99).

Definisci nell'interfaccia:

 

IN:

Trigger, tipo bool

Start_Addr, tipo pointer

Lenght, tipo int

 

OUT:

Word_diverse_da_0, tipo int

Bit_totali_a_1, tipo int

 

TEMP:

Num_DB, tipo int

SW_exec, tipo int

App, tipo dword

App_b_1, tipo int

 

 

Richiamerai questo fc da un fc a scelta (o ob, o quel che vuoi).

Imposterai il trigger per attivare il ciclo, il punto di partenza dal quale vuoi cominciare a controllare e la lunghezza di quante word vuoi controllare.

 

Ti restituirà il numero di word non a 0 e il numero totali di bit trovati a 1.

 

 

Occhio che non ho incluso un controllo sull'effettiva lunghezza disponibile dell'area che controlli, se la superi il programma cicla ugualmente.

bjSzTEi.png

 

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