{
    S7_Author := "ABH";
    S7_BlockNumber := "16";
    S7_BlockTitle := "MLC_Sb";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_IECCheck := "TRUE";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION "FC16_ZC_GEST_PINT" : Void
    VAR_INPUT
        { S7_MLC := "MLC_4am" }
        PrimerCiclo : Bool;
        { S7_MLC := "MLC_4Pc" }
        FechaHora : DTL;
        { S7_MLC := "MLC_aV" }
        Usuario : String;
        { S7_MLC := "MLC_3TM" }
        PInt : Array[*] of _.UDT_ZC_PINT;
        { S7_MLC := "MLC_cc" }
        IndexTraza : Int;
    END_VAR
    VAR_IN_OUT
        { S7_MLC := "MLC_4x3" }
        ValorAnterior : Array[*] of Int;
    END_VAR
    VAR_TEMP
        { S7_MLC := "MLC_4Uh" }
        for_i : DInt;
        { S7_MLC := "MLC_3JR" }
        t_IndiceSuperior : DInt;
        { S7_MLC := "MLC_48e" }
        t_IndiceInferior : DInt;
    END_VAR

    { S7_Language := "SCL" }
    NETWORK
        REGION DESCRIPCION
        (*
        ###### (C)Copyright ZeusControl 2026 - 2026
        
        ---
        ### Información del Sistema
        | Hardware Compatible | Entorno de Ingeniería |
        |---------------------|-----------------------|
        | PLC serie 1200/1500 | TIA Portal 18         |
        
        ---
        > **Restricciones:** DB Optimizado.
        
        ---
        ### Descripción Funcional
        
        Función principal para la gestión de trazabilidad de los parámetros **enteros** del proceso. 
        
        Su objetivo principal es detectar cambios de valor en el array de parámetros y lanzar un registro de traza cuando esto sucede.
        
        El bloque opera de la siguiente manera:
        
            1. Calcula dinámicamente los límites superior e inferior del array de entrada.
            2. Si es el primer ciclo de ejecución de la CPU, inicializa los valores "anteriores" con los valores "actuales" para evitar falsos registros de traza iniciales.
            3. En ciclos normales, compara el valor actual de cada parámetro con su valor guardado en el ciclo anterior.
            4. Si detecta una diferencia, llama a la función `FC8_ZC_TRAZA_REGISTRO` para registrar el cambio y actualiza el valor anterior.
        
        ---
        ### Dependencias Requeridas
        | Tipo | Elementos |
        |------|-----------|
        | FC   | `FC8_ZC_TRAZA_REGISTRO` |
        | FB   | - |
        | DB   | - |
        | UDT  | `UDT_ZC_PINT` |
            
        ---
        ### Historial de Cambios
        | Versión  | Fecha      | Técnico | Cambios |
        |----------|------------|---------|---------|
        | 01.00.00 | 2026-03-20 | (ABH) | Primera version. |
        *)
        END_REGION DESCRIPCION
        
        
        //  ==========================================================================================================
        REGION CALCULO_LIMITES_ARRAY
            
            //  Calculo de los limites del array, ya que la entrada del array de parametros es variable.
            #t_IndiceInferior := LOWER_BOUND(ARR := #PInt, DIM := 1);
            #t_IndiceSuperior := UPPER_BOUND(ARR := #PInt, DIM := 1);
            
        END_REGION CALCULO_LIMITES_ARRAY
        
        
        //  ==========================================================================================================
        REGION PRIMER_ARRANQUE
            
            //  En el primer arranque de la CPU, recorremos el array completo y almacenamos los valores actuales como valores anteriores en el arranque de la CPU.
            //  Esto se realiza ya que los valores anteriores no son remanentes, para optimizar la memoria del PLC.
            IF #PrimerCiclo THEN
                
                FOR #for_i := #t_IndiceInferior TO #t_IndiceSuperior DO
                    #ValorAnterior[#for_i] := #PInt[#for_i].Valor;
                END_FOR;
                
                //  Salimos inmediatamente de la funcion, para realizar la gestion de los parametros con la CPU arrancada
                RETURN;
                
            END_IF;
            
        END_REGION PRIMER_ARRANQUE
        
        
        //  ==========================================================================================================
        REGION GESTION_PARAMETROS
            
            //  Gestion de los cambios de valor de los parametros. Si detecta un cambio, lanza la traza
            //  y actualiza el valor anterior.
            FOR #for_i := #t_IndiceInferior TO #t_IndiceSuperior DO
                
                //  En caso de detectar cambio de valor
                IF #PInt[#for_i].Valor <> #ValorAnterior[#for_i] THEN
                    
                    //  Lanzamos la trazabilidad
                    "FC8_ZC_TRZ_REGISTRO"(FechaHora := #FechaHora,
                                            Registrar := 1,
                                            Categoria := "TRZ_CAT_26_PINT",
                                            User := #Usuario,
                                            CodInt_1 := #IndexTraza + DINT_TO_INT(#for_i - 1),
                                            CodInt_2 := "TRZ_SYS_PAR_VAL_ANT",
                                            CodInt_3 := "TRZ_SYS_PAR_VAL_NUE",
                                            CodInt_4 := 0,
                                            CodInt_5 := 0,
                                            CodReal_1 := #ValorAnterior[#for_i],
                                            CodReal_2 := #PInt[#for_i].Valor);
                    
                    //  Actualizamos el valor anterior
                    #ValorAnterior[#for_i] := #PInt[#for_i].Valor;
                    
                END_IF;
                
            END_FOR;
            
        END_REGION GESTION_PARAMETROS
        
        
    END_NETWORK
END_FUNCTION
