Spand Inserito: 15 ottobre 2013 Segnala Share Inserito: 15 ottobre 2013 Salve, Premetto che ho cercato nel forum ma non ho trovato nulla che mi aiuti. Devo utilizzare ripetutamente la SFC20 BLKMOVE, come SRCBLK vorrei creare una variabile locale che parametrizzandola poi mi viene facile spostare le aree di memoria che mi servono, ma credo di avere un poca di confusione. Ho dichiarato come variabile locale di tipo ANY #DB_SORG dall'indirizzo 10.0 L P#130.0 T MD 310 L B#16#10 //10h per S7 T LB 10 L B#16#2 //Tipo di dati BYTE T LB 11 L 30 //lunghezza del zona da copiare in byte T LW 12 L 201 // DB sorgente T LW 14 L DBD [MD 310] L DW#16#84FFFFFF UD T LD 16 Scusate ma si è publicata prima che finissi di scrivere, La variabile MD310 è momentaneamente fissa poi la farò incrementabile, il risulatato che mi aspetto di avere dovrebbe essere: P#DB201.DBX130.0 BYTE 30 ma ho come risultato che mi và in stop la CPU Ogni suggerimento è benvenuto Link al commento Condividi su altri siti More sharing options...
ARO76 Inserita: 15 ottobre 2013 Segnala Share Inserita: 15 ottobre 2013 Buongiorno Spand, ho provato a riscrivere il tuo codice con la sintassi che uso di solito con puntatore any e BLKMOV: L 130 //indirizzo partenza dati nel DB sorgente T MD 310 LAR1 P##DB_SORG //Carica l'indirizzo iniziale del puntatore ANY nel registro AR1 L B#16#10 //Carica il syntax ID e la trasferisce nel puntatore ANY T LB [AR1,P#0.0] L B#16#2 //Carica il tipo dati BYTE e lo trasferisce nel puntatore ANY T LB [AR1,P#1.0] L 30 //Carica la lunghezza della zona da copiare e la trasferisce nel puntatore ANY T LW [AR1,P#2.0] L 201; //Carica il numero del DB sorgente e lo trasferisce nel puntatore ANY T LW [AR1,P#4.0] L P#DBX 0.0 //carica il puntatore nel formato byte.bit L MD 310 //carica l'indirizzo del primo byte da copiare SLD 3 //crea il puntatore +D T LD [AR1,P#6.0] //trasferisce il puntatore al primo byte da copiare nel puntatore ANY a seguire la parte di codice identica per eventuale puntatore any a DB destinazione e poi la chiamata a SFC20 (BLKMOV) Fammi sapere se ho capito il problema e la mia soluzione funziona. Link al commento Condividi su altri siti More sharing options...
Spand Inserita: 15 ottobre 2013 Autore Segnala Share Inserita: 15 ottobre 2013 Colpito nel segno! Grazie molte. Direi che così funziona alla grande, anche se non mi è chiaro come mai si deve per forza passare per AR1 e non si possono settare direttamente i singoli campi della variabile ANY. Link al commento Condividi su altri siti More sharing options...
batta Inserita: 15 ottobre 2013 Segnala Share Inserita: 15 ottobre 2013 (modificato) L DBD [MD 310] L DW#16#84FFFFFF UD T LD 16 Qui ci sono due errori. 1) scrivendo L DBD[MD 310] carichi il valore della doppia word puntata da MD310 (quindi DBD130 in questo caso) del DB attualmente aperto. Invece dovresti prendere semplicemente MD310, che è giù un indirizzo. 2) per completare l'indirizzo con l'area di memoria 84 Hex (blocco dati) non devi fare un AND come hai fatto tu, ma un OR con il valore DW#16#84000000 Modificato: 15 ottobre 2013 da batta Link al commento Condividi su altri siti More sharing options...
ken Inserita: 17 ottobre 2013 Segnala Share Inserita: 17 ottobre 2013 Discussione interessante. era tempo che cercavo di capire come fare questa funzione. poi pigrizia e poco tempo a disposizione non mi hanno mai aiutato. ora proverò questa soluzione molto interessante. Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 17 ottobre 2013 Segnala Share Inserita: 17 ottobre 2013 Ciao a tutti, ho bisogno di una delucidazione, se voglio spostare ad esempio il db201.dbx 0.0 byte 10 a db 202.dbx0.0 byte 10 posso utilizzare fc20 BLKMOVE senza creare un puntatore any locale, perche' allora si deve creare una variabie locale #sorgenti tipo any con le varie istruzioni fino al decimo byte e lo stesso per la destinazione? grazie Link al commento Condividi su altri siti More sharing options...
ken Inserita: 17 ottobre 2013 Segnala Share Inserita: 17 ottobre 2013 ti basta scrivere p#db201.dbx0.0 byte 10 direttamente in sfc 20 come sorgente e p#db202.dbx0.0 byte 10 il puntatore serve se queste aree cambiano Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 17 ottobre 2013 Segnala Share Inserita: 17 ottobre 2013 Grazie ken per la risposta, Ho visto che si possono spostare byte o word tra due db con p# ecc. Ma allora cosa mi serve parametrizzare un puntatore any locale ? Ti premetto che sto imparando quindi sicuramente mi sfugge il reale utilizzo dei puntatori any. Grazie se qualcuno mi puo aiutare Link al commento Condividi su altri siti More sharing options...
ken Inserita: 17 ottobre 2013 Segnala Share Inserita: 17 ottobre 2013 è lo stesso utilizzo che si fa con gli altri puntatori solo che, in questo caso, non fai un puntatore per un singolo bit o byte oppure per una word o doppia word ma lo fai per un'intera area di memoria ti faccio un esempio veloce. si deve scegliere una ricetta di lavoro. la scelta avviene tra diversi db oppure diverse aree dello stesso db. la ricetta va copiata nel db o area del db ricetta in lavoro. se non usi i puntatori devi fare dei salti con un comparatore e richiamare sfc20 per ogni ricetta (il tuo fc diventa enorme e pesante). se usi il puntatore any invece dovrai cambiare solo l'indirizzo della sorgente usando il puntatore. richiami una volta sola sfc 20 e il tuo fc sarà più leggero Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 18 ottobre 2013 Segnala Share Inserita: 18 ottobre 2013 devo copiare da db 10 dbw 20 nr 8 byte nel db 20 dalla dbw 40 nr 8 byte scrivo: call blkmove srcblk :=p#db10.dbx20.0 byte 8 ret_val :=mw 202 dstblk:=p#db20.dbx40.0 byte 8 Negli esempi invece si crea una variabile locale : una #sorgente e una # destinazione per fare la stessa cosa che ho fatto sopra. scrivere : call blkmove srcblk :=p#db10.dbx20.0 byte 8 ret_val :=mw 202 dstblk:=#sorgente vuol dire che memorizzo gli 8 byte sorgente nel db scritto al byte 4 dei parametri any compilati per la variabile locale #sorgente? Link al commento Condividi su altri siti More sharing options...
ken Inserita: 18 ottobre 2013 Segnala Share Inserita: 18 ottobre 2013 sorgente cosa è? una variabile any o una struttura di 8byte? se è uan variabile any scriverai dove dice la variabile se una struttura di 8 byte scriverai dentro li Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 19 ottobre 2013 Segnala Share Inserita: 19 ottobre 2013 Grazie per le risposte Ken, sto cercando di capire quindi porta pazienza, ho crato un db12 sul quale ci sono dei valori interi che voglio portare al db13. Su retval mi compare l' errore 8325. U "sposto val in #sorg. 1.1" //m1.1 SPBN jump // prove di any LAR1 P##sorgente //INGRESSO INIZIALE DEL POINTER ANY IN AR1 L B#16#10 //ID DI SINTASSI PER S7 T LB [AR1,P#0.0] L B#16#5 //TIPO DI DATI SORGENTE intero T LB [AR1,P#1.0] L 6 //NUMERO DI word T LW [AR1,P#2.0] L 12 //NUMERO DB sorgente T LW [AR1,P#4.0] L P#0.0 //NUMERO word SORGENTE SLD 4 L B#16#84 //CODICE PER DATI DB OW T LD [AR1,P#6.0] jump: NOP 0 U "da #sorg in db13 1.2" FP "fp1.2" SPBN up // copio la db 12 in #sorgente CALL "BLKMOV" SRCBLK := #sorgente RET_VAL:="errore blkmove1" DSTBLK :=P#DB13.DBX 0.0 WORD 6 up: NOP 0 Link al commento Condividi su altri siti More sharing options...
batta Inserita: 19 ottobre 2013 Segnala Share Inserita: 19 ottobre 2013 L P#0.0 //NUMERO word SORGENTE SLD 4 L B#16#84 //CODICE PER DATI DB OW T LD [AR1,P#6.0] Se carichi l'indirizzo della prima variabile con P#x.y non devi poi fare lo shift. Ma, in questo caso, essendo che parti da indirizzo 0.0, non è questo che genera l'errore. Di sicuro invece è sbagliato l'OR con il valore B#16#84. Prova a sostituirlo con DW#16#84000000. E infatti, se guardi nella guida, l'errore 8325 indica "Errore di memoria nella scrittura di un parametro". Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 19 ottobre 2013 Segnala Share Inserita: 19 ottobre 2013 Grazie Batta adesso funziona, ma se io facevo CALL "BLKMOV" SRCBLK := p#db12.dbx0.0 word 6 RET_VAL:="errore blkmove1" DSTBLK :=P#DB13.DBX 0.0 WORD 6 non era la stessa ? il fatto di parametrizzare i primi 10 byte e creare una variabile interna all' fc che senso ha? grazie Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 19 ottobre 2013 Segnala Share Inserita: 19 ottobre 2013 un utilizzo pratico della parametrizzazione lo trovi scritto da me qui sotto: pigroplc Link al commento Condividi su altri siti More sharing options...
batta Inserita: 20 ottobre 2013 Segnala Share Inserita: 20 ottobre 2013 non era la stessa ? il fatto di parametrizzare i primi 10 byte e creare una variabile interna all' fc che senso ha? Certo che era la stessa cosa. Ma se tu volessi poter modificare dinamicamente l'area di dati da trasferire, scrivendo in BLKMOV direttamente l'indirizzo, non lo potresti fare. Costruendo invece il puntatore ANY, ecco che numero del DB, tipo di dati e lunghezza dell'area dati potrebbero essere impostati con delle variabili. Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 20 ottobre 2013 Segnala Share Inserita: 20 ottobre 2013 Grazie Batta sei stato molto chiaro. Grazie anche a pigroplc, ho letto la discussione ma non riesco a scaricare l'esempio di jake me lo puoi passare? Rigrazie Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 20 ottobre 2013 Segnala Share Inserita: 20 ottobre 2013 (modificato) Basta che copi-incolli l'esempio che ho inserito nel link precedente! Poi al posto dei valori fissi di byte (3238), DB sorgente (100) e DB destinatario (501) ci metti delle variabili a tuo piacimento. Ovviamente devi dichiarare nella FC i parametri temporanei. L'esempio fatto da Jake non è raggiungibile anche per me, forse perché dalla discussione sono passate alcune primavere...... comunque il limite è solamente la tua fantasia. Adesso hai gli strumenti per provare, dai. pigroplc Modificato: 20 ottobre 2013 da pigroplc Link al commento Condividi su altri siti More sharing options...
damitisi Inserita: 20 ottobre 2013 Segnala Share Inserita: 20 ottobre 2013 si ho fatto delle prove chiedevo l' esempio perchè a volte in maniera indiretta alla discussione any si possono imparare altre cose come ad esempio la maniera di programmare di altre persone magari per arrivare alla stessa cosa. Grazie per le risposte. Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 21 ottobre 2013 Segnala Share Inserita: 21 ottobre 2013 Il prossimo Aprile "festeggio" 30 anni di esperienza lavorativa nel campo delle applicazioni industriali. Un lato positivo di questo lavoro è che non si smette mai di imparare....... pigroplc Link al commento Condividi su altri siti More sharing options...
alde73 Inserita: 20 ottobre 2014 Segnala Share Inserita: 20 ottobre 2014 scusate ragazzi sono nuovo in questo forum direi molto interessante e utile.......io avrei un piccolo problema da risolvere,spostare aree di memoria........sto imparando a programmare con s7 300 sposto di tutto tranne variabili in db a db....ora vorrei costruire delle ricette o meglio formati dove ognuno verra selezionato o richiamato da hmi siemens....come sposto db su db con puntatori o richiami di programma grazie Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 21 ottobre 2014 Segnala Share Inserita: 21 ottobre 2014 ricorda che qualsiasi struttura dai piu o meno complessa , nella memoria ram e' vista come un flusso di bytes , nei dischi fissi invece come un file ....piu ' o meno per rendere l'idea Per cui col puntatore di tipo ANY , cioe qualsiasi tipo di dato , puoi puntare e manipolare strutture dati complesse Per strutture dati , invece, di tipo semplice puoi usare il tipo di puntatore al tipo di variabile .Questo significa che quando fai degli incrementi sul registro che contiene l'indirizzo del byte , tali incrementi non sono unitari ma "saltano" di un offset in base al tipo di dato dichiarato nel puntatore .Infine , i puntatore contengono indirizzi RAM del plc , e sono sempre delle doppie word .Se usi AR1 e AR2 le operazioni sono piu' veloci perche AR1 e AR2 sono registri del processore , vicini cioè alla cpu Ma puoi usare qualsiasi variabile dichiarata DWORD per memorizzarci indirizzi , quindi essere un puntatore 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