Vai al contenuto
PLC Forum


Ciclo for s7-1200


fruittis

Messaggi consigliati

Ciao a tutti avrei questa domanda da porvi!

 

Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto!

In breve accendere una luce dopo l'altra ogni 2 secondi.

Per questo volevo utilizzare il ciclo for,in scl della siemens.

 

Provato in tutti i modi,e beh,non riesco e non capisco il perche!

 

In arduino anche se non è uguale lo so,mettendo all'interno del ciclo for un delay,e assegnando all'indice del ciclo for una uscita lii va e rispetta il mio tempo,e mi incrementa ogni volta come giusto che sia!

Invece il ciclo for in tia portal no,non mi fa fare questa cosa,il risultato che ottengo e quello che lui aspetta i 2 secondi e poi i bit si alzano tutti insieme,perhe fa cosi??

Avete consigli?

 

Ps: secondo me non si puo fare con il ciclo for della siemens!

 

Link al commento
Condividi su altri siti


scrivi qui quello che hai scritto in scl che vediamo dove hai sbagliato.

 

il delay dentro il ciclo for non ci può stare sennò il tempo ciclo va alle stelle ! 

invece del ciclo for usa un sistema tipo macchina a stati, con il ritardo asincrono rispetto a quello.

Modificato: da drn5
Link al commento
Condividi su altri siti

dina_supertramp
51 minuti fa, fruittis ha scritto:

Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto!

In breve accendere una luce dopo l'altra ogni 2 secondi.

Per questo volevo utilizzare il ciclo for,in scl della siemens.

Un for per accendere delle lampadine in sequenza...ma no dai...
Ad ogni linguaggio il suo...
Ricordati che stai programmando un PLC...

|START|---|TON_1|---|TON_2|---|TON_3|---|TON_4|

|START|---|TON_1.Q|---(Q0.0)

|START|---|TON_1.Q|---|TON_2.Q|---(Q0.1) e cosi via....

 

51 minuti fa, fruittis ha scritto:

Invece il ciclo for in tia portal no,non mi fa fare questa cosa,il risultato che ottengo e quello che lui aspetta i 2 secondi e poi i bit si alzano tutti insieme,perhe fa cosi??

Stai ritardando la partenza della prima iterazione e basta, vedi tutte le uscite accendersi insieme perché vengono eseguite tutte senza ritardi tra una e l'altra, come è giusto che sia.
Non puoi ritardare tra un'iterazione e l'altra, sennò il ciclo di scansione rimane nel for e sfora il tempo di controllo...

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti

dina_supertramp
17 minuti fa, drn5 ha scritto:

il delay dentro il ciclo for non ci può stare sennò il tempo ciclo va alle stelle ! 

...La cosa più importante l'ha detta @drn5...

Link al commento
Condividi su altri siti

Dina_supertramp

 

Capisco perfettamente che mi consigli di usare dei semplici ton,in cascata. Bene.

Ma se ho 80 bit da mettere in coda,ci metto una vita a programmare il tutto,nel.mentre con il ciclo for ci metterei un secondo!

 

Grazie.

Link al commento
Condividi su altri siti

Drn5

 

 

Se mi dici che non funziona in primis,cosa che credo anche io non lo scrivo per nulla il codice.

 

Per il discorso macchina a stati ti direi di no dato che ho gia fatto tutto il programma in scl😂!

 

La cosa che non capisco è la seguente: se io immetto il temporizzatore all'interno del mio ciclo for,ciò mi determina già che il mio programma entra nel ciclo for e scansiona,per contare i famosi due secondi,allora dico io qui: perche se entra nella mia funzione non mi funziona??

Link al commento
Condividi su altri siti

 

Stato 0 : bit 0

Stato 1 : start pausa

Stato 2 : fine pausa?

Stato 3 : azzerare tutti i bit

Stato 4 : ultimo bit? vai a passo 0!

Stato 4 : prossimo bit

Stato 5 : vai al passo 1

 

Che ne pensi? Puoi usare scl o quello che vuoi.

 

In un FC o FB richiamato ciclicamente dal main.

 

 

Modificato: da drn5
Link al commento
Condividi su altri siti

12 ore fa, fruittis ha scritto:

Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto!

In breve accendere una luce dopo l'altra ogni 2 secondi.

Per questo volevo utilizzare il ciclo for,in scl della siemens.

Può darsi che quello che vuoi fare non si possa fare con un ciclo, non uso Siemens quindi non mi esprimo.

Soluzione concettuale alternativa :

