Vai al contenuto
PLC Forum


copiare dati da un DB e trasferirli in un altro DB


coquinati

Messaggi consigliati

ciao a tutti.

premetto che son passati 3 anni da  l'ultima volta che ho aperto un programma di un plc,

pochi giorni fa ho ripreso in mano per necessità anche un pò per sfida un programma che avevo scritto tempo fa.

ho  una struttura dati nel db di questo tipo :

 

MDIB    STRUCT         MDI movement block    

    b_176    BYTE    B#16#0        
    b_177    BYTE    B#16#0        
G_1_EN    BOOL    FALSE     enable bit for G function group 1    
G_2_EN    BOOL    FALSE     enable bit for G function group 2    
b_178_2    BOOL    FALSE        
b_178_3    BOOL    FALSE        
X_T_EN    BOOL    FALSE     enable bit for position / dwell time    
b_178_5    BOOL    FALSE        
b_178_6    BOOL    FALSE        
b_178_7    BOOL    FALSE        
     V_EN    BOOL    FALSE     enable bit for velocity    
M_1_EN    BOOL    FALSE     enable bit for M function group 1    
M_2_EN    BOOL    FALSE     enable bit for M function group 2    
M_3_EN    BOOL    FALSE     enable bit for M function group 3    
b_179_4    BOOL    FALSE        
b_179_5    BOOL    FALSE        
b_179_6    BOOL    FALSE        
b_179_7    BOOL    FALSE        
G_1_VAL    BYTE    B#16#0     value G function group 1    
G_2_VAL    BYTE    B#16#0     value G function group 2    
     b_182    BYTE    B#16#0        
     b_183    BYTE    B#16#0        
        X_T_VAL    DINT    L#0     value position / dwell time    
            V_VAL    DINT    L#0     value velocity    
M_1_VAL    BYTE    B#16#0     value M function group 1    
M_2_VAL    BYTE    B#16#0     value M function group 2    
M_3_VAL    BYTE    B#16#0     value M function group 3    
      b_195    BYTE    B#16#0        
    END_STRUCT            

 

Visto che non mi è permesso modificare l'ordine  dei byte/bit/word ho pensato di provare attraverso l'utilizzo dei puntatori:

