Vai al contenuto
PLC Forum


Timer Alternativo al TON


ifachsoftware

Messaggi consigliati

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

Link al commento
Condividi su altri siti


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.

 

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

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