Vai al contenuto
PLC Forum


Utilitzzo Db Indicizzate


Messaggi consigliati

Inserito:

Ciao a tutti,

ho iniziato da pochi giorni a programmare con plc Siemens e inizio ad avere delle difficoltà.

Ho bisogno di copiare i valori dei dati presenti in db6 dentro a delle altre db (dalla 120 alla 139) che hanno la stessa struttura della db sorgente. Per farlo avevo pensato ad aprire la db destinazione con un puntatore e copiare i dati che mi servono, il tutto con un codice tipo il seguente:

// In MW95 c'è il valore INT con il numero della DB da aprire (120 -139)

AUF DB [MW 95]

L DB6.DBW24

T DBW24

Se non ho capito male questo pezzo di porgramma dovrebbe copiare il valore contenuto in DB6.DBW24 in DB120.DBW24 (ponendo che MW95 sia 120), ma non funziona. Non ricevo errore di nessun tipo dalla CPU, ma il valore non lo copia dove voglio io.

Grazie per eventuali aiuti..


Matteo Montanari
Inserita:

seguendo le istruzioni che hai scritto, il plc esegue le seguenti operazioni:

AUF DB [MW 95] apre il blocco dati puntato. (DB120 ponendo che MW95 sia 120)

L DB6.DBW24 carica nell'accumulatore il valore presente nel blocco dati 6 (DB6) all indirizzo 24, in questo modo il blocco dati 120 aperto in precedenza viene chiuso.

T DBW24 trasferisce il valore presente nell'accumulatore (db6.dbw24) nell'indirizzo 24 del blocco dati aperto (in questo caso il 6 e quindi trasferisce DB6.DBW24 in DB6.DBW24)

per risolvere il tuo problema puoi scrivere in questo modo:

L DB6.DBW24

AUF DB [MW 95]

T DBW24

oppure, se sei in un FC e non in un FB con DB di instanza

L DB6.DBW24

AUF DI [MW 95]

T DIW24

oppure

AUF DI [MW 95]

L DB6.DBW24

T DIW24

Inserita:

Grazie keosmm è quello di cui avevo bisogno

Ciao e grazie ancora

Inserita:

Ciao,

ti do una piccola informazione affinché ti rischiari meglio il tema, tenterò di informarti lo più chiaramente possibile

Direccionamiento indiretto per memoria

La direzione dell'operando viene indicata per un tiratore.

Formato di istruzione con direccionamiento indiretto per memoria:

L T[MW2]

Operazione Operando Tiratore che mira alla direzione (tra automatici)

In questo esempio l'istruzione è un carico in ACU1 del valore del temporizzatore il cui numero

è contenuto in MW2.

Secondo l'identificatore dell'operando, l'operazione valuta i dati depositati nella direzione

come tiratore in formato parola o doppia parola.

Tiratore in formato parola, indica il numero in formato decimale di:

• Temporizadores (T)

• Contadores (Z)

• Blocchi di dati (DB, diedi)

• Blocchi logici (FC, FB)

L 5 / /Carga 5 in ACU1

T MW2 / /TRANSFIERO 5 A MW2

L T[MW2] / /Carga il valore attuale del temporizzatore T5 in ACU1

Tiratore in formato doppia parola, indica la direzione di:

• Bit

• Byte

• Palabra

• Doppia parola

Versione 22/01/2002 Pag. 105 di 154

Un tiratore ha il seguente formato come doppia parola:

P#Byte.Bit

Es.:

L P#4.1 / /Carga il tiratore in ACU1

T MD2 / /Transfiero il risultato ad una doppia parola

O E[MD2] / /Consulta lo stato del segno nell'avanzato E4.1

= A[MD2] / /y assegna quello stato di segno all'uscita A4.1

Per indirizzare byte, parola e doppia parola il bit di tiratore deve essere sempre 0.

Es.:

L P#4.0 / /Carga il tiratore in ACU1

T MD2 / /Transfiero il risultato ad una doppia parola

L EB[MD2] / /Cargo l'ACU1 il byte di avanzate 3

Osservazioni:

• Il tiratore dovrà immagazzinarsi in:

Marche (M)

Blocchi di dati (DB)

Dati locali (L)

• Direccionamiento indiretto di blocchi di dati:

Es.:

