Vai al contenuto
PLC Forum


Problema con istruzione loop


Linotix

Messaggi consigliati

Salve a tutti

Innanzitutto devo precisare che non ho molta esperienza nella programmazione plc. Comunque stavo facendo delle prove perché volevo inserire l’istruzio Loop in un progetto. Dopo aver letto manuale e tutto quello trovato in rete non sono riuscito a venirne a capo. Sto utilizzando  step 7 5.5 con sp4 e s7plcsim. Ho fatto moltissime prove , ma sembra che l’istruziine Loop decrementi di 1 la mw ma poi non esegua il salto all’etichetta “next”. Per essere chiari posto qualche esempio:

 

L  L#10

T  md10

L  10

next T  mw20

 

L  L#2

L  md10

+D

T  md30

 

L  mw20

Loop next

 

L  md30

 

Ora quello che succede è che una volta avviato il ciclo se si controllano i valori di accu1  su L mw20 sono a 10 e sull’istruzione Loop a 9 , cioè decrementa di 1 e poi si ferma lì. Sembra non faccia il salto a next o non decrementi la mw20. Il simulatore non va in stop ma continua all’infinito. 

Nemmeno mw 30 sembra aggiornarsi. Inoltre le prime instruzioni , i cui valori nel caso in cui non venissero lette con un salto dovrebbero essere grigio chiaro , rimangono nere. 

Cosa sbaglio?

grazie

 

A04847C0-441B-426A-82A4-BC9F857EB073.jpeg

EEFC1107-E692-4B6B-85D0-02A1377E1F06.jpeg

Link al commento
Condividi su altri siti


Ciao

andare on-line con un loop significa vedere solo il primo dei N° loop, per vede se funziona basta che vai su una VAT (Controlla e comanda variabili) e metti il valore di mw20 e dalla MD10

Saluti

Link al commento
Condividi su altri siti

Ma come hai fatto tu non vedrai mai l'effetto del loop: in MD30 troverai sempre due, anche dopo 1000 cicli. Poi stai anche pasticciando con MW e MD.

 

Link al commento
Condividi su altri siti

Vi ringrazio per l’aiuto, come detto non sono esperto come voi, per questo vi sto chiedendo dei consigli. Mi ero accorto di aver scritto mw da una parte e md dall’altra , ho messo giù di fretta per farvi capire cosa intendevo. Grazie ancora

Link al commento
Condividi su altri siti

Già che ci sono vorrei chiedervi un’altra cosa. Qual’e Il miglio modo per far sì che la somma si esegua ad ogni ciclo del loop, in modo che io possa cambiare il valore della mw per decidere quanti cicli loop fare ed avere il risultato che mi serve. Grazie. 

Link al commento
Condividi su altri siti

Non ho capito cosa desideri, ma posso fare due ipotesi, in base a condizioni carichi il valore di loop che ti serve e poi esegui il loop, oppure all'interno del loop metti una condizione per quale viene eseguito un jump all'istruzione dopo il loop.

Link al commento
Condividi su altri siti

La domanda è tutt'altro che chiara.

