gabriele123 Inserito: 25 ottobre 2012 Segnala Inserito: 25 ottobre 2012 Salve Con le seguenti righe di codice sono riuscito a scrivere un numero intero all'interno di una DB: //FASE 1 -PREPARO IL PUNTATORE- L 106 // Carico un numero intero T MW 20 // Trasferisco il numero intero (106) nella MW 20 AUF DB [MW 20] // Con i dati sopra definiti apro la DB106 L P#0.0 // Dichiaro una variabile di tipo puntatore T MD 10 // Trasferisco il puntatore sulla MD 10 L DBW [MD 10] // Ora il puntatore contiene l'indirizzo della DB106.DBW0 //FASE 2 -SCRIVO UN DATO SULLA VARIABILE PUNTATA L 21 //Carico il num intero 21 (E' solo un esempio, potevo scrivere 1, 2, 55,...) T DBW [MD 10] //Trasferisco il numero 21 nella DB106.DBW0 //-------FINO QUI TUTTO FUNZIONA-------// //PROBLEMA: Come faccio per incrementare l'indirizzo di 2 byte, quando accade l'evento legato alla pressione di un pulsante ? La mia soluzione (SBAGLIATA) è la seguente: U( U "E0.2" //Se premo il pulsante collegato ad E0.2 FP M 103.0 //E sono sul fronte di salita SPBNB _003 //Sommatore (ADD_I) L MD 10 //Carico l'area di memoria che contiene il puntatore L L#2 //Incremento di due byte +D //Sommo T MD 10 //Ora in MD10 ci dovrebbe essere l'indirizzo incrementato L DBW [MD 10] // Carico la DB106.DBW2 L 32 //Carico un numero intero (Ad esempio 32) T DBW [MD 10] //Trasferisco sulla DB106.DBW2 _003: NOP 0 ) Vi chiedo cortesemente di suggerirmi dove si trova l'errore. Grazie Gabriele
elettrix01 Inserita: 25 ottobre 2012 Segnala Inserita: 25 ottobre 2012 Se sul manuale dello S7 cerchi il formato dei puntatori any puoi capire perchè sommando 2 non ottieni nessun risultato. Nella doppia parola dei puntatori si possono considerare quattro aree di bit: - Most significant byte: area di memoria (esempio M, Q, I) - cinque bit nulli - 1 byte in cui è salvato il numero del byte che richiami - 3 bit: in cui si trova il numero del bit che richiami Ora il suggerimento più banale che mi viene in mente per correggere il tuo errore è effettuare una traslazione di tre bit del tuo 2 facendolo diventare un 16.
rguaresc Inserita: 26 ottobre 2012 Segnala Inserita: 26 ottobre 2012 ... o semplicemente sostituire "L L#2 //Incremento di due byte" con "L L#16 //Incremento di due byte" perché l'indirizzamento è effettivamente a bit, non a byte
gabriele123 Inserita: 26 ottobre 2012 Autore Segnala Inserita: 26 ottobre 2012 (modificato) Ciao a tutti INNANZI TUTTO GRAZIE PER LE VOSTRE RISPOSTE. Grazie ai Vostri suggerimenti sono riuscito ad incrementare la variabile puntatore, quindi a scrivere un numero intero all'interno della variabile puntata in questo modo: L 106 T MW 20 AUF DB [MW 20] L P#0.0 T MD 10 L DBW [MD 10] L 21 T DBW [MD 10] U( U "E0.2" FP M 103.4 SPBNB _003 L MD 10 L L#16 +D T MD 10 L DBW [MD 10] L 32 T DBW [MD 10] L MD 10 L L#16 +D T MD 10 L DBW [MD 10] L 42 T DBW [MD 10] _003: NOP 0 ) Il codice sopra permette di scrivere: 21 ----->DB106.DBW0 Scrive appena compilo il sorgente 32 ----->DB106.DBW2 Scrive quando premo "E0.2" 42 ----->DB106.DBW4 IL MIO PROBLEMA E' SEGUENTE: Non riesco ad incrementare il puntatore a seguito dell'evento generato dalla pressione del pulsante. Ad esempio: 21 ----->DB106.DBW0 Scrive appena compilo il sorgente 32 ----->DB106.DBW2 Scrive quando premo "E0.2" 32 ----->DB106.DBW4 Scrive quando premo "E0.2" In pratica ogni volta che premo E0.2 incrementa il puntatore di L#16 e scrive un intero nell'area di memoria puntata. Sapete darmi delle indicazioni. Ciao Grazie Modificato: 26 ottobre 2012 da gabriele123
rguaresc Inserita: 26 ottobre 2012 Segnala Inserita: 26 ottobre 2012 (modificato) il plc non è come un comune processore informatico, l'elaborazione avviene sempre senza attendere un evento. Devi trovare un modo per elaborare l'indirizzo e scegliere il dato in base all'evento "fronte di E 0.2. nel tuo codice tutto il programma viene elaborato dall'inzio e l'indirizzo è ciclicamente ricreato da P#0.0 P#2.0 ad ogni scansione del programma In queso codice semplificato dopo l'inizializzazione si attende il fronte di salita di E 0.2 e si registra il valore da MW50 alla word del DB. Il valore da scrivere è semplicemente incrementato di 11 ad ogni scrittura. L DB106.DBW 0 L 21 ==I SPB inzt L 106 T MW 20 AUF DB [MW 20] L P#0.0 T MD 10 L 21 T MW 50 // annota T DBW [MD 10] // DB106.DBW0 := 21 inzt: NOP 0 // inizializzato, dopo la prima scansione la parte sopra nan sarà più elaborata U( U E 0.2 FP M 103.4 SPBNB _003 // se non c'è la transizione 0-1 di E 0.2 scavalca il seguito L MD 10 // conteneva l'indirizzo L L#16 +D T MD 10 // ora contiene l'indirizzo aggiornato L MW 50 L 11 +I T MW 50 T DBW [MD 10] _003: NOP 0 ) Per fare esattamente quello che cerchi devi scrivere tanti tronchi di codice quanti sono i valori costanti che vuoi memorizzare e fare in modo, per esempio con dei confronti sulle celle del DB che venga eseguito solo il tronco di codice che dovrà scrivere. Modificato: 26 ottobre 2012 da rguaresc
gabriele123 Inserita: 29 ottobre 2012 Autore Segnala Inserita: 29 ottobre 2012 Ciao Grazie a tutti per avermi indicato la giusta soluzione al mio problema. Chiedo gentilmente di indicare su quale manuale / guida si può trovare la spiegazione dell'istruzione "intz". Posto la soluzione finale commentata sperando sia utile ai frequentatori del forum : //COMPARATORE L DB106.DBW0 //DB106.DBW0, N.B. AL PRIMO GIRO VALE 0 L 21 //CARICA 21 SULLA DB106.DBW0 ==I //VERIFICA SE IL DATO CONTENUTO SU DB106.DBW0 E' =21 SPB inzt //LE PROSSIME 9 RIGHE VENGONO ESEGUITE SOLO AL PRIMO GIRO. //PREPARO L'INDIRIZZO DI PARTENZA L 106 //CARICA 106 T MW 20 //TRASFERISCI 106 SU MW 20 AUF DB [MW 20] //APRI LA DB 106 L P#0.0 //DICHIARO UN PUNTATORE ALLA LOCAZIONE 0.0 T MD 10 //METTO IL PUNTATORE SULLA MD 10 L DBW [MD 10] //ORA, IL PUNTATORE "PUNTA" ALLA DB106.DBW0 L 21 //AL PRIMO GIRO CARICA 21 T DBW [MD 10] //TRASFERISCO IL DATO 21 SULLA DB106.DBW0 inzt: NOP 0 //DOPO LA PRIMA SCANSIONE LA PARTE SOPRA NON VIENE PIU' ESEGUITA U( U "E0.2" //VERIFICO SE E0.2 E' A LIVELLO LOGICO ALTO FP M 103.4 //FRONTE DI SALITA SPBNB _003 //SE NON C'E' LA TRANSIZIONE 0-1 DI E0.2 SCAVALCA IL SEGUITO..ALTRIMENTI: L MD 10 //CARICO L'INDIRIZZO PRECEDENTE L L#16 //CARICA DUE LOCAZIONI +D T MD 10 // CONTIENE L'INDIRIZZO AGGIORNATO L MW 50 L 11 T MW 50 T DBW [MD 10] //TRASFERISCO IL RISULTATO SUL NUOVO INDIRIZZO PUNTATO _003: NOP 0 ) Ciao
rguaresc Inserita: 29 ottobre 2012 Segnala Inserita: 29 ottobre 2012 (modificato) l'istruzione "intz". E' semplicemente un'etichetta (label) per fare un salto. pensavo a "initialized" e ci si deve limitare a 4 caratteri. Se il risultato della verifica precedente e' vero si salta con l'istruzione SPB alla riga che comincia con l'etichetta. Si puo' usare una qualsia combinazione di 4 caratteri. Modificato: 29 ottobre 2012 da rguaresc
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