Cesare Nicola Inserito: 22 novembre 2006 Segnala Inserito: 22 novembre 2006 Ciao a tutti.Ho l'impressione che sto facendo una domanda stupida, la cui soluzione è sotto il naso, ma finora non l'ho trovata. Ho una doppia word e vorrei sapere quando almeno due bit della dword sono ad "1", qualunque essi siano. Cioè, se ci sono zero o un bit ad "1" non faccio niente: non appena i bit ad "1" diventano 2, faccio qualcosa.Spero di essere stato chiaro. GrazieCiao
irpick Inserita: 22 novembre 2006 Segnala Inserita: 22 novembre 2006 a= valore -multiplo di due (loop)se >o due bit alzati
Piero Azzoni Inserita: 22 novembre 2006 Segnala Inserita: 22 novembre 2006 suppongo che per multiplo di due intendi espotenziale di due
irpick Inserita: 22 novembre 2006 Segnala Inserita: 22 novembre 2006 Ciao, Immagini bene ho scritto sbagliato andavo di fretta .
Ron the bon Inserita: 22 novembre 2006 Segnala Inserita: 22 novembre 2006 Potresti fare uno Shift Right. Se il bit lsb.a = 0loop:TuaVariabile.0 // lsb della tua variabilea TuaVariabile.0 // se lsb e' 1, aggiungi 1 al valore di aa = a + 1sr1torna a loop: fino a che hai fatto passare TuaVariabileIl valore di a ti da' il numero di bit a 1Spero tu abbia capito.
mynameisrex Inserita: 22 novembre 2006 Segnala Inserita: 22 novembre 2006 Domanda x Nicola : quando la tua double ha già un bit a 1, può avvenire uno scambio contemporaneo di due bit (ovvero che nello stesso ciclo PLC un altro bit va a 1 mentre il primo torna a 0) ?Ovvero, in condizioni "normali", dopo che un bit è andato a 1 tutta la double torna poi a 0 ?...in quel caso ci sarebbe una soluzione forse più semplice...
Cesare Nicola Inserita: 22 novembre 2006 Autore Segnala Inserita: 22 novembre 2006 La mia dword è l'area di interfaccia tra hmi e plc, per la visualizzazione di messaggi. Ad ogni bit corrisponde un messaggio da visualizzare. Significa che i bit possono andare su e giù liberamente, a seconda di cosa accade alla macchina. Forse dovevo dirlo prima, scusate. Ciò che voglio fare non è di estrema importanza, ma l'argomento è comunque stimolante. Siccome il pannelllo visualizza al massimo due messaggi alla volta, perchè così ho scelto io nel layout della pagina, vorrei segnalare all'operatore, accendendo il pulsante di "page down", che esistono altri allarmi da visualizzare, oltre ai due già visibili.Ciao
Henon Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Se Posso aiutarti in questa maniera:Prova eseguire il confronto (se diverso da) con i seguenti valori:0,1,2,4,8,16,32,......2^31quindi 32 casi possibili, se il tuo valore e diverso da questi 32 valorisicuramente hai 2 o più bit alti.puoi eseguire 32 confronti in contemporanea oppure scansionarli con un Loop da bit0 al bit31.Mentre per fare una subroutine che tu dici, dovresti scansionare i 32 bitse per ogni bit trovato alto, attribuire il valore corrispondente allogaritmo in base 2 (Cioè il valore del esponente del bit trovato) del bittrovato alto.esempio 10° bit = 1024 => valore o messaggio da rappresentare =10ogni volta che trovi un bit alto rappresenti il suo valore, poi attendiun determinato (Tempo di Visione Messaggio), e poi avanzi nel controllodei restanti bits.al termine del controllo dei 32 bits ripeti il controllo.Cosi ad intervalli regolari potrai rappresentare tutti i messaggi, in unasola stringa (Multi-State Display).
Cesare Nicola Inserita: 23 novembre 2006 Autore Segnala Inserita: 23 novembre 2006 Cosi ad intervalli regolari potrai rappresentare tutti i messaggi, in unasola stringa (Multi-State Display).Una sorta di autoscroll dei messaggi, insomma? Interessante, anche se forse non è particolarmente utile sulla macchina in questione.GrazieCiao
tavazzi Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Non si potrebbe semplicemente testare se il contenuto della Dword e' = o > di 3 (il valore minimo corrispondente a 2 bit alzati) ?. Ciao, Sergio
Ron the bon Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Per sapere quanti allarmi hai devi fare 32 volte una loop o 32 volte un confronto con un valore 2^n.Pero' ora mi sorge una domanda riguardo il bit 31. Se e' a uno, il valore della variabile diventa negativo, quindi non si puo' piu' dire se il valore e' > di un certo valore.
Cristina Fantoni Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Non si potrebbe semplicemente testare se il contenuto della Dword e' = o > di 3 (il valore minimo corrispondente a 2 bit alzati) ?L'avevo pensato anche io, poi ci ho ragionato meglio ed ho realizzato che qualsiasi bit sia a 1 dopo il bit X2 rende il valore della word sicuramente >3...
dago_ Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Esempio, se facciamo finta che il fronte di salita di un allarme incrementa una word e viceversa il fronte di discesa la decrementa ? Forse cosi posso sapere perfino quanti allarmi ho attivato.Ma forse il problema e' piu' complicato.
RDA Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 testa i singoli bit della word, e con il fronte di salitaincrementa un'altra word di 1.Lo stesso bit sul fronte di discesa fai decrementare la word di conteggio s.d.Fai un confronto tra la word di conteggio e la costante 2 e il tutto funziona.Comunque il problema e stato gia dibattuto qualche mese faSALUTI
Ecup Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 La cosa più stupida che mi viene in mente è fare un loop con un puntatore e incrementare un contatore ogni volta che trovi un bit a uno. Sto pensando ad altri metodi, ma non trovo soluzioni più "furbe"... per esempio, potresti verificare se è diverso da 0, 1, 2, 4, 8, 16, 32, 64, ecc..., ma non è che venga qualcosa di più ottimizzato, neanche se esamini i singoli byte... resto sempre sulla prima idea...ciao
mynameisrex Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Secondo me l'idea di dago è percorribile.Anzichè fare n fronti per n allarmi, però, è sufficiente memorizzare la double e verificare quando il valore reale cambia rispetto alla sua memorizzazione :IF doublereale <> doublememorizzata THEN doublememorizzata := doublereale IF doublereale = 0 THEN contatore = 0 ELSE contatore := contatore + 1 END_IFEND_IFIF contatore >= 2 THEN visualizzo la barra di scorrimentoEND_IFpiù o meno potrebbe assomigliare a questo...
mynameisrex Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 mi smentisco da solo : quando il sistema torna ad un solo allarme la barra di scorrimento resta visualizzata...
ale1979 Inserita: 23 novembre 2006 Segnala Inserita: 23 novembre 2006 Memorizzati la Dw su una di appoggio, shifta la Dw di appogio di un bit per volta per 32 volte se in contri un bit ad 1incrementa un contatore, cosi' saprai quanti bit sono ad 1.Alla fine dei 32 shift o ad una variazione della Dw originale rimemorizzati la Dwsu quella di appoggio e riparti.
Cesare Nicola Inserita: 24 novembre 2006 Autore Segnala Inserita: 24 novembre 2006 Quante idee! Penso di avere sufficiente materiale su cui ragionare.Grazie a tutti.Ciao
Vince73PLC Inserita: 24 novembre 2006 Segnala Inserita: 24 novembre 2006 Ciao a tutti,cerco di dare un mio contributo sebbene sia ancora poco esperto!Ma la funzione BITSUM: FC99 di libreria standard non fa al caso tuo?SalutiVincenzo
mynameisrex Inserita: 24 novembre 2006 Segnala Inserita: 24 novembre 2006 Grande !!! Qualcuno l'aveva già inventata...
dago_ Inserita: 24 novembre 2006 Segnala Inserita: 24 novembre 2006 Accipicchia, che cioccolatai Grazie Vincens
Ecup Inserita: 24 novembre 2006 Segnala Inserita: 24 novembre 2006 > Ma la funzione BITSUM: FC99 di libreria standard non fa al caso tuo?Bah, ma farselo da sè è sicuramente più stimolante ciao
fedesara Inserita: 24 novembre 2006 Segnala Inserita: 24 novembre 2006 Io sono due giorni che penso cerco e mi scervello non postando nulla perchè mi veniveno in mente solo soluzioni che complicavano il problema anzichè risolverlo....
Cesare Nicola Inserita: 24 novembre 2006 Autore Segnala Inserita: 24 novembre 2006 Bel colpo, grazie. L'ho già provata e funziona esattamente come volevo. E' anche più semplice di come descritto nel manuale, dove sono riportati un parametro IN ed uno OUT, che invece non vengono proposti al richiamo del blocco: CALL "BITSUM" IN :=MD0 RET_VAL:=MW5Tutto qui.Ciao
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