mikir94 Inserito: 12 dicembre 2016 Segnala 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!!
STEU Inserita: 12 dicembre 2016 Segnala 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
Lucky67 Inserita: 12 dicembre 2016 Segnala 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...
drugo66 Inserita: 13 dicembre 2016 Segnala Inserita: 13 dicembre 2016 Ciao, ricordo una discussione simile proprio su questo forum e qualcuno che aveva postato una ottima soluzione...
DesmoGiec Inserita: 13 dicembre 2016 Segnala 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.
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