Vai al contenuto
PLC Forum


Calcolo bit in una word


Messaggi consigliati

Inserito:

Ciao ragazzi, mi trovo davanti a questa parte di programma fatta da un mio ex collega.

Quello che fa è guardare il numero pnt (che corrisponde ad una stazione), e trovare il bit corrispondente all'interno di una word.

non capisco come fa a calcolare il bit. perchè fa un UW con 7? 

 

      L     "t_ciclo_st_nastro".pnt
      L     1
      -I
      L     8
      /I
      SLW   3
      T     #W_APP_ST_ESC

      L     32
      L     "t_ciclo_st_nastro".pnt
      -I
      UW    w#16#7
      L     #W_APP_ST_ESC
      OW
      LAR1
      AUF   "GEN"
      UN DBX [ AR1 , P#14.0 ]
      s M30.0


Inserita:

Ciao,

visto così serve per identificare la posizione in bit di un numero 0-31 data dword.

Ipotizza di avere un .pnt = 28, il quale diviene 27 (immagino pnt parta da 1 e non da 0, per questo la sottrazione, per rimanere "coerente" con i bit 0-7 invece di 1-8)

il risultato dopo uw7 è 4

il 27esimo bit di una dword corrisponde al quinto bit (4 partendo dal bit 0, quindi quinto bit) del quarto byte della dword.

 

se .pnt fosse 13, avresti il risultato dopo uw di 3, poichè il 12esimo (13-1) bit della dword è il quarto bit (quindi 3 partendo da 0) del secondo byte della dword

 

Spero di esser riuscito a spiegarmi!

 

Ciao!

Inserita:

Non ho capito perché fa proprio uw7.

Perché 7? Da dove lo ha determinato?

E poi perché esegue l'Or?

Grazie

Inserita: (modificato)

il 7 in hex->bin è  0000 0000 0000 0111

28 in dec->bin è  0000 0000 0001 1100 (ho usato 28 per ricollegarmi al mio esempio)

facendo un andword ti trovi 0000 0000 0000 0100 = 4

E' un modo per fare un and tenendo buoni solo i primi 3 bit, in modo da avere sempre un numero da 0 a 7 quando esegui l'operazione, numero che indica la posizione del bit che ti interessa trovare.

 

l'or successivo serve comunque per creare l'indice di partenza da quale il software va a fare il confronto sul bit 14.0. Se =0, allora setta m30.0

(edit, non mi ero reso conto che #W_APP_ST_ESC era dichiarato nel codice :P )

Modificato: da DesmoGiec
Inserita:

Non mi è ancora chiaro, credo dovrò fare prove con un simulatore per riuscire a capirci qualcosa 😵

Inserita:
1 ora fa, Ghisla ha scritto:

Non mi è ancora chiaro

Per capire a fondo il codice ti consiglio di studiarti bene la composizione di un puntatore ANY. Trovi a tal scopo le informazioni sul manuale di Step 7 oppure anche in questo forum, cercando la parola chiave ANY ho trovato queste 3 discussioni: 

 

Inserita:

Ciao Pigro, so come è composto un puntatore any, ma con l'esempio che ho postato io non ha nulla a che vedere o sbaglio?🤒

Grazie

Inserita:
11 minuti fa, Ghisla ha scritto:

ma con l'esempio che ho postato io non ha nulla a che vedere

Sembra anche a me.

Dal codice si capisce cosa fa, ma non si capisce perché lo fa.
La prima parte è comprensibile: azzera i 3 bit a destra e, parlando di puntatori, significa puntare al primo bit di un byte.

Capire, invece, il perché delle operazioni della seconda parte, non saprei che dire.

 

Questo è il classico modo di programmare che io considero demenziale, non tanto per come è scritto il codice (comunque migliorabile), ma per la totale assenza di commenti.

Inserita:

Ciao Batta.

praticamente da pannello ci sono 32 bit messi una una dword che indicano stazione esclusa se = 0 e stazione inclusa se = 1. 

stazione 1 = bit 0.7  stazione 8 = bit 0.0 ecc.

Quello che fa è guardare il puntatore, che corrisponde ad una stazione (impostato in un'altra parte del programma), e tramite il puntatore andare a vedere se quella stazione è esclusa oppure inclusa.

Quindi se il puntatore vale 10 ( cioè stazione 10) fa tutto il casino per vedere se il bit della stazione 10 è on.

il 32 - puntatore lo fa perchè la stazione 1 corrisponde all'ultimo bit e viceversa.

altrimenti se la stazione 1 fosse su bit 0.0 poteva fare puntatore - 1  

 

 

Inserita:

Ora è un po' più chiaro, ma il quesito che pongo è sempre lo stesso: perché non scriverlo come commento nel codice?
Nei miei programmi ci sono forse più righe di commento che di codice. E non lo faccio per gli altri, ma per me stesso.
Nel momento in cui scrivi il programma i commenti ti servono a poco (aiutano comunque a fissare meglio il concetto), ma ti immagini, rimettere le mani, dopo anni, su un programma senza commenti?

Inserita:

Si hai ragione, ma il programma non l'ho scritto io 

Inserita:
2 ore fa, Ghisla ha scritto:

ma il programma non l'ho scritto io

Sì, l'avevo letto.

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