Vai al contenuto
PLC Forum


Memorizzare valore db senza cancellare il precedente


sorecaro

Messaggi consigliati

Salve a tutti, come da titolo ho la necessità di memorizzare dei valori di una db su un pannello operatore. Cerco di spiegarmi meglio. 

Ho un valore in una DB ( db1.dbd50) che viene aggiornato in modo automatico. Questo valore é visualizzato su un pannello operatore ed ogni volta che interviene un sensore viene memorizzato il valore con l'orario di memorizzazione ma senza cancellare il valore precedentemente memorizzato.

Db1.dbd50 (valore 1)-----hh:mm:ss

Db1.dbd50 (valore 2)------hh:mm:ss

ecc.......

La "tabella" deve poter memorizzare 20 valori. Un tasto di reset deve cancellare il valore della tabella e far ricominciare la memorizzazione.

Per fare questa "tabella" devo utilizzare un puntatore ma sinceramente non sono riusciti a capire come. Ho letto vari post ma purtroppo é un argomento che non riesco a capire in pieno. Mi potete aiutare? Non voglio e non chiedo il programma scritto, ma un aiuto.

 

Graxie

 

Link al commento
Condividi su altri siti


 

Crea un array a 20 elementi ed ogni volta che il sensore interviene aumenti l'indice e memorizzi nell'array il valore temporale fino all'elemento 20.

Avrai così 20 valori da passare a 20 variabili che potrai visualizzare nel pannello.

Per il reset ci sono dei blocchi fatti per questo dipendentemente da che tipo di PLC usi.

 

Link al commento
Condividi su altri siti

Oppure puoi usare la funzione FC90 di shift register che trovi nella libreria,  per shiftare tutte le le misure dell'array ed inserire nel primo elemento l'ultima ora.

Link al commento
Condividi su altri siti

Grazie per le risposte ma ci sono cose che ancora non capisco.Vorrei utilizzare i puntatori per cercare di capire bene il loro funzionamento visto che ancora non mi sono entrati in testa ed una volta fatto questo utilizzare la FC90.  come consigliato da acquaman

Il ragionamento che ho fatto è questo:

ho la mia db1 con il valore che devo memorizzare (db1.dbd50)

creo una dbxxxx con un array da 20 elementi

utilizzo un puntatore per "puntare" alla dbxxx per memorizzare il valore della db1

incremento il puntatore

e cosi via

Può essere una strada da seguire?

 

Link al commento
Condividi su altri siti

Be devi calcolare il byte della tua variabile in funzione del tuo puntatore, quindi moltiplichi il tuo puntatore per i byte della tua variabile in questo caso per 4 perché usi una doppia word poi aggiungi o togli un offset per puntare al primo elemento dell'array (es se il primo elemento dell'array nel byte 0 togli 4).

es

Puntatore =1

 

1*4=4

4-4=0 = indirizzo del byte del primo elemento dell'array

 

a questo punto lo moltiplichi per 8 per trovare l'indirizzo a bit del tuo elemento dell'array lo carichi nel puntatore 1 e lo usi per richiamare la tua variabile

 

L Puntatore  //Prendi il valore del tuo indice

L L#4           //Lo moltiplichi per 4 byte perché usi double word

*D

L L#4           //Aggiungi o sottrai l'offset del primo elemento dell'array

-D

L L#8           //Moltiplichi il tutto per 8 per calcolare l'indirizzo della tuo elemento dell'array da puntare a bit

*D

LAR1           //Carichi questo indirizzo nel puntatore AR1

 

L DB1.DBD50           //Prendi il valore della tua variabile

AUF "DB array"         //apri la DB dell'array