- Utilizzi un timer e ogni 2 secondi sposti un bit di un array di bit verso sinistra (cerca l'equivalente Siemens dello Shift Left dei bit). Potresti farlo anche moltiplicando per 2 una variabile ma 2^80 supera sicuramente anche la capacità dei LongLong Integer (64 bit)

- Trovi il modo Siemens di mappare questo array di bit alle uscite digitali (con altri PLC : Q0:80 := B0:80 con Siemens non so), ovviamente a patto che le uscite digitali siano consecutive (probabilmente 80 uscite consecutive non ci sono quindi dovrai spezzare lo spostamento rispettando l'indirizzamento fisico delle uscite i.e. Q0.0:63 := B0.63, Q1.0:16 := B64:16)

- Quando nell'array di bit viene settato l'80° bit riparti dal primo

Link al commento
Condividi su altri siti

Max.riservo

 

Lo SRL (shift register left) della siemens,sposta i bit da destra verso sinistra all'interno di una variabile,in modo tale da modificarne il valore finale.

Se mi creo un array di bit sto creando un bit singolo per volta e ciò mi determina già che non modifico nulla dato che 80 bit hanno lo stesso valore ovvero o 0 o 1.

 

Se non ricordo male dovrebbe funzionare cosi SRL,guardo ancora in settimana e poi ti do conferma.

 

Grazie mille per la risposta.

 

 

Quasi quasi metto un contatore up e voilà,me ne lavo le mani!

Link al commento
Condividi su altri siti

dina_supertramp
11 ore fa, fruittis ha scritto:

Ma se ho 80 bit da mettere in coda,ci metto una vita a programmare il tutto,nel.mentre con il ciclo for ci metterei un secondo

Effettivamente 😅 …sorry pensavo fosse una cosa didattica da 3-4 uscite…

 

Invece di un ciclo for potresti pensare a usare dei salti e accedere in modo indicizzato all’array di lampadine array[x] dove x è un intero che viene incrementato +1 dopo ogni ritardo eseguito.

Link al commento
Condividi su altri siti

Usa uno shift su un registro immagine delle uscite, oppure lo copy nelle uscite dopo.

A ogni fine del tempo impostato, shifti i bit di un posto a sinistra o destra.

L'unico problema da considerare è la folle disposizione dei bit nelle word/doppie word di siemens. Per esempio, se shifti a sinistra il settimo bit di un byte, col cavolo che lo ritrovi nel bit 0 del byte successivo, ma in quello precedente. Non è una disposizione lineare.

Link al commento
Condividi su altri siti

18 minuti fa, Ctec ha scritto:

...Usa uno shift su un registro immagine delle uscite, oppure lo copy nelle uscite dopo...

Mi sembra molto simile a quanto proposto da me ... almeno a livello concettuale, poi non usando Siemens sicuramente il tuo suggerimento è più centrato.

80 bit lo vedo difficile che si possano gestire utilizzando word/doppie word io utilizzerei un'array di bit (Siemens permettendo).

Link al commento
Condividi su altri siti

18 ore fa, fruittis ha scritto:

llora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto!

In breve accendere una luce dopo l'altra ogni 2 secondi.

Per questo volevo utilizzare il ciclo for,in scl della siemens.

 

Si fa un vettore, o array che dir si volgia, in cui c'è lo stato delle uscite, Anzi in pratica son tutti zero.

Si usa un byte o un intero come contatore che funge da indice del vettore.

Poi si fa un timer ciclico di 2 secondi, alla scadenza del timer si pone a zero il bit puntato dal contatore, si pone ad "1" il bit seguente e si incrementa di 1 il contatore.

 

é più lungo da spiegare che da fare.

Il tempo di esecuzione sarà quello delle 3 istruzioni necessarie.

Scritto inpseudo "C" sarebbe:

   bool bout[80];  //vettore delle uscite
   int icnt = 0;   //indice del vettore 
   if (timer == 0)
      {
         bout[icnt] = 0;
		 bout[icnt+1] = 1;
		 icnt++;
       }
    if (icnt > 79)
              icnt = 0;

 

Link al commento
Condividi su altri siti

Cosi è affinato...puoi resettare a sequenza finita, e il limite alto dell'array è definito da una costante (potresti anche usare un input in modo da modificare tutto dall'esterno senza accedere all'FB in caso di modifica delle dimensioni...ma interbloccala con la condizione che non ci siano operazioni in corso sull'array).
Il reset di "Done" è fatto nel segmento 4 che non si vede...

 

 

var.PNG

image.png.dd2737caa023f07d579debbbacbd2396.png

 

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti

Dina_supertramp

Livio_orsini

 

 

Grazie per l'impegno e tempo a me dedicato.

Ma il mio problema non è farlo funzionare in altri modi,ce ne sono un bel pò di modi da applicare,il mio problema è capire perche se uso un ciclo for non va,nonostamte io resetti il timer ad ogni implemento di conteggio dell'indice,bah!

 

Rimarrà un misterooo😂😂

Link al commento
Condividi su altri siti

5 ore fa, fruittis ha scritto:

non va,nonostamte io resetti il timer ad ogni implemento di conteggio dell'indice,bah!

 

Io non capisco perchè non debba funzionare. L'unico inconveniente è che se non forzi l'uscita dal ciclo il watch dog del PLC va in allarme perchè 2" con PLC fermo sull'istruzione è assurdo.

Io non conosco il linguaggio SCL, però se tu pubblichi quello che hai scritto ci sarà senz'altro qualcuno che ti trova l'inghippo.

 

Se avessi scritto qualche cosa di simile in "C", avrei mezzo un'istruzione di exti subito dopo il test del timer, ovvero se il timer è scaduto fa qualle che deve fare, altrimenti esce dal ciclo; ci rientrerà quando il PLC avrà terminato il programma e rièrende di nuovo dall'inizio.

Link al commento
Condividi su altri siti

17 ore fa, dina_supertramp ha scritto:

Cosi è affinato...puoi resettare a sequenza finita, e il limite alto dell'array è definito da una costante (potresti anche usare un input in modo da modificare tutto dall'esterno senza accedere all'FB in caso di modifica delle dimensioni...ma interbloccala con la condizione che non ci siano operazioni in corso sull'array).
Il reset di "Done" è fatto nel segmento 4 che non si vede...

 

 

