Vai al contenuto
PLC Forum


Indirizzo Di Un Bit Come Parametro Di Ingresso Di Una Fc


Andrea_unipd

Messaggi consigliati

salve

ho una FC (in realtà è un FB ma per quello che devo fare io non dovrebbe cambiare niente) a cui devo passare come parametro d'ingresso un indirizzo di un particolare bit (nella fattispecie un uscita digitale), il quale verrà utilizzato, all'interno della FC, in un puntatore

Al momento, come parametro passo una variabile di tipo INT, che indica il numero del byte.

Nella FC ho questo codice:

      L     #FIRST_OUTPUT_BYTE  //indirizzo del primo byte
      SLW   3
      T     #OUTPUT_POINTER  //puntatore al primo bit

      .........

      =     A [#OUTPUT_POINTER]

Così facendo però passo alla funzione un puntatore al primo bit del byte specificato, e devo quindi manipolare il codice all'interno della FC per raggiungere gli altri bit

La domanda è: come faccio a passare alla funzione l'indirizzamento ad un bit arbitrario del byte specificato?

spero di essermi spiegato...

grazie

Link al commento
Condividi su altri siti


Perché non passi direttamente il numero del bit anziché il numero del byte?

Per esempio, se devi puntare all'uscita A3.5 potresti passare direttamente il numero 29 (3*8+5).

Se invece devi puntare all'ennesima uscita a partire da un byte specifico, potresti passare (o gestire come costante, secondo le tue necessità) l'indirizzo del primo byte, al quale andrai a sommare il numero dell'uscita.

Supponiamo che tu debba puntare all'undicesima uscita partendo da A6.0, per calcolare l'indirizzo dell'uscita di basta sommare 10 (attenzione all'allineamento: la prima uscita è la numero 0, quindi l'undicesima è la numero 10) all'indirizzo della prima uscita che è 6*8.

Link al commento
Condividi su altri siti

il problema è risolto ma l'argomento mi interessa... non ho ben chiaro questo meccanismo:

con questa scrittura:

L 5
SLW 3
T #POINTER
In #POINTER trovo 5.0 , che sarebbe il bit n° 40, cioè 5*2^3 . Giusto? E se devo puntare a 0.5 come si fa? Allo stesso modo senza fare lo shift? Invece, con quest'altra scrittura:
      L     5                          
      SLW   3
      LAR1

a che indirizzo punta LAR1? sempre 5.0?

Link al commento
Condividi su altri siti

Si punta sempre al bit.

Un indirizzo di tipo "byte.bit" deve quindi sempre essere convertito nel bit corrispondente.

Per calcolare l'indirizzo quindi si prende il numero del byte, si effettua uno shift a sinistra di 3 bit (equivale a moltiplicare per 8), e si somma il numero del bit.

In realtà ci sarebbe anche una spiegazione più tecnica, che richiede l'analisi di come è composta una variabile di tipo POINTER.

Un dato di tipo Pointer è formato da 48 bit (6 byte)

Per l'analisi partiamo dal byte a sinistra (byte più significativo), e procediamo verso destra (byte meno significativo), tenendo presente che l'indirizzamento in Step7 è di tipo "big-endian" (o Motorola), con la numerazione dei byte che inizia quindi dal più significativo (quello a sinistra).

Chiarito questo, passiamo a descrivere il significato dei singoli byte.

- I primi due byte (byte 0 e 1) contengono il numero del DB. Se non è un DB, il valore sarà 0.

- Il terzo byte (byte 2) contiene un codice esadecimale che definisce l'area di memoria.

Per i rimanenti tre byte, conviene descrivere il significato dei singoli bit, partendo questa volta da destra (bit meno significativo)

- i primi tre bit contengono l'indirizzo del bit all'interno del byte

- i successivi 16 bit contengono l'indirizzo del byte (ecco perché lo shift a sx di 3 bit)

- i rimanenti 5 bit non sono utilizzati (sempre 0)

Il tutto è spiegato in modo chiaro ed esaustivo nel manuale in linea di Step7.

Basta cercare "Pointer".

Avrai forse notato che, nel modo di calcolare l'indirizzo sopra descritto, non viene impostato il codice dell'area di memoria (byte 2).

Questo perché in istruzioni di tipo:

L DBW[indirizzo]

L DID[indirizzo]

L MB[indirizzo]

L LW[indirizzo]

U DBX[indirizzo]

U E[indirizzo]

l'area di memoria è specificata nell'istruzione stessa.

Lo stesso vale per istruzioni di tipo:

L DBW[AR1, P#0.0]

L LW[AR1, P#0.0]

E' di importanza fondamentale invece impostare correttamente il codice dell'area di memoria in istruzioni che non contengono in modo specifico l'area di memoria, tipo:

L B[AR1, P#0.0]

L W[AR1, P#0.0]

L D[AR1, P#0.0]

U [AR1, P#0.0]

Ma non è difficile. Per inizializzare un puntatore con codice area di memoria e, se necessario, anche un indirizzo di partenza, basta scrivere:

L P#AreaMemoria byte.bit

Esempi:

L P#M 10.3

L P#DBX8.0

Oppure:

LAR1 P#E2.6

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