Vai al contenuto
PLC Forum


Puntatore A Tipo Any - Problema con multi istanza


caracarogna

Messaggi consigliati

Ciao a tutti,

Ho creato 2 FB, il primo avente in input 2 parametri ANY, nella stat una chiamata al secondo FB e nella temp un appoggio di tipo ANY.

Il secondo FB ha un parametro input di tipo ANY e nella temp un appoggio di tipo ANY.

FUNCTION_BLOCK "SUB_1"
TITLE =SUB_1
AUTHOR : CARACAROGNA
VERSION : 0.1
VAR_INPUT
               ANY1 : ANY;    
               ANY2 : ANY;    
END_VAR
VAR_IN_OUT
END_VAR
VAR
               SUB_2 : "SUB_2";    
END_VAR
VAR_TEMP    
               APP_ANY : ANY;
END_VAR
BEGIN
NETWORK
....
END_FUNCTION_BLOCK

FUNCTION_BLOCK "SUB_2"
TITLE =SUB_2
AUTHOR : CARACAROGNA
VERSION : 0.1
VAR_INPUT
               ANY1 : ANY;    
END_VAR
VAR_IN_OUT
END_VAR
VAR
END_VAR
VAR_TEMP    
               APP_ANY : ANY;
END_VAR
BEGIN
NETWORK
....
END_FUNCTION_BLOCK
Quello che vorrei fare e' passare il secondo parametro in Input di SUB_1 nel parametro in Input di SUB_2. L'unico modo per farlo (l'unico a mia conoscenza) e' il seguente:
   
          L     P##ANY1             
      LAR1  
      L     W [AR1,P#0.0]            
      T     LW     0                // APP_ANY (temp)  
      L     D [AR1,P#2.0]            
      T     LD     2                 // APP_ANY (temp)
      L     D [AR1,P#6.0]            
      T     LD     6                 // APP_ANY (temp)

      CALL  #SUB_2
       BUFFER:=#APP_ANY
Per utilizare il parametro ANY1 internamente a SUB_2 ho operato in maniera analoga ... e qui ho commesso un'errore! Dentro a SUB_2 ho scritto il seguente codice:
   
          L     P##ANY1             
      LAR1  
      L     W [AR1,P#0.0]             
      T     LW     0                // APP_ANY (temp)
      L     D [AR1,P#2.0]            
      T     LD     2                // APP_ANY (temp)
      L     D [AR1,P#6.0]            
      T     LD     6                // APP_ANY (temp)
    ....
Non tenendo conto dell'offset all'interno del DB d'istanza, risultato P##ANY1 (sub2) = ANY1 (sub1) Per gestire l'offset ho modificato il codice nel modo seguente:
      TAR2
      L     P##ANY1
      +D       
      LAR1  
      L     W [AR1,P#0.0]             
      T     LW     0               // APP_ANY (temp)
      L     D [AR1,P#2.0]            
      T     LD     2               // APP_ANY (temp)
      L     D [AR1,P#6.0]            
      T     LD     6               // APP_ANY (temp)
    ....

Ma nulla da fare ... lo stop del mio 400 arriva inesorabile!

Ma dove sbaglio???

Modificato: da caracarogna
Link al commento
Condividi su altri siti

  • 3 weeks later...

Nel tuo codice vedo che per tener condo della multipla istanza ha i fatto questo...

TAR2

L P##ANY1

+D

LAR1

Ma devi ricordare che TAR2 porta in ACCU1 anche l'area code e quindi devi PULIRE l'area code (normalmente 0x84) e poi fare la somma.

Modifica il codice così:

TAR2

SLD 8 //Pulitura 8 bit "alti"

SRD 8

L P##ANY1

+D

LAR1

e vedrai che dovrebbe andare meglio. Sicuramente il tuo plc ti andava in stop a causa di "area code non correct"...

Ciao!

Link al commento
Condividi su altri siti

non ci avevo pensato...

Appena posso provo a tirare su tutto (ormai era in archivio) e ci provo

Nel Mentre ... GRAZIE MILLE

P.S. appena ho provato ti faccio sapere ...

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