var.PNG

image.png.dd2737caa023f07d579debbbacbd2396.png

 

 

59 minuti fa, Livio Orsini ha scritto:

 

Io non capisco perchè non debba funzionare. L'unico inconveniente è che se non forzi l'uscita dal ciclo il watch dog del PLC va in allarme perchè 2" con PLC fermo sull'istruzione è assurdo.

Io non conosco il linguaggio SCL, però se tu pubblichi quello che hai scritto ci sarà senz'altro qualcuno che ti trova l'inghippo.

 

Se avessi scritto qualche cosa di simile in "C", avrei mezzo un'istruzione di exti subito dopo il test del timer, ovvero se il timer è scaduto fa qualle che deve fare, altrimenti esce dal ciclo; ci rientrerà quando il PLC avrà terminato il programma e rièrende di nuovo dall'inizio.

 

 

Vi allego a tutti il ciclo che ho scritto almeno potete vedere.

 

 

Tralasciate il fatto che ho usato un altro indice in più,era solo per prova (indice 2),intanto anche usando indice del for non funziona lo stesso,la variabile appo è solo per farmi partire il timer.

E bene no non funziona nemmeno se inserisco un rt(reset timer).

Nemmeno se inserisco un exit,(motivo per cui ho fatto indice 2).

Screenshot_20241216-155849_Messenger.jpg

Link al commento
Condividi su altri siti

Dove incrementi l'indice, scrivi:

#"indice 2" := (#"indice 2" + 1);

E comunque l'approccio è errato, non stiamo facendo i professori, ma non puoi inserire dei timer dentro delle iterazioni sennò ammazzi il PLC 🤣.
Come non devi fare fare mai dei salti indietro, solo in avanti, altrimenti anche li ammazzi il ciclo di scansione.

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti

Ciao,

secondo me l'errore sta nel non aver compreso bene il funzionamento di un PLC; a grandi linee e semplificando parecchio:

- Lettura degli ingressi;

- Elaborazione dei blocchi di programma;

- Scrittura delle uscite.

A meno di non utilizzare istruzioni particolari, il PLC deve terminare l'elaborazione del programma per scrivere le uscite, quindi il pilotaggio di uscite in un ciclo for non ha molto senso.

Inoltre, giustamente come ti hanno fatto notare, esiste anche il Watch Dog.

Almeno, io la so così ...

 

Link al commento
Condividi su altri siti

Il ciclo FOR NEXT nei plc non può essere fermato, e il ton e il wait sono 2 funzioni differenti. Il ciclo for viene eseguito tutto in una unica scansione plc, se lo dovessi fermare 2 secondi per 54 cicli ti troveresti un tempo scansione enorme ed il plc in stop.

La strada giusta è quella di creare un array e un indice che incrementi ogni 2 secondi, ogni volta che incrementi l'indice setti il bit dell'array riferito all'indice, come suggerito da anche da Livio.

Link al commento
Condividi su altri siti

 

PERFETTO.

 

Volevo togliermi il dente e ci siete riusciti:

Quindi affermo a me stesso che non si può mettere un timer all'interno del ciclo for,perfetto grazie mille a tutti!

 

Ma mi rimarrà il dubbio perche sù arduino funziona anche essendo hn CICLO FOR!!

 

 

 

 

Modificato: da fruittis
Errore battitura
Link al commento
Condividi su altri siti

Drugo66

 

Diciamo che di senso ne ha,pilotare dei bit in un ciclo for.

 

Ti faccio un semplice esempio,ipotizziamo che dobbiamo resettare delle uscite di una periferica che contiene 100 uscite.

Ti metteresti veramente li a scrivere la condizione 100 volte?

Assolutamente no,si indicizza il tutto e in 2 secondi sei al top!

 

Ps: alla tua prima affermazione non ti rispondo nemmeno....

Link al commento
Condividi su altri siti

10 ore fa, fruittis ha scritto:

Ti faccio un semplice esempio,ipotizziamo che dobbiamo resettare delle uscite di una periferica che contiene 100 uscite.

 

Però se non fai una scrittura diretta alla periferia le uscite vengono azzetate tutte assieme alla fine del programma, quando il PLC copierà il registo immagine nelle uscite.

 

10 ore fa, fruittis ha scritto:

,si indicizza il tutto e in 2 secondi sei al top!

 

 

Se usassi un PLC che impiega 2" per fare 100 iterazioni in un ciclo for.....meglio puttartlo via. Dovrebbe impiegare un tempo almeno mille volte inferiore.

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