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




Risultato Logico Combinatorio Di Bit - Risultato logico combinatorio di bit


Messaggi consigliati

Inserito:

Buongiorno,

avrei bisogno di aiuto per risolvere una questione che a me sembrava estremamente banale:

un'operazione logica ha come ingressi n bool,

il risultato deve essere 1 solo se uno degli ingressi è 1.


Inserita:

Programmando con plc omron si può fare così:

LD 0.0

AND NOT 0.1

LD 0.1

AND NOT 0.0

OR LD

OUT 100.00

Ciao

Inserita:

Purtroppo non conosco la programmazione dei plc Omrom.

Mi scuso per non aver specificato all'inizio che utilizzo plc Siemens.

Vorrei aggiungere inoltre che nella mia applicazione i miei ingressi bool sono nell'ordine delle decine.

Inserita:

Ciao fabio,

la tabella della verità è quella della funzione xor. prova a mettere tutti gli ingressi in xor tra loro (non so se li prende come una mega porta xor perchè se li prende a 2 per volta la funzione non funziona come vuoi tu), altrimenti metti un controllo nel ciclo con un flag che si attiva la prima volta che hai una uscita alta dalla porta e, se il bool successivo è 1, esci dal ciclo e non attivi il segnale.

Inserita:

Altra semplice soluzione :

passi lo stato dell'ingresso a bit della stessa DW

o piu' DW se non basta

se DW diversa da 0 attivi uscita o M

Ciao

Luca

Cristina Fantoni
Inserita: (modificato)
se DW diversa da 0 attivi uscita o M

Mi pare che a Fabio serva che sia ad "1" se uno ed uno solo dei bit e' a "1", mentre il valore della DW esarebbe

"0" se tutti i bit sono a "0"

"1" se bit N.0

"2" se bit N.1

"4" se bit N.2

In tutti questi casi, se il bit in oggetto e' l'unico attivo, l'uscita dovrebbe essere abilitata, ma il valore della DW e' sempre diverso... :huh:

Questo se ho capito, in caso contrario significa che mi sono persa una puntata... :unsure:

:wub:

Modificato: da Cristina Fantoni
Inserita:

La funzione xor funziona solo se confronto due bit.

Il discorso del flag và bene, ma diventa meno rapido di quello che speravo (io ho più di 60 ingressi):

U ingresso1

S flag

U ingresso2

U flag

SPB A

U ingresso2

S flag

U ingresso3

U flag

SPB A

U ingresso3

S flag

U flag

= uscita

SPA B

A: R uscita

B: BEA

Inserita:

Io intendevo fare un loop decrementando ad esempio un puntatore e mettendo tutte le variabili in una db. il blocco di codice viene sicuramente più compatto ma bisogna stare attenti a non rimanere all'interno del loop.

Altrimenti puoi trovare il modo di fare un blocco di conversione da binario in bcd (visto che la somma binaria non è contemplata) poi li sommi tutti e se il risultato è uguale a 1 attivi l'uscita, altrimenti no (se come ha detto Cristina l'uscita deve essere attiva se e solo se uno dei bit è 1)

Inserita:

<_< Ecco la pappa:

  R     #PiuDiUnBit      // resetta memoria
  R     #Trovato         // resetta memoria

   L   60                // esaminare 60 bits
L: T   #ContatoreLoops

   UN  M [AR1,P#0.0]     // Esamina il bit
   SPB ok                // se a 0 salta a 'ok'

// Il bit è a 1....
   U   #Trovato          // se aveva già trovato un bit a 1
   S   #PiuDiUnBit       // setta memoria
   SPB exit              // salta a 'exit'

    S  #Trovato          // setta memoria

ok: +AR1 P#0.1           // Incrementa puntatore bit

   L   #ContatoreLoops
   LOOP  L               // (loop)



// Attiva l'uscita solo se ha trovato un solo bit a 1:
exit: U   #Trovato
     UN  #PiuDiUnBit
     =   #Uscita

Spero che la sintassi sia giusta, non ho qui l’ S7. ;)

Inserita:

Buongiorno,

avrei bisogno di aiuto per risolvere una questione che a me sembrava estremamente banale:

un'operazione logica ha come ingressi n bool,

il risultato deve essere 1 solo se uno degli ingressi è 1.

***********************************************

.... in effetti messa così sembra banale ...

e quasi mi vergogno a rispondere ....

(ladder) se per esempio hai tre ingressi, in un solo segmento:

contatto aperto per l'ingresso 1 + contatto nc per i rimanenti

analogo per gli altri ingressi (cont 2 + nc per rimanenti....)

ovviamente in parallelo (ogni serie su linee diverse) e quindi ...

.... collega il tutto ad un merker,

se il merker è ON hai un solo ingresso 1 (XOR)

ma mi sa che intendevi altro ....

ciao, Zef

Inserita:

Perchè invece non fai una cosa combinata tra tutti i suggermenti che ti hanno proposto?

La prima cosa che mi viene n mente sarebbe:

a) fa un XOR a parole, in cascata fno ad ottenere una sola WORD che sarà il risulato della combinanazioni d quelle precedenti (quindi devi prendere in considerazione un numero di bit che sia multiplo di 16... nel tuo caso 64.. al massimo gli ultimi 4 non li consideri e li metti a 0)

B) con l metodo dei flag, fai un piccolo loop sulla word rsultante dalla fase a. che si limita qundi solo a 16 bt

Forse così ottimizzerai i tempi ciclo...

Naturalmente è tutta da provare.... ma sò che otterai un ottimo risultato (almeno spero)

Scappo....

Ciao :rolleyes:

PAX

Inserita:

Ci sono degli FC appositi nella libreria TI... uno conta i bit a 1 di una double-word..... l’altro ti dice la posizione (da 0 a 31) del primo bit a 1 trovato ... ecc. ecc. (il nr. dell’FC non lo ricordo, mi ci sono imbattuto per caso oggi).

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