Vai al contenuto
PLC Forum


Puntatori Area A (out Dig)


Messaggi consigliati

Inserito: (modificato)

Ciao a tutti,

devo costruire un puntatore ad un'area A in step 7 con cpu serie 300, ma non mi e' chiaro l'. della Siemens. Ho scritto cosi':

LAR1 P##Index //Carica l'indirizzo iniziale del puntatore ANY in AR1

L B#16#10 //Carica l'ID-sintassi S7 e la trasferisce nel puntatore ANY

T LB [AR1,P#0.0]

L B#16#6 //Carica tipo di dati byte e la trasferisce nel puntatore ANY

T LB [AR1,P#1.0]

L 1 //Fattore di ripetizione (va a 1)

T LW [AR1,P#2.0]

L 0 //Numero della DB (non serve, quindi va a 0)

T LW [AR1,P#4.0]

L B#16#82 //Area di memoria A (uscite)

T LB [AR1,P#6.0]

L 3 //indirizzo del byte di uscita. E' qui l'errore?

T LB [AR1,P#8.0]

L 0 //Indirizzo del bit dell'uscita

T LB [AR1,P#9.0]

L P##Index

T #Appoggio_Puntatore //variabile DWORD

Il risultato non e' quello previsto, perche' se scrivo "L[#Appoggio_Puntatore]" mi trovo la lettura della AD 3 shiftata di 2 byte (esempio: se AD 3 vale FFFF FFFF, il load mi ritorna il valore FFFF FF00). Ho provato a cambiare l'operazione "L 3" con altri valori, ma il risultato non cambia.

Modificato: da alan_ford444

Inserita:

Se devi sempre e solo puntare un tipo di dati ( e nel tuo caso mi sembra di si )

la cosa piu' semplice e' la seguente

Vuoi interrogare se A23.7 e' alta ????

23x8+7 = 191

metto 191 in MD200

U A[MD200]

finito

ciao

Luca

Inserita: (modificato)

Grazie per avermi risposto, ma non devo interrogare un singolo bit. Devo leggere tutta la doppia word per poi eseguire dei mascheramenti di bit.

La costante 3 l'ho messa solo per semplificare l'esempio, ma in realta' e' una variabile. Devo quindi puntare a un'area A il cui indirizzo (offset) sia variabile.

Devo quindi eseguire alla fine una cosa tipo "T AD[offset]", ma non si puo' fare "T AD[MD200]"

Modificato: da alan_ford444
Inserita:

Il concetto e' lo stesso ( se devi leggere la Dword per poi mascherare i bit per puntare ad una uscita , e' meglio che punti direttamente all'uscita a bit )

Comunque quello che devi fare e' praticamente uguale

vuoi caricare la dw di uscita 40 ???

40x8 = 320

sposti 320 in MD200

L AD [MD200]

poi ti fai quello che ti serve

Non si capische bene cosa vuoi fare T AD ( trasferisci , non carichi )

se dai piu' informazioni , gli aiuti sono piu' mirati

ciao

Luca

Inserita:

Grazie del consiglio. Avevo provato a scrivere qualcosa di simile, ma avevo commesso l'errore di pensare che l'indirizzamento indiretto L AD [MD200] volesse come valore di MD200 il numero della dword o del byte di uscita, mentre invece vuole comunque l'offset espresso in bit.

Lo scopo era leggere lo stato di 32 bit di uscita (con offset parametrizzabile) e azzerare solo il primo, il secondo, il terzo byte o tutta la dword in base ad altre condizioni di programma, mantenendo inoltre inalterati i byte non interessati. Fallito il primo tentativo di indirizzamento indiretto, avevo pensato di costruire un puntatore, ma con il problema che ho riportato sopra.

Con quest'ultima modifica ho risolto. Ciao e grazie.

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