Vai al contenuto
PLC Forum


Istruzione Shift right siemens e iolink


Messaggi consigliati

Inserito: (modificato)

Buonasera mi sto dedicando allo studio della programmazione e avrei una domanda per i programmatori. 

Il blocco shift right e un puntatore di bit giusto?

Esempio con  sensore ifm laser di distanza, il file iodd mi dice che i dati sono in una word  e per essere Letto  il valore di processo c'è necessità di un offset di 4 bit. 

 0000 0000 0000 ****

(gli 0 sono i valori di processo utili) 

 

Come faccio a puntare il valore di processo? 

 

Prendendo per esempio un blocco shift right parametrizzato come segue 

In= iw68

N=4

Out=mw68.

Come funziona Il Blocco shift right? 

 

In pratica il plc punta il bit x di iw68(leggi sotto) 

 

Iw68: 0000 000x 0000 0000 è restituisce in parametro out ciò che legge in iw68 ma a partire da

 

0000 0000 000x 0000

 

In pratica è come se il puntatore fosse sotto 

 

0000 0000 0000 0000

                 ^

È si sposta di n posizioni verso dx? Cioè quello dichiarato in parametro N? 

0000 0000 0000 0000.        

                    ^                                n=1

                      ^                              n=2

 È corretto? 

 

 

Modificato: da G.esse

Mattia Spoldi
Inserita: (modificato)
il 12/3/2021 at 23:52 , G.esse scrisse:

Il blocco shift right e un puntatore di bit giusto?

No, il blocco prende in ingresso un valore e lo shifta di n posizioni a sx o dx in base se shift left o right.

 

ti faccio un esempio su 16 bit

1010 1111 0001 1000

 

lo shifti verso dx di 4 posizioni, come valore di ritorno avrai 

0000 1010 1111 0001, dove i 12 bit a dx sono i tuoi vecchi bit che andavano dal quarto al sedicesimo mentre i 4 bit aggiunti in testa sono 4 bit a zero aggiunti dalla funzione

 

lo shifti verso sx di 4 posizioni, come valore di ritorno avrai 

1111 0001 1000 0000, dove i 12 bit a sx sono i tuoi vecchi bit che andavano dallo 0 al dodicesimo, mentre i 4 bit aggiunti in coda sono 4 bit a zero aggiunti dalla funzione

 

parlando in "matematichese" se prendi un numero(senza segno) e lo shifti di n posizioni verso dx lo stai dividendo per 2^(n-1), se invece lo fai verso sx è come moltiplicarlo per 2^(n-1)

 

nel caso del tuo sensore ifm, dovrebbe bastare fare uno shiftRight di 4 posizioni, anche se per essere sicuri andrebbe visto il datasheet

 

PS, visto che hai usato il termine puntatore, sia qui, sia nell'altro post, i puntatori in programmazione, sono una cosa molto particolare, che andrebbe studiato dopo aver studiato più o meno tutto il resto e comunque andandoci con i piedi di piombo, al momento dimenticati il termine perchè altrimenti ti porterà a fare confusione

Modificato: da Mattia Spoldi
Inserita: (modificato)
3 ore fa, Mattia Spoldi scrisse:
il 12/3/2021 at 23:52 , G.esse scrisse:

Il blocco shift right e un puntatore di bit giusto?

No, il blocco prende in ingresso un valore e lo shifta di n posizioni a sx o dx in base se shift left o right.

 

ti faccio un esempio su 16 bit

1010 1111 0001 1000

 

lo shifti verso dx di 4 posizioni, come valore di ritorno avrai 

0000 1010 1111 0001, dove i 12 bit a dx sono i tuoi vecchi bit che andavano dal quarto al sedicesimo mentre i 4 bit aggiunti in testa sono 4 bit a zero aggiunti dalla funzione

 

lo shifti verso sx di 4 posizioni, come valore di ritorno avrai 

1111 0001 1000 0000, dove i 12 bit a sx sono i tuoi vecchi bit che andavano dallo 0 al dodicesimo, mentre i 4 bit aggiunti in coda sono 4 bit a zero aggiunti dalla funzione

 

parlando in "matematichese" se prendi un numero(senza segno) e lo shifti di n posizioni verso dx lo stai dividendo per 2^(n-1), se invece lo fai verso sx è come moltiplicarlo per 2^(n-1)

 

