Andrea_unipd Inserito: 30 novembre 2011 Segnala Share Inserito: 30 novembre 2011 salveho 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 puntatoreAl 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 bitLa 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 More sharing options...
Andrea_unipd Inserita: 30 novembre 2011 Autore Segnala Share Inserita: 30 novembre 2011 mi sono risposto da solo:L P#0.3 T MD120passo a parametro MD120 e tolgo il comando SLW 3 dal codice della FC Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 novembre 2011 Segnala Share Inserita: 30 novembre 2011 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 More sharing options...
Andrea_unipd Inserita: 30 novembre 2011 Autore Segnala Share Inserita: 30 novembre 2011 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 LAR1a che indirizzo punta LAR1? sempre 5.0? Link al commento Condividi su altri siti More sharing options...
batta Inserita: 30 novembre 2011 Segnala Share Inserita: 30 novembre 2011 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.bitEsempi:L P#M 10.3L P#DBX8.0Oppure:LAR1 P#E2.6 Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora