sorecaro Inserito: 11 febbraio 2016 Segnala Share Inserito: 11 febbraio 2016 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 More sharing options...
EsseCi60 Inserita: 11 febbraio 2016 Segnala Share Inserita: 11 febbraio 2016 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 More sharing options...
acquaman Inserita: 12 febbraio 2016 Segnala Share Inserita: 12 febbraio 2016 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 More sharing options...
sorecaro Inserita: 12 febbraio 2016 Autore Segnala Share Inserita: 12 febbraio 2016 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 More sharing options...
acquaman Inserita: 13 febbraio 2016 Segnala Share Inserita: 13 febbraio 2016 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 More sharing options...
sorecaro Inserita: 14 febbraio 2016 Autore Segnala Share Inserita: 14 febbraio 2016 Grazie acquaman, comincio a studiarlo subito Link al commento Condividi su altri siti More sharing options...
sorecaro Inserita: 14 febbraio 2016 Autore Segnala Share Inserita: 14 febbraio 2016 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 More sharing options...
ken Inserita: 14 febbraio 2016 Segnala Share Inserita: 14 febbraio 2016 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 More sharing options...
sorecaro Inserita: 14 febbraio 2016 Autore Segnala Share Inserita: 14 febbraio 2016 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 More sharing options...
acquaman Inserita: 14 febbraio 2016 Segnala Share Inserita: 14 febbraio 2016 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 More sharing options...
sorecaro Inserita: 14 febbraio 2016 Autore Segnala Share Inserita: 14 febbraio 2016 Acquaman il tuo esempio l'ho seguito, é che faccio fatica a comprenderli in pieno Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: 15 febbraio 2016 Segnala Share Inserita: 15 febbraio 2016 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 More sharing options...
sorecaro Inserita: 15 febbraio 2016 Autore Segnala Share Inserita: 15 febbraio 2016 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 More sharing options...
acquaman Inserita: 15 febbraio 2016 Segnala Share Inserita: 15 febbraio 2016 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 More sharing options...
sorecaro Inserita: 15 febbraio 2016 Autore Segnala Share Inserita: 15 febbraio 2016 Grazie, comincio subito con lo studio Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: 15 febbraio 2016 Segnala Share Inserita: 15 febbraio 2016 Bene, se hai dubbi il forum è qui. Link al commento Condividi su altri siti More sharing options...
sorecaro Inserita: 26 febbraio 2016 Autore Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
acquaman Inserita: 26 febbraio 2016 Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
sorecaro Inserita: 26 febbraio 2016 Autore Segnala Share Inserita: 26 febbraio 2016 Grazie per l'aiuto. Se cancello la prima riga L DB1.DBD0 con L 0 il plc non va in stop e mi carica il valore nella db3 Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: 26 febbraio 2016 Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
sorecaro Inserita: 26 febbraio 2016 Autore Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
acquaman Inserita: 26 febbraio 2016 Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
sorecaro Inserita: 26 febbraio 2016 Autore Segnala Share Inserita: 26 febbraio 2016 Sto provando tutti e due i codici che hai scritto ma appena mando ad uno il marker M0.0 la CPU va in stop Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: 26 febbraio 2016 Segnala Share Inserita: 26 febbraio 2016 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 More sharing options...
sorecaro Inserita: 26 febbraio 2016 Autore Segnala Share Inserita: 26 febbraio 2016 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 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