Vai al contenuto
PLC Forum


Puntatori -Awl-


Messaggi consigliati

Inserito:

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


Inserita:

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.

Inserita:

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

Inserita: (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: da gabriele123
Inserita: (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: da rguaresc
Inserita:

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

Inserita: (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: da rguaresc

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