Se vuoi decidere quanti cicli deve fare il loop, devi caricare il valore desiderato nella variabile che viene usata dal loop (MW20, nell'esempio).

Sempre per seguire l'esempio, ti trovi queste istruzioni:

 

L 10
NEXT: T MW20
...
...
...
...
L MW20
LOOP NEXT

Quindi, viene caricato 10 in MW20.

Poi fai le operazioni che desideri e, alla fine, leggi il valore di MW20 (che viene caricato nell'accumulatore) e richiami l'istruzione LOOP.
L'istruzione LOOP, se il valore caricato è > 0, decrementa di una unità il contenuto dell'accumulatore e salta all'etichetta indicata, altrimenti non fa nulla.
Se viene fatto il salto, viene memorizzato in MW20 il nuovo valore (se siamo partiti da 10, ora sarà 9), e si ripete tutto daccapo.

 

Se, all'interno del loop, tanto per verificare cosa succede, vuoi incrementare una variabile, potresti scrivere:

L MW30
+ 1
T MW30

All'interno del loop poi, nessuno vieta di inserire altre operazioni che facciano compiere un salto ad un'etichetta esterna al loop.

un loop lo si può anche costruire semplicemente incrementando (o decrementando, a piacere) una variabile, ed usando le istruzioni di salto.

Link al commento
Condividi su altri siti

UGià che ci sono vorrei chiedervi un’altra cosa. Qual’e Il miglio modo per far sì che la somma si esegua ad ogni ciclo del loop, in modo che io possa cambiare il valore della mw per decidere quanti cicli loop fare ed avere il risultato che mi serve. Grazie. 

Link al commento
Condividi su altri siti

Si, avete ragione , rileggendola non sono stati chiaro Ora io ho inserito come suggerito da Travelmen i valori delle mw su variabile, e vedo i risultati. Però bensì io inserisca qualsiasi numero di cicli loop il calcolo 2 + ma 10 viene eseguito una volta sola, o almeno questo è quanti vedo dalla variabile, anche se i cicli del loop sono stati decrementati sino a 1. Io vi chiedo come fare affinché il calcolo 2 + mw 10 venga eseguito ad ogni ciclo loop. Forse è perché rlc rimane sempre a 1 ?

Link al commento
Condividi su altri siti

Se non hai sistemato il codice, rimane 2 semplicemente perchè mw10 è sempre 0.

tu carichi L#20 in md20.

mw20 è quindi 0.

Sommi L#2 alla mw20, trasferendo in mw30 il risultato

Al successivo ciclo di loop, avrai sempre L#2 sommato a mw20, che sarà sempre 0, e trasferirai sempre 2 a mw30.

 

Stai facendo parecchia confusione!

Link al commento
Condividi su altri siti

No. Io carico 20 in mw 10 e poi sommo 2 e trasferisco in mw30. Infatti il risultato di mw 30 è 22 e non 0 come dici tu. Quello che vorrei fare è eseguire la somma ad ogni ciclo del loop e cioè dovrebbe risultare 20 + (2x10) = 30 e non 22. 

64583DB2-6D46-43CA-AFE9-CA34B54ABDC4.jpeg

Link al commento
Condividi su altri siti

Pardon, ho sbagliato a scrivere, invece di mw10 ho scritto mw20.

 

 

Nella prima foto tu:

carichi 20 in MD10

carichi 10 in MW20 (e da qui parte il loop)

sommi 2 a MW10, trasferendo in MW30

carichi MW20 e vai in loop.

 

Come vedi, non vai mai ad aggiornare mw10, che usi per fare la somma.

Quindi farai sempre, ad ogni loop, L#2 + mw10, che però ha sempre lo stesso valore (che è 0, perlomeno con il codice scritto come in prima foto)

 

Sta di fatto, finchè non vari il contenuto di mw 10, avrai sempre la stessa somma

 

Inoltre hai scritto:

dovrebbe risultate 20 + (2x10) = 30 e non 22.

 

20 + (2x10) = 20 + (20) = 40

E nel codice usi una sola addizione.. qualquadra non cosa!

 

Link al commento
Condividi su altri siti

Nel loop esegui sempre lo stesso calcolo, non incrementi una variabile.

Se ad una calcolatrice chiedi 10 volte quanto fa 20 + 2, ti dirà sempre 22.

Per fare un incremento devi prendere una variabile, sommare un valore e mettere il risultato ancora nella stessa variabile, non in un'altra variabile.

Eppure, mi pareva che l'esempio del mio precedente post fosse abbastanza chiaro.

Link al commento
Condividi su altri siti

Allora, cerco di spiegarmi meglio. Il discorso della mw10 l’ho sistemato. Quello che intendo, è che essendo la somma dentro ad un loop di 10 cicli, io vorrei eseguire mw10 + 2 ad ogni ciclo e cioè per dieci volte. Quindi verrebbe mw10 +2 eseguito ad ogni ciclo. In pratica [mw10+(2+2+2+2+2+2+2+2+2+2)dovrebbe venire 30. Spero di essermi spiegato bene. Qual’è il metodo giusto per eseguire la somma ad ogni ciclo del loop?

Non avevo letto la tua risposta Batta. Ok ho capito. Grazie

Link al commento
Condividi su altri siti

inizio loop:

 

l mw10

+ 2

t mw10

 

l mw20

loop next

 

però se non condizioni il loop non ti fermerai mai, andrai all'infinito.

Tu ricarichi il valore del loop ad ogni ciclo.

Quindi, finito il primo ciclo da 10 loop, al prossimo richiamo del blocco, reinizializzi mw20 ed esegui un altro ciclo di 10 loop.

E così via

Link al commento
Condividi su altri siti

Non serve che scrivi grande, sembra che stai gridano ed indisponi la gente a risponderti, inoltre ti hanno rilevato l'errore ma senza darti risposta perchè evidentemente non avevi spiegato bene cosa volevi visto che dopo la tua seconda spiegazione è arrivata subito la risposta.

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