Vai al contenuto
PLC Forum


Uso Dei Puntatori Ar1/2


JumpMan

Messaggi consigliati

Avendo un FC con un dato Temp che si chiama #Pippo

Che differenza c'è tra il fare:

L ##Pippo
LAR1
e:
LAR1 ##Pippo

?

Perchè ho notato che il 1° metodo funziona anche con parametri IN/OUT/ON-OUT mentre il 2° funziona solo con i dati Temp.

Ciao

Link al commento
Condividi su altri siti

  • 1 month later...

Nel primo caso carichi il valore scritto in Pippo nel registro AR1, nel secodo caso sommi al valore di AR1 il valore scritto in pippo. Spero di essere stato chiaro!

Ciao

Link al commento
Condividi su altri siti

Il primo ed il secondo caso fanno la STESSA COSA. La differenza è che nel primo caso è possibile caricare anche un valore a 16 bit, nel secondo è possibile solo scrivere valori a 32 bit.

L'indirizzo di un qualsiasi oggetto di memoria è sempre un numero a doppia precisione.

Quando nel primo caso carichi "pippo", questo viene copiato nell'accumulatore (a 32 bit) e con l'operazione LAR1 viene caricato l'accumulatore nel registro 1.

Nel secondo caso nel registro 1 viene direttamente caricato la doppia parola "pippo" (deve essere però una doppia parola).

Compreso?

Link al commento
Condividi su altri siti

Come già correttamente sottolineato il secondo metodo accetta oltre a costanti in formato P#, dati a 32 bit ma solo MD, LD, DBD o DID (come dice l'. dell'editor andando sopra l'istruzione evidenziata in rosso in quanto non accettata).

Quindi accetta solo variabili dichiarate TEMP perchè fanno parte dell'area L a differenza delle dichiarazioni INPUT/OUTPUT

Modificato: da FabioS
Link al commento
Condividi su altri siti

Scusate se sono prolisso, ma faccio un esempio:

In un FB (supponiamo FB1) ho un parametro di ingresso double word di nome #Pippo (che risiede nella DB d’istanza , supponiamo "DB1").

Perché all’interno di FB1 mi accetta:

LAR1 "DB1".Pippo
, e non accetta invece:
LAR1 #Pippo

?

Ho capito che si aggira il problema usando la doppia istruzione (L #Pippo ….LAR1), ma mi chiedo se c'è una motivazione valida della non elasticità del 2° metodo (quello "monoriga").

Ciao

Modificato: da JumpMan
Link al commento
Condividi su altri siti

  • 3 months later...

I parametri di ingresso di FB e FC non possono essere usati direttamente per indicizzare.

Ad esempio:

-------------------------------

FB1,DB1

input: #N_DB

AUF DB[#N_DB] <-----SBAGLIATO

-------------------------------

Se tu invece definisci anche una temporanea, passi per quella, e poi puoi usarla per indicizzare:

-------------------------------

FB1,DB1

input: #N_DB

temp: #N_DB_TEMP

L #N_DB

T #N_DB_TEMP

AUF DB[#N_DB_TEMP] <-----CORRETTO

-------------------------------

Gli esempi sopra si riferivano all'apertura di un DB; volendo indicizzare ad esempio una word, usando AR1, la sintassì è:

L DBW[AR1,p#0.0]

dove il contenuto di AR1 deve essere stato trasferito a priori, ma non direttamente: l'unica soluzione è appunto passare per le 2 righe di istruzione del tipo

L P##INDIR_ING

LAR 1

perchè in questo modo c'è un passaggio per l'accumulatore ACCU1 a 32bit.

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