FUNCTION "FC2028_ZC_TEMP" : Void
TITLE = FC2028_ZC_TEMP
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion para gestion de temporizadorres TON, TOF, TONR y TP (Base 1 seg)
   VAR_INPUT 
      Pulso1seg : Bool;
   END_VAR

   VAR_TEMP 
      for_i : Int;
      t_N_MAX : Int;
   END_VAR


BEGIN
	REGION DESCRIPCION
	(*
	###### (C)Copyright ZeusControl 2022 - 2026
	
	---
	### Información del Sistema
	| Hardware Compatible | Entorno de Ingeniería |
	|---------------------|-----------------------|
	| PLC serie 1200/1500 | TIA Portal 18         |
	
	---
	> **Restricciones:** Ninguna.
	
	---
	### Descripción Funcional
	
	Función encargada de gestionar un dispositivo TON.
	
	Las tareas que realiza son las siguientes:
	
	- Gestionar la activacion y temporizacion de la activacion del temporizador.
	
	---
	### Dependencias Requeridas
	| Tipo | Elementos |
	|------|-----------|
	| FC   | - |
	| FB   | - |
	| DB   | `DB2028_TEMP` |
	| UDT  | - |
	    
	---
	### Historial de Cambios
	| Versión  | Fecha      | Técnico | Cambios |
	|----------|------------|---------|---------|
	| 00.00.01 | 02.10.2022 | (ABH)   | Primera version. |
	| 00.00.02 | 03.05.2022 | (ABH)   | TONR. Se añade tiempo Restante. |
	| 00.00.03 | 13.09.2023 | (ABH)   | TP. Se elimina la marca "Flanco" ya que no es necesaria. Se utiliza solamente la marca "oldIN" para la deteccion de flancos. |
	| 00.00.04 | 13.08.2025 | (ABH)   | TONR. Se modifica activacion de salida Q sin dependencia de entrada IN. |
	| 01.00.00 | 06.07.2026 | (ABH)   | Se unifican los temporizadores en un solo DB y en un solo FC |
	*)
	END_REGION DESCRIPCION
	
	
	//  ==========================================================================================================
	REGION GESTION_DISPOSITIVO_TON    
	    
	    //  Traspaso de N_MAX a variable temporal para evitar fallos de compilacion
	    #t_N_MAX := "N_MAX_DISP_TON";
	    
	    IF #t_N_MAX >= 1 THEN
	        
	        FOR #for_i := 1 TO #t_N_MAX DO
	            
	            IF "DB2028_TEMP".TON[#for_i].IN THEN
	                IF "DB2028_TEMP".TON[#for_i].ET >= "DB2028_TEMP".TON[#for_i].SP THEN
	                    "DB2028_TEMP".TON[#for_i].Q := TRUE;
	                ELSE
	                    IF #Pulso1seg THEN
	                        "DB2028_TEMP".TON[#for_i].ET += 1;
	                    END_IF;
	                END_IF;
	            ELSE
	                "DB2028_TEMP".TON[#for_i].ET := 0;
	                "DB2028_TEMP".TON[#for_i].Q := FALSE;
	            END_IF;
	            
	        END_FOR;
	        
	    END_IF;
	    
	END_REGION GESTION_DISPOSITIVO_TON
	
	
	//  ==========================================================================================================
	REGION GESTION_DISPOSITIVO_TOF
	    
	    //  Traspaso de N_MAX a variable temporal para evitar fallos de compilacion
	    #t_N_MAX := "N_MAX_DISP_TOF";
	    
	    IF #t_N_MAX >= 1 THEN
	        
	        FOR #for_i := 1 TO #t_N_MAX DO
	            
	            IF "DB2028_TEMP".TOF[#for_i].IN THEN
	                "DB2028_TEMP".TOF[#for_i].OldActivar := TRUE;
	                "DB2028_TEMP".TOF[#for_i].Q := TRUE;
	            END_IF;
	            IF "DB2028_TEMP".TOF[#for_i].OldActivar AND NOT "DB2028_TEMP".TOF[#for_i].IN THEN
	                
	                IF "DB2028_TEMP".TOF[#for_i].ET <= 0 THEN
	                    "DB2028_TEMP".TOF[#for_i].Q := FALSE;
	                    "DB2028_TEMP".TOF[#for_i].OldActivar := FALSE;
	                ELSE
	                    IF #Pulso1seg THEN
	                        "DB2028_TEMP".TOF[#for_i].ET -= 1;
	                    END_IF;
	                END_IF;
	            ELSE
	                "DB2028_TEMP".TOF[#for_i].ET := "DB2028_TEMP".TOF[#for_i].SP;
	            END_IF;
	            
	        END_FOR;
	        
	    END_IF;
	    
	END_REGION GESTION_DISPOSITIVO_TOF
	
	
	//  ==========================================================================================================
	REGION GESTION_DISPOSITIVO_TONR
	    
	    //  Traspaso de N_MAX a variable temporal para evitar fallos de compilacion
	    #t_N_MAX := "N_MAX_DISP_TONR";
	    
	    IF #t_N_MAX >= 1 THEN
	        
	        FOR #for_i := 1 TO #t_N_MAX DO
	            
	            IF "DB2028_TEMP".TONR[#for_i].RESET THEN
	                "DB2028_TEMP".TONR[#for_i].ET := 0;
	                "DB2028_TEMP".TONR[#for_i].Q := FALSE;
	                "DB2028_TEMP".TONR[#for_i].RESET := FALSE;
	            END_IF;
	            
	            IF "DB2028_TEMP".TONR[#for_i].IN AND
	                "DB2028_TEMP".TONR[#for_i].ET < "DB2028_TEMP".TONR[#for_i].SP AND
	                #Pulso1seg
	            THEN
	                "DB2028_TEMP".TONR[#for_i].ET += 1;
	                "DB2028_TEMP".TONR[#for_i].Q := FALSE;
	                
	            END_IF;
	            
	            IF "DB2028_TEMP".TONR[#for_i].ET >= "DB2028_TEMP".TONR[#for_i].SP THEN
	                "DB2028_TEMP".TONR[#for_i].Q := TRUE;
	            END_IF;
	            
	            "DB2028_TEMP".TONR[#for_i].RT := "DB2028_TEMP".TONR[#for_i].SP - "DB2028_TEMP".TONR[#for_i].ET;
	            
	        END_FOR;
	        
	    END_IF;
	    
	END_REGION GESTION_DISPOSITIVO_TONR
	
	
	//  ==========================================================================================================
	REGION GESTION_DISPOSITIVO_TP
	    
	    //  Traspaso de N_MAX a variable temporal para evitar fallos de compilacion
	    #t_N_MAX := "N_MAX_DISP_TP";
	    
	    IF #t_N_MAX >= 1 THEN
	        
	        FOR #for_i := 1 TO #t_N_MAX DO
	            
	            // =============================================================================
	            // Detección de flanco 
	            IF "DB2028_TEMP".TP[#for_i].IN AND NOT "DB2028_TEMP".TP[#for_i].oldIN THEN
	                "DB2028_TEMP".TP[#for_i].Q := TRUE;
	            END_IF;
	            
	            //  Actualizo valor de memoria
	            "DB2028_TEMP".TP[#for_i].oldIN := "DB2028_TEMP".TP[#for_i].IN;
	            
	            // =============================================================================
	            //  Reinicio memoria de activación cuando piedo salida y cuento tiempo
	            IF NOT "DB2028_TEMP".TP[#for_i].IN THEN
	                "DB2028_TEMP".TP[#for_i].oldIN := FALSE;
	            END_IF;
	            
	            // =============================================================================
	            // Incremento de tiempo
	            IF "DB2028_TEMP".TP[#for_i].Q
	                AND
	                "DB2028_TEMP".TP[#for_i].ET < "DB2028_TEMP".TP[#for_i].PT
	                AND
	                #Pulso1seg
	            THEN
	                "DB2028_TEMP".TP[#for_i].ET += 1;
	            END_IF;
	            
	            // =============================================================================
	            // Desactivo salida cuando cumplo tiempo de retardo de salida
	            IF "DB2028_TEMP".TP[#for_i].ET >= "DB2028_TEMP".TP[#for_i].PT THEN
	                "DB2028_TEMP".TP[#for_i].Q := FALSE;
	                "DB2028_TEMP".TP[#for_i].ET := 0;
	            END_IF;
	            
	        END_FOR;
	        
	    END_IF;
	    
	END_REGION GESTION_DISPOSITIVO_TP
	
END_FUNCTION