L 1 / /Cargo 1 in ACU1

T MW10 / /TRANSFIERO 1 A MW10

L P#4.0 / /Cargo il tiratore in ACU1

T MD2 / /Transfiero il tiratore a MD2

AUF DB[MW10] / /Abro il DB1

L DBD[MD2] / /En ACU1 carico DBD4 (Il doppio parola 4 del DB)

Non si potrebbe fare così: L DB[MW10] .DBD[MD2]

Inoltre, nell'esempio dovrà esistere previamente il DB1, se no, dà sfinito.

• I tiratori possono sommarsi.

Es.:

L P#124.2 / /Cargo leader

L P#0.7 / /Cargo leader

+D / /Los sommo: 124.2 + 0.7 = P#125.1

Es.:

L P#124.2 / /Cargo leader

L 3 / /SUMO 3 BITS

+D / /RESULTADO: P#124.5

• può osservarsi il tiratore con “Observar/Forzar Variabile.”

Es.:

Operando Formato di stato

-------------------------------------------

MD4 Leader

Spero che ti serva e ti chiarisca meglio :D

Scusa per alcuno mancanza di ortografia ma il mio Italiano non è molto buono :rolleyes:

  • 3 weeks later...
Inserita:

Scusate ma non c'era un bel SFC chiamato Block Move ? tanto la zona di dati è uguale ..... sbaglio ?

Inserita: (modificato)

mi hai tolto le parole di bocca.

Modifico il messaggio per aggiungere:

SFC20 Block Move

Modificato: da ken
  • 3 weeks later...
Matteo Montanari
Inserita:
Scusate ma non c'era un bel SFC chiamato Block Move ? tanto la zona di dati è uguale ..... sbaglio ?

----

mi hai tolto le parole di bocca.

Modifico il messaggio per aggiungere:

SFC20 Block Move

volendo creare un blocco da utilizzare e parametrizzare come si vuole, si può utilizzare questo codice:

FUNCTION FC 125 : VOID
TITLE =COPY BLOCK
AUTHOR : Keos
NAME : Copy_Bk
VERSION : 0.1


VAR_INPUT
  DB_SORGENTE : INT;    //Nr.DB Sorgente
  DB_DESTINAZIONE : INT;    //Nr.DB Destinazione
  BYTE_SORGENTE : DINT;    //Nr.BYTE Sorgente
  BYTE_DESTINAZIONE : DINT;    //Nr.BYTE Destinazione
  NR_BYTE : INT;    //NR.BYTE da trasferire
END_VAR
VAR_TEMP
  SORGENTE : ANY;    //Parametro ANY sorgente
  DESTINAZIONE : ANY;    //Parametro ANY Destinazione
  RETVAL : INT;    //Valore ritorno SFC
END_VAR
BEGIN
NETWORK
TITLE =COPY BLOCK

// Compilazione Area ANY Sorgente
//;
      LAR1  P##SORGENTE; // Indirizzo sorgente area ANY
      L     W#16#1002; // Codice ID e tipo dati
      T     LW [AR1,P#0.0]; 
      L     #NR_BYTE; // Nr.byte da trasferire
      T     LW [AR1,P#2.0]; 
      L     #DB_SORGENTE; // Nr.DB
      T     LW [AR1,P#4.0]; 
      L     #BYTE_SORGENTE; 
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD [AR1,P#6.0]; 
//;
// Compilazione Area ANY Destinazione
//;
      LAR1  P##DESTINAZIONE; // Indirizzo destinazione area ANY
      L     W#16#1002; // Codice ID e tipo dati
      T     LW [AR1,P#0.0]; 
      L     #NR_BYTE; // Nr.byte da trasferire
      T     LW [AR1,P#2.0]; 
      L     #DB_DESTINAZIONE; // Nr.DB
      T     LW [AR1,P#4.0]; 
      L     #BYTE_DESTINAZIONE; 
      SLD   3; 
      OD    DW#16#84000000; 
      T     LD [AR1,P#6.0]; 
//;
// Trasferimento Blocco Dati
//;
      CALL SFC   20 (// SFC20 DATA BLOCK_MOVE
           SRCBLK                   := #SORGENTE,
           RET_VAL                  := #RETVAL,
           DSTBLK                   := #DESTINAZIONE);

END_FUNCTION

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