Vai al contenuto
PLC Forum


Step7, Puntatori, Array - come puntare a componenti in un DB


ricobert

Messaggi consigliati

Prima volta che intervengo per chiedere due cose che magari è banale.

1)

E' possibile in un programma Step7 fare un ciclo for...next utilizzando componenti di un array, tipo:

for i =1 to 10

somma=somma+ array

next i

2)

come si fa ad utilizzare un puntatore per accedere a componenti di un DB?

grazie

Link al commento
Condividi su altri siti


Federico Milan

In Step 7 esiste una infinità di modi per accedere a parmatri puntati.

non dici se usi AWL o SCL ...

Comuque ad esempio in AWL puoi accedere in questo modo

L      10
T      MW20

AUF DB[MW20]
L     P#2.0
T     MD10
L     DBW[MD10]        <---- Punti alla 2 word del DB 10

Se iteri ottieni quello che vuoi ....

oppure

LOOP: L     #_indice_Array              

          +     -1                                        

          L     L#2     

          *D                                    

          SLD   3                             

          LAR1                                 

          AUF   DB10

          L     DBW [AR1,P#0.0]  

          L     #_indice_Array           

          +     1                       

          T     #_indice_Array         

          L     10                      

          <=I                              

          SPB   LOOP   

questo codice dovrebbe scandire un array da 10 elementi dentro la DB10

ciao

Modificato: da Federico Milan
Link al commento
Condividi su altri siti

Se usi SCL puoi praticamente accedere agli array nel modo da te descritto. Dichiari l'array quando crei la DB e poi vi accedi con le istruzioni "for next" come da te descritto anche se con sintassi leggermente diversa.

Se usi AWL basta che segui le istruzioni sopra riportate da Federico Milan.

CIAO

Link al commento
Condividi su altri siti

se il ciclo lo costruisciti tu , come giustamente ti ha suggerito federico,

piu che un for -next e' un while do perche almeno una volta lo esegui visto che il controllo e' alla fine

poi con un salto all'incontrario torni indietro e via dicendo .

se usi awl c'e' la possibilita di eseguire anche un distributore di salti con l'istruzione SPL.

se invece usi scl ti togli dall'impiccio il linguaggio assemble e programmi in un linguaggio tendente al pascal .

l'unica menata , almeno io uso scl 5.1 , e' che in fase di debug o meglio dire online , con scl

diventa un po una tortura , cioe e' lento , anche se con l'ultima release e' migliorato molto anche l'editor di testo.

rimane sempre il fatto che poi se il progetto lo dai in mano a chi lo acquista e giustamente non spende soldi per scl , quindi ti fanno le paranoie che lo vogliono in awl o kop.

in kop pero i puntatori ed altro non sono supportati .

io generalmente uso scl se devo fare calcoli o cose particolarmente indicizzate , cicli annidati ect.

ciao

walter

Link al commento
Condividi su altri siti

  • 1 month later...

Io creo spesso piccole parti di codice AWL completamente portabili da un progetto all'altro in quanto realizzate completamente con variabili Temp e parametri di ingresso.... è molto comodo, quindi consiglio di evitare di usare MW etc per simili usi.

Un'altro consiglio è questo: esiste un'istruzione MOLTO POCO USATA QUANTO IMPORTANTE:

"L DBLG"

Con questa istruzione, viene caricata in ACCU1 la lunghezza in bytes del blocco dati globale correntemente aperto (DILG è invece l'istruzione per la lettura della lunghezza in bytes del blocco dati di istanza aperto)

All'inizio di un ciclo per la scansione di un DB, è MOLTO utile usare questa istruzione per leggere di quanti bytes è composto il DB, per poi eventualmente dividere per 2 il valore ottenuto nel caso di decida di lavorare con WORD. Il dato ottenuto sarà quello da caricare un ACCU1 prima dell'istruzione LOOP; in questo modo verranno eseguite tante scansioni quante sono le word del blocco dati.

....tutto questo.... PERMETTE DI CAMBIARE LE DIMENSIONI DEL BLOCCO DATI SENZA PREOCCUPARSI PIU' DEL CODICE!!!

Link al commento
Condividi su altri siti

  • 5 years later...

e se devo settare i primi n BIT (non BYTE) di un datablock come lo devo incrementare il puntatore? é corretto così?

S DBX [#Generic_Pointer_1]

L P#0.1

L #Generic_Pointer_1

+D

T #Generic_Pointer_1

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