nel caso del tuo sensore ifm, dovrebbe bastare fare uno shiftRight di 4 posizioni, anche se per essere sicuri andrebbe visto il datasheet

È come dire:" i 4 bit finali che sono bool della word spostali a destra(dove vanno?😅)  perché su questa word voglio leggere solo il valore (distanza)? 

 

Se il sensore Invece avesse restituito una word ma con solo *(vedi sotto) come bool mi sarebbe bastato uno Shift dx di posizioni n =1? Per leggere il valore "pulito" di distanza? 

 

0000 0000 0000 000*

 

 

Modificato: da G.esse
Inserita:
8 ore fa, G.esse scrisse:

È come dire:" i 4 bit finali che sono bool della word spostali a destra(dove vanno?😅

I primi 4 bit si perdono, tutti gli altri si spostano di 4 posti a dx e gli ultimi 4 bit (i più significativi vengono sostituiti da zeri).

8 ore fa, G.esse scrisse:

Se il sensore Invece avesse restituito una word ma con solo *(vedi sotto) come bool mi sarebbe bastato uno Shift dx di posizioni n =1? Per leggere il valore "pulito" di distanza? 

 

 

Se fai uno shift a dx di un passo avrai tutti zeri.

 

Inserita:
2 ore fa, Livio Orsini scrisse:

Se fai uno shift a dx di un passo avrai tutti zeri

Come riferimento di lettura o come 16 bit tutti a zero? 

Grazie

Inserita:
57 minuti fa, G.esse scrisse:

Come riferimento di lettura o come 16 bit tutti a zero? 

Grazie

Intende, prendendo a riferimento quello che hai scritto te, che ti ritrovi tutti 0.

Te hai scritto 0000 0000 0000 000* che per convenienza facciamo diventare 0000 0000 0000 0001

Facendo lo shift a DX di uno, perdi il bit che ora è valorizzato come 1 ed introduci a sinistra un bit valorizzato come 0. Tutti gli altri restano invariati come valorizzazione, ma cambiano di posto. Siccome te hai scritto che sono a 0, ti è stato detto che ti ritrovi tutti 0.

Dalla tua domanda intuisco che non hai capito il funzionamento dello shift.: rileggi e cerca di capire bene quello che ha scritto Mattia Spoldi. È spiegato benissimo.

Ciao,

Claudio.

Inserita: (modificato)

Quindi uno shift right, nel caso del sensore distanza  con range da dx a y mm con risoluzione 1 fornito da una word con i quattro bit finali che non servono perché magari sono bool di stato, serve a eliminare i bit che non mi sono utili a rilevare la misura ed ad avere il valore scritto corretto scritto in parametro out del blocco shift?

 

E questo il concetto? Fino a qua ci ho preso? 😅😅

 

 

E come attribuire lo zero della misura di distanza a bit x? 

0000 0000 0000 000x 

Ogni  mm  sarà uno 0-1 che varierà da dx verso sx nel range x y sopracitato ? 

 

Lo shift viene utile quando bisogna assegnare a una Memoria da usare poi nel codice, un valore che ci interessa ma ci troviamo dati superflui in fornitura segnale ? 

In pratica serve a misurare un offset? 

 

dato che il dato voglio metterlo nella mw0 pulito  ma lo zero di questo dato  è messo dal produttore del sensore su  0000 0000 000* 0000 so che le posizioni (offset) per avere il dato

Qui 0000 0000 0000 000* sono 4 verso dx so che devo shift dx n 4 giusto? 

 

Grazie 

Modificato: da G.esse
Mattia Spoldi
Inserita:
1 ora fa, G.esse scrisse:

E questo il concetto? Fino a qua ci ho preso?

Fino a qui si.

 

1 ora fa, G.esse scrisse:

E come attribuire lo zero della misura di distanza a bit x? 

Volendo la si può vedere in questo modo.

1 ora fa, G.esse scrisse:

Lo shift viene utile quando bisogna assegnare a una Memoria da usare poi nel codice, un valore che ci interessa ma ci troviamo dati superflui in fornitura segnale ? 

Serve anche per questo, ma non solo.

 

1 ora fa, G.esse scrisse:

In pratica serve a misurare un offset? 

Lo shift non misura niente, tantomeno un offset.

 

1 ora fa, G.esse scrisse:

Qui 0000 0000 0000 000* sono 4 verso dx so che devo shift dx n 4 giusto? 

Si

 

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