Vai al contenuto
PLC Forum


Ciclo for s7-1200


fruittis

Messaggi consigliati

dina_supertramp
12 ore fa, fruittis ha scritto:

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!

Muovi un vettore vuoto dentro il vettore di lavoro e fai una singola istruzione, elaborata nell'ordine del microsecondo.

Non approcciarti in questo modo ai PLC, sei sulla strada sbagliata.

Il ciclo di scansione dell'intero programma deve stare nell'ordine dei decimi di millisecondo.
Quando sei nell'intorno del centinaio di millescondi stai già andando troppo in la...
In 2 secondi il PLC deve aver elaborato almeno qualche decina di volte , non un singolo ciclo for, ma l'intero programma!

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti


12 ore fa, fruittis ha scritto:

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

Perché Arduino non un plc ed è il perchè si usano i plc e non altri sistemi per controllare le macchine.
Un plc deve controllare moti segnali e comandare molti dispositivi contemporaneamente, se il programma per eseguire un ciclo for next si ferma tutto il resto della macchina sarebbe senza controllo. La scansione del plc deve essere continua, anche se non velocissima, il time out della scansione del ciclo che blocca il plc di solito è a 150ms.
Prima di cominciare ad usare plc secondo me devi conoscerlo, soprattutto come funziona e perchè viene utilizzato: Come lavora il plc, Come elabora il programma, Ciclo scansione.... Senza queste nozioni rischi di fare confusione con altri sistemi. 

16 ore fa, drugo66 ha scritto:

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.

e questo avviene ciclicamente, ogni ciclo si chiama scansione, ti tempo di questa scansione cambia a seconda della lunghezza del programma ed è chiamato tempo di scansione.

Se il tempo di scansione va oltre il time out il plc va in stop.

Queste sono le basi per capire e programmare correttamente un PLC.

Link al commento
Condividi su altri siti

16 ore fa, fruittis ha scritto:

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

Secondo me commetti un errore di concetto.

Nel tuo ciclo tu utilizzi (55 volte) la STESSA istanza del timer per gestire uscite diverse ... se va bene viene recepita l'ultima istanza (oppure la prima).

Non utilizzo Siemens ma ti ho proposto (come altri) una pseudo soluzione, sei sufficientemente preparato per poterla capire ad adattare alle tue esigenze.

Link al commento
Condividi su altri siti

Signori,i 2 secondi che ho scritto era per farvi capire che ci va poco,non per affermare che un ciclo duri 2 secondi,non scherziamo nemmeno hahahaha

 

Max.riservo

 

 

Se mettessi un temporizzatore per ogni uscita,tanto vale non usare un ciclo for a questo punto.

 

Per carita credevo che si potesse fare e invece no,ma meglio cosi potrebbe servire a qualcun'altro!!

🤞😀😀

 

 

 

 

Link al commento
Condividi su altri siti

Il 16/12/2024 alle 09:49 , fruittis ha scritto:

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!

Prima di capire perché non funziona, devi capire come lavora un PLC.
Tu ora stai ragionando solo sull'accensione di queste lampade, ma un PLC deve occuparsi anche di tutto il resto. Immagina di gestire una macchina o un impianto: se ti blocchi all'interno di un ciclo FOR per la sequenza delle lampade, cosa succede a tutto il resto?
Per questo in tutti i PLC esiste il "watch dog", che manda in stop la CPU se il ciclo di scansione dura più di un tempo stabilito (generalmente 150 ms).
Non puoi assolutamente mettere dei Wait come in Arduino, e i cicli FOR devi essere sicuro che siano di breve durata.
 

 

20 ore fa, fruittis ha scritto:

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

Leggere i manuali.
Il timer parte non con lo stato alto sull'ingresso, ma con un passaggio da False a True sull'ingresso.
In quel modo il timer vedrà semprte l'ingresso True, ma non l'avrà mai visto false, quindi non vede la variazione da False a True.
Poi, non rieso proprio a capire cosa serve il timer all'interno di quel ciclo FOR.
Praticamente, se per il comando delle uscite utilizzi "indice", stai dicendo che se il timer non ha terminato il conteggio deve spegnere tutte le uscite, se invece ha terminato il conteggio deve accendere tutte le uscite. Se utilizzi "indice 2", nella variabile "indice 2", all'interno del ciclo FOR scrivi per 55 volte il valore +1, quindi...


Il tutto all'interno di un IF che, se è falso, congela lo stato delle uscite.

 

Direi che è tutto da buttare.

Utilizza un timer pre creare il clock del tempo desiderato (non all'interno di un ciclo FOR).

Usa il clock (che deve rimanere attivo per una sola scansione) per abilitare un IF.

All'interno dell'IF controlla che "indice" rientri nei limiti stabiliti, eventualmente azzera indice.

Resetta la variabile che avevi settato al precedente clock.
Per fare questo devi memorizzare l'indice del ciclo precedente, ed azzerare la variabile in questo modo:
miaVarBool[indicePrecedente] := False;

Incrementa l'indice e memorizzalo per resettare la variabile al prossimo clock

Ovviamente, se hai superato il limite azzera indice.

indice += 1;

indicePrecedente := indice;

Attiva la variabiel puntata da "indice"

miaVarBool[indice] := True;

 

Le variabili "indice" e "indicePrecedente" ovviamente NON devono essere variabili di tipo "TEMP".

Link al commento
Condividi su altri siti

19 ore fa, fruittis ha scritto:

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

 

Perché ha un funzionamento completamente diverso da un PLC, come ha detto drugo66.

Nel PLC la sequenza di operazioni "leggi ingressi - esegui scansione programma - aggiorna uscite" deve essere eseguita entro un certo tempo impostato, chiamato appunto "tempo di scansione", generalmente nel campo 1-50ms.

Inoltre, ad ogni scansione il PLC "esegue" tutto il programma elencato, dal primo all'ultimo step, contrariamente a sistemi tipo Arduino dove non c'è un tempo di scansione e magari puoi generare pure un loop infinito, tipo while (1); . Questo è logicamente inaccettabile in un sistema di controllo per macchinari, dove al massimo di deve interrompere l'esecuzione e segnalare l'evento.

Apparentemente Arduino ha un suo loop(), che viene eseguito continuamente dal sistema operativo, ma non c'è controllo sul suo funzionamento né durata.

E' un concetto diverso di programmazione.

 

Non è che non si può mettere un timer dentro un FOR/NEXT, solo che appunto molto probabilmente avrai dei tempi di scansione immondi e tali da provocare il blocco del PLC.

 

Scusate, non avevo visto le risposte successive. Bye

Modificato: da Ctec
Link al commento
Condividi su altri siti

20 ore fa, fruittis ha scritto:

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

 

Perchè, probabilmente come la maggior parte degli utenti di ARDUINO, lo usi male.

Se tu scrivessi software ben fatto anche per arduino, non ti funzionerebbe perchè interverrebbe il watch dog!!

Solo che la quasi totalità degli utenti di arduino non usa attivare il watch dog per avere un controllo sul buon funzionamento del sistemino, quindi anche se usi quell'obbrobrio di funzione che ha nome "delay()", che è bloccante, il tutto funziona egualmente anche se il ciclo di for viene risolto in 3 minuti primi.

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