Vai al contenuto
PLC Forum


tempo ciclo


bepin

Messaggi consigliati

ciao a tutti! e buon anno

nel vecchio S7  c'era, in OB1, la variabile  "OB1_PREV_CYCLE"   da trasferire in un dato e molto utile per generare timers molto precisi

adesso sto cercando di tradurre i miei vecchi blocchi S7  ma nel tia portal non riesco a trovare  qualcosa di simile,

-- mi potete aiutare?

grazie

giuseppe

Link al commento
Condividi su altri siti


Per avere l’informazione contenuta in quel tag io sceglierei tra questi due modi:

1)leggere il tempo del sistema in OB1 (in questo caso effettuo tutte le operazioni in una FB che richiamo in OB1) e sottrarlo al valore letto nel ciclo precedente.

2)Utilizzare un Timer e sottrarre al valore attuale del “elapsed time” il valore precedente.

Io preferirei usare il secondo metodo in quanto richiede un tempo di esecuzione minore.

Per il primo caso creo la seguente FB1:

FB1_final.png

 dove come si può notare posso avere il tempo anche in nanosecondi; mentre nel secondo caso creo la seguente FB2 (nel timer sotto ho impostato solo 10secondi che è un tempo troppo basso, meglio mettere t#24d).

FB2_final.png

Creo poi una FB con un ciclo while all’interno creato appositamente per aumentare il cycle time (per testare il tutto), ovvero:

FUNCTION_BLOCK "Ciclo_WHILE"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR 
      intero1 : DInt;
   END_VAR
 
 
BEGIN
	#intero1 := 0;
	WHILE #intero1<99999 DO
	    #intero1 := #intero1 + 1;
	END_WHILE;
 
END_FUNCTION_BLOCK

Quindi chiamo nel Main tutte e tre le FB:

main_final.png

Ho testato tutto nel simulatore e dovrebbe funzionare:


simulatore2.png

 

Link al commento
Condividi su altri siti

Nel 1500 puoi utilizzare le istruzioni RUNTIME oppure TIME_TCK. Il 1200 non supporta solo RUNTIME.

L'istruzione RUNTIME, almeno nel 1200, presenta un piccolo inconveniente: per la misura del tempo utilizza un contatore interno che, massimo una volta al minuto, può andare in overflow. In questo caso viene restituito un tempo di scansione negativo. Si deve quindi fare un controllo sulla validità del valore restituito prima i prenderlo in considerazione.

 

Oppure, se imposti OB1 come "non ottimizzato", trovi ancora la variabile locale OB1_PREV_CYCLE.

 

Link al commento
Condividi su altri siti

sono comunque e sempre timer asincroni anche se calcoli la variazione di scansione tra un ciclo e l'altro , tipo derivata.

Il tempo di ciclo dipende dall'esecuzione del programma e dai task che il plc esegue inbackground come la comuncazione etc 

Puoi anche usare il fronte di salita di un merker di clock ed incrementare dei contatori e di conseguenza ricavarne il timer software.

Il mio consiglio e' quello di utilizzare prima quelli di sistema 

ciao

Link al commento
Condividi su altri siti

L'istruzione RUNTIME, almeno nel 1200, presenta un piccolo inconveniente: per la misura del tempo utilizza un contatore interno che, massimo una volta al minuto, può andare in overflow.

Anche i metodi descritti da FabioS.PLC ogni tanto presentano lo stesso problema e l'utilizzo di quella variabile può dare risultati imprevisti... 

Bisogna inserire una gestione del "rollover".

 

Una domanda per Batta, visto che per il momento non utilizzo il TIA:

Oppure, se imposti OB1 come "non ottimizzato", trovi ancora la variabile locale OB1_PREV_CYCLE.

Che significa "ottimizzato", che vantaggi ha ?

Modificato: da JumpMan
Link al commento
Condividi su altri siti

La dicitura "blocco ottimizzato" indica un blocco (OB, FC, FB o DB) nel quale l'indirizzamento delle variabili è gestito dal sistema. L'accesso alle variabili può avvenire solo utilizzando il simbolico, perché l'indirizzo non è noto.

Per esempio, in un DB "non ottimizzato" dopo la compilazione appaiono gli indirizzi delle variabili, esattamente come in Step7 classico. In un DB "ottimizzato" la colonna con gli indirizzi non c'è.

 

Io non ho mai fatto prove, ma Siemens afferma che la gestione dei blocchi "ottimizzati" è più veloce.

 

Non è però possibile utilizzare sempre blocchi ottimizzati. Per esempio, ci sono istruzioni (BLK_MOVE, FILL e molte altre) che utilizzano gli indirizzi assoluti. Le variabili collegate a queste istruzioni devono quindi tassativamente fare parte di un blocco non ottimizzato.

 

Nel caso poi si utilizzino pannelli operatore di terze parti (e, se non vado errato, anche con WinCC), siamo ancora nella situazione in cui si fa riferimento agli indirizzi. I DB con variabili di scambio con questi HMI/SCADA devono quindi essere "non ottimizzati". Nessun problema invece, anche con DB "ottimizzati", utilizzando i pannelli operatore Siemens programmati con TIA Portal.

Link al commento
Condividi su altri siti

Grazie Batta.

Quindi, da come la vedo io, non c'è nessun pro ad averlo ottimizzato se non quello di una stesura (forse) più rapida del programma. non si devono fare xref e non ci si deve preoccupare dell'indirizzamento, ci pensa lui ma "lo tiene nascosto solo per l'uso con i suoi HMI"...

Nel caso del topic mi sembra che la soluzione migliore sia avere OB1 non ottimizzato.

ciao

 

Link al commento
Condividi su altri siti

  • 1 month later...

grazie -in ritardo- per le risposte

i timer che generavo sono principalmente per fare gli allarmi di movimento ( es. il cilindro che non esegue la manovra in un certo tempo ..)

e volevo un'area separata tanto per distinguerli; quindi penso che mi appoggerò ai merker clock di sistema ..tanto non mi serve gran precisione

un timer così mi era utile con i pannelli non Siemens e che non accettano il dato #s5t.... ma mi bastava una word qualsiasi magari in int.

comunque grazie mille per le risposte e, con un po' di tempo proverò anche le due FB

Link al commento
Condividi su altri siti

  • 2 months later...

Salve riprendo un attimo la conversazione per approfondire la questione tempo di ciclo.

Se avessi la necessità di eseguire diversi calcoli in un tempo di ciclo prestabilito, cercando di ottenere così un'esecuzione Real time, è possibile utilizzare i blocchi di sistema già disponibili dal plc per esempio: OB 32 - 33 - 34 - 35 avendo la certezza di eseguirli in maniera deterministica ?

Se questo fosse possibile, eventualmente, dovrei prendere i valori di due pt100, fare la differenza e moltiplicarla per il valore dato da un flussimetro e successivamente fare l'integrale del prodotto risultante in un intervallo di tempo predefinito. Secondo voi è una cosa fattibile?

 

grazie mille

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