mikir94 Inserito: 12 dicembre 2016 Segnala Share Inserito: 12 dicembre 2016 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 More sharing options...
STEU Inserita: 12 dicembre 2016 Segnala Share Inserita: 12 dicembre 2016 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 More sharing options...
Lucky67 Inserita: 12 dicembre 2016 Segnala Share Inserita: 12 dicembre 2016 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 More sharing options...
drugo66 Inserita: 13 dicembre 2016 Segnala Share Inserita: 13 dicembre 2016 Ciao, ricordo una discussione simile proprio su questo forum e qualcuno che aveva postato una ottima soluzione... Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 13 dicembre 2016 Segnala Share Inserita: 13 dicembre 2016 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. 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