GDA Inserito: 7 giugno 2005 Segnala Inserito: 7 giugno 2005 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?
h.ki Inserita: 8 giugno 2005 Segnala Inserita: 8 giugno 2005 ????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??
STEU Inserita: 8 giugno 2005 Segnala Inserita: 8 giugno 2005 Sembra un argomento interresante puoi spegarti meglio , magari postando una parte di codice?
GDA Inserita: 8 giugno 2005 Autore Segnala Inserita: 8 giugno 2005 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_VARBEGINTAR1 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: 8 giugno 2005 Segnala Inserita: 8 giugno 2005 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.
GDA Inserita: 9 giugno 2005 Autore Segnala Inserita: 9 giugno 2005 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 peripherieNel 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: 9 giugno 2005 Segnala Inserita: 9 giugno 2005 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.
Val Inserita: 9 giugno 2005 Segnala Inserita: 9 giugno 2005 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 esempioad 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
GDA Inserita: 9 giugno 2005 Autore Segnala Inserita: 9 giugno 2005 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...
JumpMan Inserita: 10 giugno 2005 Segnala Inserita: 10 giugno 2005 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 ?
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