Vai al contenuto
PLC Forum


Controllo stato bit all'interno di una DB


Messaggi consigliati

Inserito:

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


Inserita:

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

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

Inserita:

Ciao,

ricordo una discussione simile proprio su questo forum e qualcuno che aveva postato una ottima soluzione...

Inserita:

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

 

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