Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Ar1 Nelle Fc


Messaggi consigliati

Inserito:

Ciao a tutti, ho riscontrato un problema modificando l'AR1 in una FC. Dopo la modifica, tutti gli accessi alle variabili IN_OUT dell'FC stessa non funzionavano. Ripristinando il contenuto di AR1 prima di ogni accesso è invece ritornato tutto alla normalità. Qualcuno mi saprebbe spiegare la motivazione?


Inserita:

????non so se ho capito bene..ma l'indirizzo dei parametri IN_OUT è contenuto in AR1? se sì, allora ecco perchè variando il contenuto di AR1 cambia anche il valore dei parametri nella FC...intendevi questo??

Inserita:

Sembra un argomento interresante puoi spegarti meglio , magari postando una parte di codice?

Inserita:

mi sa che l'indirizzo dei parametri IN_OUT è proprio in AR1 nelle FC.. non so se vale anche per IN e OUT..

ecco un esempio:

VAR_IN_OUT

inOutWo:WORD;

END_VAR

BEGIN

TAR1 bckAR1TpDw;

LAR1 DPAddrTpDw; //Use AR1 to point to the peripherie

////Così non funziona

L inOutWo;

T PAW[AR1, P#6.0];

////Così invece funziona

LAR1 bckAR1TpDw;

L inOutWo;

T PAW[AR1, P#6.0];

Nicola Fraccaroli
Inserita:

Non funziona perchè l'istruzione LAR1 serve appunto per assegnare un indirizzo al registro. Quindi, nel tuo caso, non avendola scritta prima di usarla non assume significato.

Comunque, se posso darti un consiglio, per fare accesso in maniera indicizzata a indirizzi di memoria (di qualsiasi tipo), conviene usare la più semplice composizione di un puntatore.

Se vuoi spiegazioni più esaustive, vai nell'. di S7 e cerca con parola chiave: "indirizzamento".

Ciao.

Inserita:

Scusa, mi sa che è stato frainteso il codice che ho messo sul post, non ho copiato tutta la funzione perchè pensavo che creasse confusione, ma invece mi sa che ne ha creata di + ) il contenuto dell'AR1 viene inizializzato:

LAR1 DPAddrTpDw; //Use AR1 to point to the peripherie

Nel codice che ho postato manca la parte in cui copio l'indirizzo di periferia del device PROFIBUS in DPAddrTpDw.

L'ar1 viene quindi inizializzato, però nel momento in cui viene assegnato un valore diverso da quello originale, le variabili IN_OUT non sono più accessibili.

Nicola Fraccaroli
Inserita:

Hai perfettamente ragione.

Non conoscendo la struttura del programma è difficile capire dove s'annida l'errore.

In effetti, S7 modifica autonomamente il contenuto dei registri in varie occasioni, anche se non usiamo le specifiche istruzioni.

Es. il cambio di un DB d'istanza, l'accesso ad una veriabile con DBn.DBXm.f, ecc.

Per queste ragioni è buona norma, quando si lavora con ind. indiretto, caricare sempre l'indirizzo.

D'altro canto, prova ad immaginare se, a distanza di tempo, esegui delle modifiche al software; è difficile ripercorrere il flusso del programma alla ricerca del punto in cui viene assegnato l'indirizzo.

Ciao.

Inserita:

Ciao..

Il problema è noto S7 utilizza AR1 in svariate occasioni autonomamente, anche se per esempio elabori OB a tempo o ad interrupt, sono spesso risalito alla causa e da allora anche negli FC salvo e ripristino AR1 e AR2 per evitare problemi..

Ho trovato comunque alcuni altri veri bachi s7 di tutto rispetto, prova ad esempio

ad uscire da un salto a etichetta ed a interrogare lo stato di un bit puntato con AR1 o AR2, vedrai che incredibilmente l'RLC del salto si combina con la nuova prima

interrogazione indicizzata! ( eseguito in un FB - soluzione unica trovata inserire un CLR prima dell'interrogazione )

Ciao

Inserita:

Questa non l'avevo proprio mai sentita.. in teoria prima dopo il salto dovrebbe resettarsi il bit della parola di stato dell'ultima istruzione (almeno credo).. probabilmente accedendo all'AR1 viene settato di nuovo..

Grazie per la dritta comunque!

Invece io ho notato che se in un'FB si incrementa AR2, si incrementa il puntamento che step7 usa per accedere ai dati del DB di istanza della funzione, cioè se per esempio ho una temporanea che si chiama "pippo", ed è una STAT di tipo BOOL, quando aumento AR2 di un bit, se il mio programma accede di nuovo a "pippo", in realtà accederà al bit successivo a "pippo".. E questo può permettere indirizzamenti indiretti nel DB di istanza totalmente in simbolico.. potrebbe anche rivelarsi utile...

Inserita:

La storia dell’AR2 mi è nota (infatti non lo uso quasi mai), ma quella di AR1 no.... e non sembra che mi abbia mai creato problemi, non è che state mescolando le 2 cose, nel senso che date la colpa anche all’AR1 ma in realtà il problema si presenta solo usando AR2 ?

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