Vai al contenuto
PLC Forum


Trasferimento Dati


mazzucconi

Messaggi consigliati

Buongiorno a tutti,

io devo trasferire alcuni dati tra db.

Le db sono numericamente abbinate a delle postazioni rotanti.

Esempio: i dati della stazione 2 sono nella db2 quelli della 20 nella db20 e così via.

In funzione della stazione che mi trovo davanti e quella a cui devo andare, effettuo il trasferimento.

Come potete immaginare le combinazioni #blocco_read e #blocco_write sono parecchie.

C'è un modo di abbinare ad un numero la db?

Mi spiego, io identifico che davanti a me c'è la stazione 17 e devo andare alla stazione 2. vorrà dire che le db #blocco_read e #blocco_write saranno la 17 e la 2.

Io ho fatto così, ma diventa lunghissimo gestire le combinazioni.

FC 49

CALL FC 50

blocco_read :=DB20

blocco_write:=DB30

FC 50

L 20

cont: T DB55.DBW 0

L DB55.DBD 20

SLD 3

LAR1

L DB55.DBD 24

SLD 3

LAR2

AUF #blocco_read

L DBB [AR1,P#0.0]

AUF #blocco_write

T DBB [AR2,P#0.0]

L L#1

L DB55.DBD 20

+D

T DB55.DBD 20

L L#1

L DB55.DBD 24

+D

T DB55.DBD 24

L DB55.DBW 0

LOOP cont

Grazie

Link al commento
Condividi su altri siti


:D Hai centrato il problema Vince.

Approfitto ancora, deve essere per forza MW?

Può essere una DBW?

In ogni caso va bene così.

Grazie mille e ciao

Link al commento
Condividi su altri siti

In genere basta che sia un numero intero, e puoi fare anche così:

Temp: 
   SourceDB as Integer 
   DestinationDB as Integer
end Temp


L DBxx.DBWxx
T SourceDB

AUF DB [SourceDB]

Link al commento
Condividi su altri siti

Ho letto il suggerimento di Gianluca ed ho fatto una cosa del genere nel blocco fc.

ho dichiarato

IN

Nome = blocco_read

tipo di dati = INT

segmento 1

L DBXY.DBWKK

T #blocco_read

AUF DB [#blocco_read] //non mi permette l'istruzione.

Significa che posso solo farlo con MW?

Link al commento
Condividi su altri siti

Ti scrivo un paio di dritte per ottimizzare il codice:

1) Per incrementare i registri AR1 e AR2 per puntare al byte successivo puoi usare l'istruzione +AR1 P#1.0, quindi sostituisci le 8 righe

L L#1
L DB55.DBD 20
+D 
T DB55.DBD 20

L L#1
L DB55.DBD 24
+D 
T DB55.DBD 24
con queste 2 righe:
+AR1 P#1.0
+AR2 P#1.0
di conseguenza puoi spostare le seguenti istruzioni fuori dal loop (a inizio segmento):
L DB55.DBD 20
SLD 3
LAR1 

L DB55.DBD 24
SLD 3
LAR2
Queste impostano il valore iniziale di AR1 e AR2 solo la prima volta (a proposito, come azzeri/imposti DBD20 e DBD24? forse da qualche altra parte?) 2) Se hai bisogno di trasferire dati tra 2 DB senza aprirle ad ogni ciclo di loop puoi usare anche l'istruzione AUF DI :
AUF DB 20  
AUF DI 30
L DBB5  // Legge byte 5 della DB20
T DIB5  // Scrive nel byte 5 della DB30
L DBB6    // Legge byte 6 della DB20
T DIB6  // Scrive nel byte 6 della DB30
....
Puoi anche passare il numero di DB dall'esterno in 2 parametri IN/INT, ma devi appoggiarti a 2 word temp:
blocco_read    In    INT            
blocco_write    In    INT            
t_blocco_read    Temp    INT            
t_blocco_write    Temp    INT            

      L     #blocco_read
      T     #t_blocco_read
      L     #blocco_write
      T     #t_blocco_write
      AUF   DB [#t_blocco_read]
      AUF   DI [#t_blocco_write]
Queste 6 istruzioni le fai una sola volta a inizio segmento. 3) Per l'indice del loop non serve sprecare una word della DB, puoi usare una word locale Temp 4) Se non hai motivi particolari puoi trasferire 4 byte alla volta anzichè 1:
      L     DBD [AR1,P#0.0]
      T     DID [AR2,P#0.0]
e poi incrementare i registri di 4:
+AR1 P#4.0
+AR2 P#4.0
5) Guardati anche l'h e l p dei blocchi SFC20 e SFC81 (basta che li evidenzi e premi F1) il tuo FC50 si ridurrebbe a queste poche istruzioni:
      CALL  "BLKMOV"
       SRCBLK :=P#DB20.DBX0.0 BYTE 20
       RET_VAL:=#Temp1
       DSTBLK :=P#DB30.DBX0.0 BYTE 20

Se i 20 byte nelle DB sono facenti parte a una struttura quando confermi il testo "P#DB20.DBX0.0 BYTE 20" sarà sostituito dal nome della struttura (quindi molto + elegante).

Quest'ultimo codice puoi modificarlo per passare il NR di DB dall'esterno, ma è un po' macchinoso (bisogna costruire il puntatore ANY nelle variabili locali), comunque mi sembra ci sia un esempio preconfezionato proprio per trasferire dati tra 2 DB nell'h e l p: "Esempio per il tipo di dati ANY"

6) Attenzione che il registro AR2 non è liberamente usabile, ha dei limiti che ora non ricordo (usi interni Siemens...)

Scusate la lungaggine, ma stasera non ho sonno e mi va di fare un po' di didattica, spero sia bene accetta!!! ;)

Modificato: da JumpMan
Link al commento
Condividi su altri siti

Ciao JumpMan,

ti rispondo ora perchè ero fuori sede.

Ti ringrazio per il suggerimento, ora provo a leggerlo bene ad applicarlo, sai non sono un programmatore di professione.

Comunque la didattica è sempre ben accetta.

Grazie

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