mazzucconi Inserito: 26 maggio 2009 Segnala Share Inserito: 26 maggio 2009 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:=DB30FC 50 L 20cont: 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 contGrazie Link al commento Condividi su altri siti More sharing options...
Vince73PLC Inserita: 26 maggio 2009 Segnala Share Inserita: 26 maggio 2009 non so se ho capito bene...ma puoi fareAUF DB [MW10]per esempio, dove in MW 10 è registrata la tua posizione tavola rotante...ciao! Link al commento Condividi su altri siti More sharing options...
mazzucconi Inserita: 26 maggio 2009 Autore Segnala Share Inserita: 26 maggio 2009 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 More sharing options...
TravelMen Inserita: 26 maggio 2009 Segnala Share Inserita: 26 maggio 2009 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 More sharing options...
mazzucconi Inserita: 26 maggio 2009 Autore Segnala Share Inserita: 26 maggio 2009 Ho letto il suggerimento di Gianluca ed ho fatto una cosa del genere nel blocco fc.ho dichiarato IN Nome = blocco_readtipo di dati = INTsegmento 1L DBXY.DBWKKT #blocco_readAUF DB [#blocco_read] //non mi permette l'istruzione.Significa che posso solo farlo con MW? Link al commento Condividi su altri siti More sharing options...
peopeo Inserita: 26 maggio 2009 Segnala Share Inserita: 26 maggio 2009 (modificato) Sei sicuro? dovrebbe essere ok... ma la variabile #blocco_read la devi definire in temp Modificato: 26 maggio 2009 da peopeo Link al commento Condividi su altri siti More sharing options...
mazzucconi Inserita: 26 maggio 2009 Autore Segnala Share Inserita: 26 maggio 2009 Così va bene.Troppo forti (voi)!Operazione conclusa.Grazie ancora Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 27 maggio 2009 Segnala Share Inserita: 27 maggio 2009 (modificato) 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: 27 maggio 2009 da JumpMan Link al commento Condividi su altri siti More sharing options...
mazzucconi Inserita: 28 maggio 2009 Autore Segnala Share Inserita: 28 maggio 2009 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 More sharing options...
JumpMan Inserita: 28 maggio 2009 Segnala Share Inserita: 28 maggio 2009 Di niente, se non ti è chiaro qualcosa dimmelo. Link al commento Condividi su altri siti More sharing options...
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