Vai al contenuto
PLC Forum


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


Messaggi consigliati

Inserita:

Scusa , ma le soluzioni piu' semplici no ???

i bit di allarmi li tiri su o giu' da programma PLC ,

quindi fai anche molto presto a tirati su una memoria quando sono piu' di 2 .

del tipo : il primo allarme tira su una M , il secondo un'altra , il terzo attiva la M di piu' di 2 ( ovviamente quando scendono devono fare al contrario )

Ciao

Luca


Inserita:

Sì, però per ciascun allarme devi compiere un'operazione specifica, anzi due : una quando ON e una quando OFF.

La soluzione di Siemens scoperta da Vince73 mi sembra ottima... B)

Inserita:

Sicuramente valida , non stavo a criticare

pero' ho esperienza sulle librerie siemens e cerco di usarle il minimo possibile ,

non perche' non funzionano , ( anzi.......) ma perche' di solito utilizzano risore esagerate per la funzione svolta ( prova a usare un fifo standard da libreria o a fartelo da solo )

Quindi preferirei come soluzione alternativa , farmi un puntatore parametrizzato , che ad ogni scansione controlla tutti i bit e se ne trova 2 ad uno mi setta una M .

ciao

Luca

Inserita:

OK, le funzioni standard occupano parecchie risorse, ma parecchie quanto? Tutto va messo in relazione al proprio programma, o no? Onestamente non saprei valutare quanto incida FC99, o chi per esso, nel mio programma. E quando si dice "risorse", si intende tempo di ciclo o spazio fisico in memoria (o entrambi)? Anch'io a volte cerco di evitarle, ma in questo caso la soluzione FC99 mi sembra così efficace che mi fa proprio gola. Boh! Ci penserò su.

Ciao

Inserita:

Ciao, se hai bisogno di velocità, e devi solo sapere quando almeno 2 bit sono a 1 allora potresti usare un metodo iterativo (quasi come un classico metodo dividi et impera) molto banale:

Hai 32 Bit:

Passo 1: dividi in due parole da 16 bit se le due parole sono diverse da zero finisci qui!

Passo 2: Prendi la parola divrsa da zero e la dividi in due byte, se i due byte sono diversi da zero finisci!

Passo 3: Prendi il byte diverso da zero, e lodividi in 2 nible, se i due nible sono diversi da zero finisci!

PAsso 4: Prendi il nible diverso ... a questo punto è semplicissima la verifica!

Si potrebbe risparmiare qualcosa, ad esempio dividendo la doppia parola in 4 byte eseguire operazioni in parallelo in quanto: Se hai due byte diversi da zero hai almeno due bit a 1.

Altrimenti si prendo il byte diverso da zero e si fanno le oportune verifiche!

Ovviamente questa ultima ipotesi diviene comoda se si deve poi sapere anche quli bit sono a 1.

ciao e buon divertimento

Inserita:
quando si dice "risorse", si intende tempo di ciclo o spazio fisico in memoria (o entrambi)?

io intendo entrambi , ovviamente lo devi rapportare al tuo programma e ai tuoi problemi ,

ma secondo me e' da prendere come standard di fare sempre un programma che risparmia risorse il piu' possibile , poiche' oggi hai spazio e velocita' nella tua CPU , ma domani.........................

ciao

Luca

Inserita:

Compilati questo sorgente dovrebbe funzionare

L'input allarmi è l'indirizzo della doppia parola di allarmi

l'output more è l'indirizzo del bit che va a 1 se hai piu' di un bit a 1

FUNCTION FC 8 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  allarmi : DWORD;    
END_VAR
VAR_OUTPUT
  more : BOOL;    
END_VAR
VAR_TEMP
  appoggio : DWORD;    
  cont : INT;    
  fisso : INT;    
  indice : DWORD;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     L#0; 
      T     #cont; 
      L     #allarmi; 
      T     #appoggio; 
      L     P##appoggio; 
      T     #indice; 
      CLR  ; 
      =     #more; 

      L     32; 
ini:  T     #fisso; 
      U     L [#indice]; 
      SPB   inc; 

SFT:  L     #appoggio; 
      TAD  ; 
      SRD   1; 
      TAD  ; 
      T     #appoggio; 
      L     #fisso; 
      LOOP  ini; 
      BE   ; 

inc:  L     #cont; 
      L     1; 
      +I   ; 
      T     #cont; 
      L     2; 
      >=I  ; 
      =     #more; 
      SPBN  SFT; 


END_FUNCTION

Inserita:
Compilati questo sorgente dovrebbe funzionare

Togli il "dovrebbe": funziona benissimo! Ottima soluzione, questa sì che la preferisco ad FC99.

Grazie

Ciao

Inserita:

Per Luca bab

pero' ho esperienza sulle librerie siemens e cerco di usarle il minimo possibile

Hai ragione per gli SFC e SFB ma FC 99 e fc standard in genere

Non mi stupirei che prenda ancora meno risorse del mio programmino.

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