Vai al contenuto
PLC Forum


Per fare pratica sui puntatori - Ok Funziona Ma Non Capisco


Messaggi consigliati

Inserito:

Ciao a tutti...

Ho iniziato da poco con s7 , mentre con s5 piuì o meno me la cavo a fare qualche modifica su programmi gia fatti.

Per fare pratica sui puntatori ,volevo in poche parole, far accendere delle lampadine in modo che si rincorrono, grazie alle Vostre discussioni ci sono riuscito , ma non riesco a capire alcuni passaggi:

L "contatore" //(1)carico contatore che inc-dec 0-10/10-0

T MW 100 //(2)appoggio il suo valore nel mw100

AUF DB 1 //(3)apro il blocco dati 1 dove cisono 10 dw con valori in decimale 0-2-4-8-..ecc..

L MW 100 //(4)carico come puntatore la mw100 per scegliere le dw da prelevare

L W#16#10 //(5)carico in acc1 il valore in esadecimale 10(16in decimale)

*D //(6)effettuo una moltiplicazione di numeri interi a 32 bit

T MD 150 //(7)appoggio il risultato nella doppia word di merker 150

L DBW [MD 150] //(8)carico la word del bd1 che leggo in md 150

T MW 200 //(9)trasferisco il valore della word caricata in mw 200

(5):perche devo caricare un valore espresso in esadecimale e non per esempio in decimale tipo (L 16)?

(6):perche si moltiplicano due word 16 bit usando un moltiplicatore a 32 bit?

(8):perche diventa rosso se scrivo (L DB1.DBW[MD 150]? sbaglio o DBW significa word del blocco dati 1?

e ancora nelle precedenti prove con esito negativo:

L P#MW100 //questa istruzione non significa che uso come puntatore la mw100 o si puo' usare solo con i bit:?

L P#1.0 //CARICO NEL PUNATORE IL VALORE 1.0

L AR1 //CARICO IN AR1 IL VALORE DEL PUNTATORE

U E[AR1,P#2.4] //LEGGO L'INGRESSO E 3.4 DATO DALLA SOMMA DI 1.0 + 2.4

un'ultima cosa L AR1 che cosa significa , e che valore e presente subito dopo "L P#1.0"?

Gazie in anticipo a tutti.....


Inserita:

(5) sarebbe la stessa cosa.

(6) un puntatore e' l'indirizzo di un bit espresso a 32 bit, percio' lo si produce con un'operazione che da un risultato a 32 bit

(8) l'indirizzamento indiretto tramite variabile DBW[MD 150] e' ammesso entro il 'settore'. In questo caso il settore sarebbe il DB e' cioe' sottinteso che ti stai muovendo entro il DB1 e non puoi usare l'istruzione sintetica "L DB1.DBW[MD 150]" per entrare in un DB di tua scelta. Per passare da un settore a un altro (da un DB a un altro o da E ad A ecc) devi agire in piu' fasi.

"L P#MW100" ...non ha significato. Puoi scrivere:

L MW100 e carichi il contenuto a 16 bit di MW100

L P#M100.0 questa istruzione carica l'indirizzo a 32 bit del bit M100.0 entro il settore M

L P#1.0 -> carica in accumulatore il valore a 32 bit = (1 X 8) + 1 -1 = L#8 (il -1 perche'si conta da 0). Rappresenta uno spostamento di indirizzo di un byte; e' del tutto equivalente scrivere L L#8. Lo si preferisce perche' in S7 si pensa agli indirizzi in termini di <byte>.<bit>

LAR1 carica nel registro speciale AR1 (un registro indice) il contenuto dell'accumulatore.

Inserita:

Grazie rquaresc del tuo interessamento,adesso va meglio, gentilmente ti volevo chiedere solo alcuni chiarimenti in merito alle tue spiegazioni:

L P#1.0 -> carica in accumulatore il valore a 32 bit = (1 X 8) + 1 -1 = L#8 (il -1 perche'si conta da 0). Rappresenta uno spostamento di indirizzo di un byte; e' del tutto equivalente scrivere L L#8. Lo si preferisce perche' in S7 si pensa agli indirizzi in termini di <byte>.<bit>

perche caricare in accumulatore il valore a32 bit e' "(1 X 8) + 1 -1 = L#8"?

(1 X 8) non e' uguale a 8?

+ 1 -1 non e' uguale a zero?

quindi se scrivo "L#8" significa che carico in accumulatore il valore a 32 bit ?

L L#8 che cosa significa la prima L(significa carica in ACC1?) la seconda L(nono capisco?) ed in fine il simbolo #(che cosa indica?)

(L P#M100.0 questa istruzione carica l'indirizzo a 32 bit del bit M100.0 entro il settore M) questo significa la stessa cosa dire che carico il bit 0 della merker word 100? e cioe' che punto al bit 0?

Scusami della mia ignoranza nello specifico e ti ringrazio ancora anticipatamente.

Inserita: (modificato)

L#8 = valore decimalo 8 rappresentato con l'uso di 32 bit (L=long)

" questo significa la stessa cosa dire che carico il bit 0 della merker word 100?" significa che carico l'indirizzo del bit 0 della MW100, poi lo posso usare per interrogare il bit 0 della MW100 facendo ad esempio:

LAR1 // trasferisci indirizzo in ACCU1 al registro AR1

U [AR1, P#0.0] // lInterroga il merker secondo l'indirizzo di prima spostato di ... niente.

Giocando con un cilclo che modifica lo spiazzamento P#0.0 posso interrogare ciclicamente un insieme di bit prossimi a M100.0.

Modificato: da rguaresc
Inserita:

Adesso e' tutto chiaro rguaresc, sei stato molto esaustivo , spero un giorno di essere anche io di aiuto a chi ne ha bisogno come hai fatto tu con me; non ne vorrei approfittare, visto che ci siamo senza fretta anche quando vuoi ho in quesito;capire i puntatori era solo un mezzo per poter proseguire ad un piccolo compito che mi sono proposto di realizzare:cioe' arrivare ad usare gli ARRAY in pratica , vorrei comandare due assi anche non interpolati in modo circolare;non so se questa che ho scelta e' strada giusta per fare pratica , ma e' con degli obbiettivi da raggiungere che si riesce ad essere motivati ad imparare, leggevo in alcune discussioni a riguardo che si potevano caricare dati angolari in un array, io pensavo di fare cosi:

1) creo due blocchi dati dove inserisco le coordinate degli assi x ed y

2) tramite l'uso dei puntatori vado a prendermi i valori delle dw memorizzate nei db

3)con ARRAY[x..y] dovrei trasferire i valori delle dw come riferimento da raggiungere per i motori

purtroppo per me dal dire al fare c'e' di mezzo il mare, so che nei miei tre punti ce ne saranno altri ma non so quali.

Grazie ancora ciao....

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