{
    S7_Author := "ABH";
    S7_BlockComment := "MLC_3A2";
    S7_BlockNumber := "2028";
    S7_BlockTitle := "MLC_3SV";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION "FC2028_ZC_TEMP" : Void
    VAR_INPUT
        Pulso1seg : Bool;
    END_VAR
    VAR_TEMP
        for_i : Int;
        t_N_MAX : Int;
    END_VAR

    { S7_Language := "SCL" }
    NETWORK
        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_NETWORK
END_FUNCTION
