Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Timer Alternativo al TON


Messaggi consigliati

Inserito:

Buongiorno , viste le recenti discussioni circa al TON di Siemens , ho realizzato il seguente FB che potrebbe sostituire il TON di Siemens aggiungendo le seguenti caratteristiche :

1) Su fronte di salita l'Enable inizializza il conteggio ed inizia a contare

2) Cambiando il Set Value (Sv) lo prende anche se è già partito a contare

2) Oltre all'ET (Elapsed Time) riporta il TIME_LEFT (ossia il count down per l'attivazione dell'uscita Q)

 

Lo condivido pensando di fare cosa gradita.

Se avete dei suggerimenti per migliorarlo sono bene accetti.

 

Cattura1.thumb.PNG.6f93cb48b9e4834782fe68d5a0baa62e.PNGCattura2.thumb.PNG.b33f2e64921006905099b79de123dd30.PNG


Inserita:

Molto gentile da parte tua, lo proverò appena possibile.

Grazie

Inserita: (modificato)

Lo proverò

Modificato: da STEU
Inserita:

E pensare che se, dopo 2147483647, anziché ripartire da zero il conteggio fosse continuato passando a -2147483648 (Dint con segno), non ci sarebbe nemmeno stato bisogno di gestire l'overflow.

 

Inserita:
Il 29/11/2019 alle 10:25 , ifachsoftware ha scritto:

Lo condivido pensando di fare cosa gradita.

Settimana prossima lo provo di sicuro, per mia comodità, tutto in SCL.

Inserita:

@ifachsoftware

 

mi sono permesso di aggiungere una funzione al tuo prezioso codice in modo da discriminare il timer che tiene il tempo in memoria se si toglie l'abilitazione prima dello scadere. Quando scade il tempo il flag si azzera e per far ripartire basta ridare i bit di enable e ritenzione.

 

FUNCTION_BLOCK "FbTON_Tck"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Enable : Bool;   // Timer start enable
      Sv : Time;   // Delay
   END_VAR

   VAR_OUTPUT 
      Q : Bool;   // Output
      TimeLeft : Time;   // Time left
      ET : Time;   // Elapsed time
   END_VAR

   VAR_IN_OUT 
      TimeRetain : Bool;   // 0=timer restart 1=timer hold on last elapsed
   END_VAR

   VAR 
      LastTck : Time;
      CurrTck : Time;
      Increments : Time;
      PvTime : Time;
      TmpDifu : Bool;
      rtTimerStart {InstructionName := 'R_TRIG'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : R_TRIG;
      rtTimerStop {InstructionName := 'R_TRIG'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : R_TRIG;
   END_VAR

   VAR CONSTANT 
      cMaxTcks : Time := T#24D_20H_31M_23S_647MS;   // Max Ticks supported
   END_VAR


BEGIN
	REGION Handle increments
	    
	(*
	leggi ora di sistema (solo per 1500)
	*)
	    #CurrTck := TIME_TCK();
	    
	    
	    IF #Enable THEN
	        IF #LastTck > #CurrTck THEN
	            #Increments := (#cMaxTcks - #LastTck) + #CurrTck;
	        ELSE
	            #Increments := #CurrTck - #LastTck;
	        END_IF;
	    ELSE
	        #LastTck := #CurrTck;
	        #Increments := T#0ms;
	    END_IF;
	    
	    
	END_REGION
	REGION Handle Timer
	    #rtTimerStart(CLK := #Enable);
	    IF #rtTimerStart.Q AND NOT #TimeRetain THEN
	        #PvTime := t#0ms;
	    END_IF;
	    #rtTimerStop(CLK :=NOT #Enable AND #Q);
	    IF #rtTimerStop.Q  THEN
	        #PvTime := t#0ms;
	    END_IF;
	    #LastTck := #CurrTck;  // save last Tck
	END_REGION
	REGION Output
	    IF #Enable THEN
	        IF #PvTime < #Sv THEN
	            #PvTime := #PvTime + #Increments;
	            IF #PvTime > #Sv THEN
	                #PvTime := #Sv;
	            END_IF;
	        END_IF;
	        #Q := #PvTime >= #Sv;
	        IF #Q AND #TimeRetain THEN
	            #TimeRetain := false;
	        END_IF;
	        #ET := #PvTime;
	        #TimeLeft := #Sv - #ET;
	    END_IF;
	    
	    IF NOT #Enable THEN
	        IF NOT #TimeRetain THEN
	            #TimeLeft := T#0ms;
	        END_IF;
	        #Q := FALSE;
	    END_IF;
	    
	END_REGION
END_FUNCTION_BLOCK

spero sia utile a qualcuno.....

Inserita:

Ottimo lavoro, i suggerimenti sono sempre bene accetti.  😉

 

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