Vai al contenuto
PLC Forum


Posizione Bit Di Word In Decimale


prog_jlaw

Messaggi consigliati

ho la necessita di convertire la posizione di un bit di una Dword in decimale per poterlo usare come indice.

ES la DWx

....0000010 = 2

....0100000 = 6

naturalmente nella Dword sara presente un solo bit alto alla volta.

A chiunque mi aiutera' ..

Questo e' un forum relativo ai plc schneider e quindi mi aspetto soluzioni adatte a questo tipo di plc..( mi e' capitato di creare una discussione e ricevere post dicendo che con il plc omron o simens si faceva cosi... :huh: ..)

Soluzioni in ST sarebbero l'ideale per ragioni di spazio-memoria

Grazie a chiunque mi aiutera

ciao

Link al commento
Condividi su altri siti


è semplice utilizzi le istruzioni di scorrimento a destra (non ricordo in schneider) in un ciclo for che termina con il numero max di bit (int=16) o quando trovi "1" , ciao

gigi

Link al commento
Condividi su altri siti

Claudio Monti

Secondo me non puoi sfruttare le funzioni di scorrimento in quanto un parametro NECESSARIO e' appunto il numero di spostamenti che la funzione deve fare, ed invece e' quello che stai cercando.

Dovresti usare la funzione che ti ho indicato la volta precedente ma, invece di contare i RESTI dovresti contare le volte che riesci a dividere per 2 e fermarti appena trovi un resto ;)

Link al commento
Condividi su altri siti

ciao

lo scorrimento e' la soluzione piu' semplice

cioe' :

a=0

:inizio

esegui scorrimento a destra di un bit

il carry e' 1? (

allora a=a+1

salta a esci )

il carry e' a 0 ? (

allora a=a+1)

se a=16 salta a esci

salta inizio

:esci

in a trovi cio' che ti interessa

Modificato: da Dario Valeri
Link al commento
Condividi su altri siti

Solo a scopo didattico, dato che sono convinto anch'io che il metodo migliore sia quello dello scorrimento:

se si è certi che la word contenga un solo bit alto, si può calcolare il logaritmo base 2 del valore della word.

Essendo che di solito un plc non consente di calcolare direttamente il logaritmo base 2, si può risolvere il problema considerando che:

log base_x di N = log base_10 di N / log base_10 di x

Esempio: calcolare la posizione del bit alto in una variabile che contiene il valore decimale 32 (32 = 2^5, ovvero il logaritmo base 2 di 32 è 5)

log_2(32) = log_10(32) / log_10(2) = 5

Ripeto: per un plc questo è un calcolo molto pesante. Meglio lo scorrimento. Inoltre il calcolo con i logaritmi darebbe valori errati in caso di word con più di un bit alto. Con lo scorrimento si può decidere di terminare l'operazione appena si individua il primo bit alto e non valutare gli altri.

Link al commento
Condividi su altri siti

  • 2 weeks later...

non ho idea se si risparmia in tempo ciclo ma siccome lo scorrimento verso destra non è altro che una divisione per 2, mi domandavo se fosse meno impegnativo fare per l'appunto tante divisioni per 2 fino ad avere resto =0 e contare il numero di divisioni eseguite. Mah!!

Link al commento
Condividi su altri siti

Se posso essere di aiuto, la seguente routine potrebbe essere uno "spunto" ;) da perfezionare:

!(* routine di memorizzazione dell'ultimo bit TRUE in una tabella di bits *)

!%M50:160:=D_BIT(%MD100:5,0,5,0); (* copia 5 doppie word in 160 bits *)

!IF %MW0<160 THEN (* controllo indice per scrolling bits *)

INC %MW0; (* incremento dell'indice di 1 *)

ELSE

%MW0:=0; (* azzeramento indice quando > 160 *)

END_IF;

!IF %M50[%MW0] THEN (* verifica dello stato 1 del bit *)

%MW1:=%MW0+1; (* cattura del valore indice di scrolling +1 se

desidero numerare la posizione da 1 a 160 *)

END_IF;

Link al commento
Condividi su altri siti

Salve, un primo "spunto" (miglioria) potrebbe essere quella di azzerare il valore che riporta l'ultimo bit allo stato uno quando questo ritorna a zero (quindi tutti i 160 bits sono a zero!).

Inserire in "testa" alla routine le seguenti righe:

!%MD90:=SUM(%MD100:5); (* calcolo la somma delle 5 DW *)

! IF %MD90=0 THEN

%MW1:=0;

END_IF;

...ovviamente è ancora "perfettibile/personalizzabile" !

Link al commento
Condividi su altri siti

Massimo Vergani

personalmente sono per le cose + semplici,

contatto aperto di %md0:x0 imposto la mia word a 1 %mw1:=1 ecc per 32 righe, la scrivo in 3 minuti anzichè 1 ma la penso in 30 secondi anziche 15 minuti!!!! ma forse sono io ad essere lento :P

ciao

Link al commento
Condividi su altri siti

Ciao MAX B) , si può fare anche così,

anche se in questo modo però non si sfrutta un'altra opportunità di scoprire

(tempo permettendo!) le funzioni presenti nel PLC.

Io continuo a vedere programmi scritti con una "metalità" da programmatore anni 85-90,

Kili e Kili di codice convertito e tradotto da un plc di marca XXX verso un plc di marca YYY

senza neanche prendersi la briga di andare a sbirciare nella libreria delle funzioni se esiste

qualcosa che può soddisfare l'abbisogna!

Volevo ancora aggiungere che non :rolleyes: è possibile etrarre un bit da una doppia-word tipo %MD100:X0,

e che quindi devo scindere la doppia-word nei 2 registri fondamentali che la costituisco, ovvero:

%MW100:X0 ---equivalente---> %MD0:X0;

%MW100:X1 ---equivalente---> %MD0:X1;

.... .... .....

.... .... .....

%MW100:X15 ---equivalente---> %MD0:X15;

%MW101:X0 ---equivalente---> %MD0:X16;

%MW101:X1 ---equivalente---> %MD0:X17;

.... .... .....

.... .... .....

%MW101:X15 ---equivalente---> %MD0:X31,

... per il resto le righe restano sempre 32: un bit ==> una riga....

N.B. nel codice da me suggerito, gestisco fino a 160 bit.

Link al commento
Condividi su altri siti

Massimo Vergani

ciao ....... nibble,

in effetti anche io mi diverto a cercare scorciatoie e a sfruttare funzioni diciamo avanzate, ma a volte ci metto tanto di quel tempo che forse non ne vale la pena.

Poi quando si va in debug si scopre che i metodi più semplici permettono di vedere subito gli intoppi a differenza delle funzioni complesse che devono essere sorvegliate passo passo...... cavolo è già pronto il risotto, devo andare, ciao!!!!

Link al commento
Condividi su altri siti

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