Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Come Capire Che Almeno Due Bit Di Una Dword Sono Ad 1?


Messaggi consigliati

Inserito:

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

Ciao


Inserita:

suppongo che per multiplo di due intendi espotenziale di due

Inserita:

Ciao,

Immagini bene ho scritto sbagliato andavo di fretta .

Inserita:

Potresti fare uno Shift Right. Se il bit lsb.

a = 0

loop:

TuaVariabile.0 // lsb della tua variabile

a TuaVariabile.0 // se lsb e' 1, aggiungi 1 al valore di a

a = a + 1

sr1

torna a loop: fino a che hai fatto passare TuaVariabile

Il valore di a ti da' il numero di bit a 1

Spero tu abbia capito.

Inserita:

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

Inserita:

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

Inserita:

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^31

quindi 32 casi possibili, se il tuo valore e diverso da questi 32 valori

sicuramente 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 bits

e per ogni bit trovato alto, attribuire il valore corrispondente al

logaritmo in base 2 (Cioè il valore del esponente del bit trovato) del bit

trovato alto.

esempio 10° bit = 1024 => valore o messaggio da rappresentare =10

ogni volta che trovi un bit alto rappresenti il suo valore, poi attendi

un determinato (Tempo di Visione Messaggio), e poi avanzi nel controllo

dei restanti bits.

al termine del controllo dei 32 bits ripeti il controllo.

Cosi ad intervalli regolari potrai rappresentare tutti i messaggi, in una

sola stringa (Multi-State Display).

Inserita:
Cosi ad intervalli regolari potrai rappresentare tutti i messaggi, in una

sola stringa (Multi-State Display).

Una sorta di autoscroll dei messaggi, insomma? Interessante, anche se forse non è particolarmente utile sulla macchina in questione.

Grazie

Ciao

Inserita:

Non si potrebbe semplicemente testare se il contenuto della Dword e' = o > di 3 (il valore minimo corrispondente a 2 bit alzati) ?. Ciao, Sergio

Inserita:

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

:wub:

Inserita:

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.

Inserita:

testa i singoli bit della word, e con il fronte di salita

incrementa 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 fa

SALUTI

Inserita:

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

Inserita:

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_IF

END_IF

IF contatore >= 2 THEN

visualizzo la barra di scorrimento

END_IF

più o meno potrebbe assomigliare a questo... ;)

Inserita:

mi smentisco da solo : quando il sistema torna ad un solo allarme la barra di scorrimento resta visualizzata...

:angry::angry:

Inserita:

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 1

incrementa un contatore, cosi' saprai quanti bit sono ad 1.

Alla fine dei 32 shift o ad una variazione della Dw originale rimemorizzati la Dw

su quella di appoggio e riparti.

Inserita:

Quante idee! Penso di avere sufficiente materiale su cui ragionare.

Grazie a tutti.

Ciao

Inserita:

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?

Saluti

Vincenzo

Inserita:

> Ma la funzione BITSUM: FC99 di libreria standard non fa al caso tuo?

Bah, ma farselo da sè è sicuramente più stimolante ;)

ciao

Inserita:

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

Inserita:

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:=MW5

Tutto qui.

Ciao

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