per ora mi ero limitato a provare copiare solo i byte scrivendo cosi:

 

 

  AUF   DI   353
      AUF   "SIMODRIVE_DATE_CTRL1"
      L     P#DBX 0.0
      LAR1  
      L     DIB [AR1,P#0.0]
      L     DIB [AR1,P#1.0]
      T     DBB [AR1,P#0.0]
      T     DBB [AR1,P#1.0]
      L     DIB [AR1,P#4.0]
      L     DIB [AR1,P#5.0]
      L     DIB [AR1,P#6.0]
      T     DBB [AR1,P#4.0]
      T     DBB [AR1,P#5.0]
      T     DBB [AR1,P#6.0]
      L     DIB [AR1,P#16.0]
      L     DIB [AR1,P#17.0]
      L     DIB [AR1,P#18.0]
      L     DIB [AR1,P#19.0]
      T     DIB [AR1,P#16.0]
      T     DIB [AR1,P#17.0]
      T     DIB [AR1,P#18.0]
      T     DIB [AR1,P#19.0]

 

ho simulato la funzione ma mi va in stop . e credo anche di aver capito il perchè.

se non ricordo male i registri AR sono registri a 32bit, son convinto di aver mandato in sovracarico il registro AR. cercando nei manuali non trovo però un istruzione che mi  permetta di "pulire"

tale registro.

ripeto sono 3 anni abbondanti che non aprivo un programma ,

grazie in anticipò .

 

Link al commento
Condividi su altri siti


ho fatto un casino pazzesco ,tutti errori da principiante.

1) sono andato ad aprire con l'istruzione un blocco dati dati d'istanza dentro la propria FB

2)mi ero scordato della storia dei 2 accumulatori 

      L     DIB [AR1,P#0.0]  --------- CARICA IN ACCU 1
      L     DIB [AR1,P#1.0] --------- ACCU 1 VA IN ACCU 2 E CARICA IL VALORE IN ACCU 1
      T     DBB [AR1,P#0.0]  -------- TRASFERISCE IL VALORE DI ACCU 1 
      T     DBB [AR1,P#1.0] ------TRASFERISCE IL VALORE DI ACCU 1 

 

ma esiste una funzione SFC in grado di copiare blocchi dati? .

mi ricordo che usavo la SFC20 blk_move però può essere usata solo per dati di tipo uguale

Link al commento
Condividi su altri siti

Quote

mi ricordo che usavo la SFC20 blk_move però può essere usata solo per dati di tipo uguale

Non mi pare. Alla SFC20 BLKMOVE passi i paramatri in formato ANY, e non gliene frega niente di cosa contengano i DB.

Nel 1500 c'è l'istruzione MOVE_BLK che presenta i limiti da te citati, ma esiste ancora anche l'istruzione BLKMOVE (nelle istruzioni di base, gruppo Legacy, non disponibile per il 1200) che si comporta alla vecchia maniera.

Link al commento
Condividi su altri siti

Quote

nel 1200 c'è la funzione Poke_blk (SCL) che ti permette di muovere dati da un DB all'altro o all'interno dello stesso DB

Vero. Disponibile, ovviamente, anche per il 1500, spesso può risultare più comoda di BLKMOVE, perché come parametri richiede numero DB e offset, più facili da gestire in modo dinamico rispetto ad una variabile ANY.

Poi, da TIA V14 è possibile inserire segmenti in SCL, e questo rende molto pratico l'utilizzo di POKE_BLK anche in blocchi in KOP.

Link al commento
Condividi su altri siti

blkmov è limitata nel senso che devi definire la db d'origine e destinazione, altre limitazioni non ne conosco (per questo motivo mi son creato un mio blkmov :P )

comunque sia..

Dato che devi rispettare la struttura d'origine non hai problemi, ti basta usare blkmov così

XL1EMLo.png

Link al commento
Condividi su altri siti

il 21/10/2017 at 21:19 , batta scrisse:

Non mi pare. Alla SFC20 BLKMOVE passi i paramatri in formato ANY, e non gliene frega niente di cosa contengano i DB.

Nel 1500 c'è l'istruzione MOVE_BLK che presenta i limiti da te citati, ma esiste ancora anche l'istruzione BLKMOVE (nelle istruzioni di base, gruppo Legacy, non disponibile per il 1200) che si comporta alla vecchia maniera.

salve flavio.

ho dimenticato di specificare che lavoro con una unita s7-300 ,

come mi ha detto sto eseguendo delle prove con la sfc 20, ma resta il fatto che io devo parametrizzare il formato ANY , e anche li mi sono sorti dei dubbi di questo tipo:

 

 AUF   "SIMODRIVE_DATE_CTRL1"

//***********************
      LAR1  P##Sorgente_dati            // ANY
//***********************
      L     W#16#1002                   // carico ID tipo ( 10) , è il tipo dati(02)=byte --------------> ma è corretto impostarla con  02 che equivale a tipo dati byte? 
      T     LW [AR1,P#0.0]
      L     20                                 // NR byte da trasferire, fattore di     ripetizione
      T     LW [AR1,P#2.0]
      L     #DB_SORGENTE                // nr db sorgente
      T     LW [AR1,P#4.0]
      L     0                                     //    (0=inizio lettura)  
      SLD   3                                 //   
      OD    DW#16#85000000              //    (85=blocco dati instanza)
      T     LD [AR1,P#6.0]              //      
//                                          
//***************************
      LAR1  P##Destinatario_dati        //  ANY
//***************************
      L     W#16#1002                     // ID code & type
      T     LW [AR1,P#0.0]
      L     20                                    // Nr. bytes
      T     LW [AR1,P#2.0]
      L     #DB_DESTINAZIONE            // Nr. DB destination = DB 20
      T     LW [AR1,P#4.0]
      L     DBB    0                          // From DW number
      SLD   3
      OD    DW#16#84000000
      T     LD [AR1,P#6.0]


      CALL  "BLKMOV"
       SRCBLK :=#Sorgente_dati
       RET_VAL:=#ret_val_sfc20
       DSTBLK :=#DB_DESTINAZIONE
 

 

11 ore fa, DesmoGiec scrisse:

blkmov è limitata nel senso che devi definire la db d'origine e destinazione, altre limitazioni non ne conosco (per questo motivo mi son creato un mio blkmov :P )

comunque sia..

Dato che devi rispettare la struttura d'origine non hai problemi, ti basta usare blkmov così

XL1EMLo.png

cioè io volendo posso saltare tutto il procedimento di parametrizzazione dei dati tipo ANY?

 

GRAZIE MILLE A TUTTI:)

Link al commento
Condividi su altri siti

Quote

cioè io volendo posso saltare tutto il procedimento di parametrizzazione dei dati tipo ANY?

Certo!
La creazione del puntatore di tipo ANY ti serve solo se hai bisogno di modificare dinamicamente gli indirizzi.
Se le aree da copiare sono fisse, scrivi direttamente come nell'esempio di DesmoGiec.

 

Che poi, se devi modificare dinamicamente gli indirizzi, fai prima a crearti una tua funzione di copia area piuttosto che la funzione per creare i puntatori ANY.

Link al commento
Condividi su altri siti

il 23/10/2017 at 19:51 , batta scrisse:

Certo!
La creazione del puntatore di tipo ANY ti serve solo se hai bisogno di modificare dinamicamente gli indirizzi.
Se le aree da copiare sono fisse, scrivi direttamente come nell'esempio di DesmoGiec.

 

Che poi, se devi modificare dinamicamente gli indirizzi, fai prima a crearti una tua funzione di copia area piuttosto che la funzione per creare i puntatori ANY.

grazie molte batta per le risposte.

comunque non riesco a capire perchè il codice sopra (parametrizzazione dei daty tipo any) .

lei a primo impatto vede qualche errore ?

grazie

Link al commento
Condividi su altri siti

16 ore fa, coquinati scrisse:

grazie molte batta per le risposte.

comunque non riesco a capire perchè il codice sopra (parametrizzazione dei daty tipo any) .

lei a primo impatto vede qualche errore ?

grazie

CALL  "BLKMOV"
       SRCBLK :=#Sorgente_dati
       RET_VAL:=#ret_val_sfc20
       DSTBLK :=#DB_DESTINAZIONE

L'errore è in DSTBLK. Non è #db_destinazione ma #Destinatario_dati

 

 

Link al commento
Condividi su altri siti

il 27/10/2017 at 10:45 , DesmoGiec scrisse:

CALL  "BLKMOV"
       SRCBLK :=#Sorgente_dati
       RET_VAL:=#ret_val_sfc20
       DSTBLK :=#DB_DESTINAZIONE

L'errore è in DSTBLK. Non è #db_destinazione ma #Destinatario_dati

 

 

 

Grazie mille 

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