Vai al contenuto
PLC Forum


Dati In Formato Any


Spand

Messaggi consigliati

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


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

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

      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: da batta
Link al commento
Condividi su altri siti

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

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

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

è 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

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

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

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

      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

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

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

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

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: da pigroplc
Link al commento
Condividi su altri siti

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

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

  • 11 months later...

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

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

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