T DBD [AR1,P#0.0]   //Tasferisci il valore della tua variabile nella variabile dell'array che indirizzata dal puntatore 1 AR1

 

Link al commento
Condividi su altri siti

Acquaman sto cercando di capire questi benedetti "puntatori" ma purtroppo trovo molte difficoltà.

Ho provato a scrivere queste due righe:

L	DB1.DBD50		"CARICO IL VALORE CHE MI INTERESSA
OPN	DB2				"APRO LA DB2
L DB10.DBD0			"CARICO IL VALORE DB10.DBD0 CHE DOVREBBE CONTENERE L'INDIRIZZO DEL PUNTATORE 
LAR1				"TRASFERICO IL VALORE DB10.DBD0 NEL REGISTRO AR1
T DBD[AR1, P#0.0]	"SCRIVO IL VALORE MEMORIZZATO NELLA DB2
L 4					"CARICO IL VALORE 4 
T DB10.DBD0			"NELLA DB10.DBD0 PER PUNTARE AL SECONDO INDIRIZZO DELL'ARRAY DI DB2

Sono fuori strada??? 

grazie per la pazienza

Link al commento
Condividi su altri siti

il db2 dovresti aprirlo prima di lar1. così dovrebbe scrivere in db10, l'ultimo aperto.

il puntatore dovresti incrementarlo di 4, non scrivere 4.

 

non fai prima a fare un fifo? praticamente la tua variabile la scrivi sempre nella prima dword dell'array. le altre le sposti in blocco di 4 byte avanti.

Link al commento
Condividi su altri siti

Ciao ken,grazie per la risposta. Per incrementare il puntatore pensavo bastasse scrivere 4 nella db10.dbd0. Per quanto riguarda il fifo ci avevo pensato, ma vorrei cominciare ad usare i puntatori anche per scopi didattici e futuri. Saresti così gentile da spiegarmi l'incremento del puntatore? 

Link al commento
Condividi su altri siti

Oltre a quello che ha detto ken, hai invertito un po di roba.

Inoltre, devi incrementare di 4 byte, quindi devi incrementare di 32 il puntatore perché punta a bit.

Sto dando per scontato che nella DB10.DBD0 ci sia l'indirizzo a bit come spiegato nell'esempio che non hai seguito molto.

 

Comunque io trovo più semplice avere il puntatore con il numero degli elementi e calcolare l'indirizzo dell'array, cosi devo solo incrementare il puntatore di 1.

L Puntatore

L1

+I

T Puntatore

Link al commento
Condividi su altri siti

L DB10.DBD0     //Ripeto deve contenere l'indirizzo del tuo elemento dell'array a bit 

LAR1

 

L DB1.DBD50  //Carico il valore che mi interessa

OPN      DB2

T   DBD  [AR1, P#0.0]  //Trasferisco il valore nel mio array

 

L  DB10.DBD0   //Incremento i puntatore

L   L#32             //Di 32 bit (4 Byte, 1 DWord)

+D

T  DB10.DBD0

 

se carichi prima il valore che ti interessa, poi carichi il puntatore il valore che ti interessa va perso, mi sembra che ti manchino un po di basi dell'AWL, come funziona, tutto il discorso degli accumulatori ecc.

Link al commento
Condividi su altri siti

Acquaman grazie per l'aiuto.  Fino ad ora ho usato solo KOP ma vorrei imparare anche l'AWL ecco perché mi trovo in difficoltà con puntatori e registri.

Oltre la guida online dello step non riesco a trovare nulla che tratti l'AWL. 

 

Link al commento
Condividi su altri siti

Nella documentazione dello step7 c'è un manuale sull'AWL, è sopratutto un elenco delle istruzioni, ma in fondo ci sono degli esempi ben commentati che ti spiegano come funziona l'AWL.

Come primo esercizio in AWL, ne hai scelto uno abbastanza impegnativo, scegli qualcosa di più semplice anche una semplice operazione matematica, prendi familiarità con gli accumulatori e con i salti vedrai che sarà più facile anche solo leggere e comprendere l'AWL oltre che a programmarlo.

 

Per lavorare con i digitali, il KOP è imbattibile, ma per calcoli, dati e altro l'AWL ha una marcia in più.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Buongiorno, sto provando e riprovando ma ancora non riesco a far funzionare come si devi i puntatori. Dopo aver seguito il consiglio di acquaman di studiare il manuale AWL ho provato a copiare un valore di una DB in un altra DB, ma niente, la CPU rimane in STOP. Sicuramente sto sbagliando io ma non capisco dove. Posto il codice che sto usando, che tra l'altro è stato scritto da acquaman ( quindi funzionante)

 

OB1 

   L     DB1.DBD    0
      LAR1  
      L     DB2.DBD    0
      OPN   DB     3
      T     DBD [AR1,P#0.0]
      L     DB1.DBD    0
      L     L#32
      +D    
      T     DB1.DBD    0

 

 

DB1  

 0.0                    STRUCT

+0.0    STAT0    DINT               L#2

=4.0                   END_STRUCT

 

 

DB2

0.0                     STRUCT

+0.0   STAT1     DINT                   L#12345

+4.0   STAT2     DINT                   L#12345

.=8.0                  END_STRUCT

 

DB3

0.0                                  STRUCT

+0.0    VALORE_1          DINT                   L#0

+4.0    VALORE_2          DINT                   L#0

+8.0    VALORE_3          DINT                   L#0

=12.0                              END_STRUCT 

 

Link al commento
Condividi su altri siti

Hai la db3 corta, il sistema sta funzionando ma dopo 3 scansioni plc hai caricato tutti e 3 le variabili e cerchi di caricare la quarta variabile che non c'è quindi il plc va in stop. 

Link al commento
Condividi su altri siti

Si ma solo nella prima variabile.

Adesso che il tuo puntatore funziona, devi integrarlo nel programma che devi fare, caricare i dati quando serve e non ad ogni scansione e controllare il puntatore per non andare fuori dalla lunghezza della DB3

 

 

 

Quote

( quindi funzionante)

 

Grazie per la fiducia.;)

Link al commento
Condividi su altri siti

acquaman perdonami ma non ne vengo a capo.

     U     M      0.1
      SPB   SCRIVI
      =     M      0.0

SCRIVI:    L     DB1.DBD    0
      LAR1  
      L     DB2.DBD    0
      AUF   DB     3
      T     DBD [AR1,P#0.0]
      L     DB1.DBD    0
      L     L#32
      +D    
      T     DB1.DBD    0
 

Ho cercato di aggiungere un salto in modo tale che mi scrive nella mia DB solo quando il bit M0.1 è alto, ma nulla, la CPU entra subito in stop. Eppure sto seguendo la guida AWL pari passo

Link al commento
Condividi su altri siti

Come hai scritto tu, esegui sempre la parte puntatore, cosa che invece devi saltare nell'esecuzione del programma.

Prova cosi.

 

U  M 0.1

SPBN NSCR

      L     DB1.DBD    0
      LAR1  
      L     DB2.DBD    0
      AUF   DB     3
      T     DBD [AR1,P#0.0]
      L     DB1.DBD    0
      L     L#32
      +D    
      T     DB1.DBD    0

NSCR: NOP 0

 

oppure:

 

  U     M      0.1
      SPB   SCRIVI
     SPA NSCR

SCRIVI:    L     DB1.DBD    0
      LAR1  
      L     DB2.DBD    0
      AUF   DB     3
      T     DBD [AR1,P#0.0]
      L     DB1.DBD    0
      L     L#32
      +D    
      T     DB1.DBD    0

 

NSCR: NOP 0

Link al commento
Condividi su altri siti

Perché il comando di scrittura M0.1 resta alto per più scansioni e come prima finisci la db3. 

Aggiungi

R M0. 1

Prima di

NSCR: NOP 0

Così finita la scrittura resetta il comando. 

Link al commento
Condividi su altri siti

:worthy::worthy: GRAZIE GRAZIE GRAZIE acquaman FUNZIONA BENISSIMO.


      U     M      0.1
      SPB   SCRI
      SPA   NSCR

SCRI: L     DB1.DBD    0
      LAR1  
      L     DB2.DBD    0
      AUF   DB     3
      T     DBD [AR1,P#0.0]
      L     L#32
      L     DB1.DBD    0
      +D    
      T     DB1.DBD    0
      R     M      0.1

 

 

 

      U     E      0.0
      FP    M      0.0

      S     M      0.1
 

 

Ora il problema è uno solo, è che mi piace troppo scrivere il listato in AWL, anche se sono solo 2 righe di codice.

Oltre la guida che mi hai consigliato conosci qualche altro testo che tratta l'AWL?? 

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