{
    S7_Author := "ABH";
    S7_BlockComment := "MLC_ac";
    S7_BlockNumber := "15106";
    S7_BlockTitle := "MLC_4VR";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_IECCheck := "TRUE";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION "FC15106_ZC_GESTION_LISTA" : Void
    VAR_IN_OUT
        Lista : Array[*] of _.UDT_ZC_LISTA_ORIG_DEST;
    END_VAR
    VAR_TEMP
        for_i : Int;
        for_j : Int;
        t_Index : Int;
        t_LowerBound : Int;
        t_UpperBound : Int;
        t_YaExiste : Bool;
        t_ListaTemporal : Array[0..100] of _.UDT_ZC_LISTA_ORIG_DEST;
    END_VAR

    { S7_Language := "SCL" }
    NETWORK
        REGION DESCRIPCION
        (*
        ###### (C)Copyright ZeusControl 2025 - 2025
        
        ---
        ### Información del Sistema
        | Hardware Compatible | Entorno de Ingeniería |
        |---------------------|-----------------------|
        | PLC serie 1200/1500 | TIA Portal 18         |
        
        ---
        > **Restricciones:** Límite de listas de tipo `UDT_ZC_LISTA_ORIG_DEST` con 100 posiciones.
            
        Función encargada de gestionar, limpiar y compactar listas de valores enteros.
        
            - Calcular dinámicamente los límites del array de entrada `#Lista` mediante las instrucciones `LOWER_BOUND` y `UPPER_BOUND`.
            - Inicializar a cero una lista temporal interna (`#t_ListaTemporal`) adaptada a la longitud del array procesado.
            - Analizar cíclicamente los elementos de la `#Lista` para filtrar y omitir de forma automática aquellos que posean valor cero.
            - Identificar y suprimir las entradas duplicadas para garantizar un conjunto final de datos compuesto exclusivamente por valores únicos.
            - Compactar los datos filtrados y transferirlos de vuelta a la `#Lista` original, reescribiendo los valores secuencialmente desde su límite inferior.
        
        ---
        ### Dependencias Requeridas
        | Tipo | Elementos |
        |------|-----------|
        | FC   | - |
        | FB   | - |
        | DB   | - |
        | UDT  | `UDT_ZC_LISTA_ORIG_DEST` |
        
        ---
        ### Historial de Cambios
        | Versión  | Fecha      | Técnico | Cambios |
        |----------|------------|---------|---------|
        | 00.00.01 | 27.06.2025 | (ABH)   | Primera version. |
        | 01.00.00 | 03.07.2026 | (ABH)   | Cambio en tipo de datos de INT a `UDT_ZC_LISTA_ORIG_DEST`. |
        *)
        END_REGION DESCRIPCION
        
        
        //  ==========================================================================================================
        REGION CALCULOS
            
            //  Obtener límites reales del array
            #t_LowerBound := DINT_TO_INT(LOWER_BOUND(ARR := #Lista, DIM := 1));
            #t_UpperBound := DINT_TO_INT(UPPER_BOUND(ARR := #Lista, DIM := 1));
            
            //  Inicializar lista temporal 
            FOR #for_i := 1 TO DINT_TO_INT((#t_UpperBound - #t_LowerBound + 1)) DO
                #t_ListaTemporal[#for_i].Id := 0;
                #t_ListaTemporal[#for_i].Consigna := 0;
            END_FOR;
            
        END_REGION CALCULOS
        
        
        //  ==========================================================================================================
        REGION GESTION_LISTA
            
            //  Compactar y eliminar duplicados
            #t_Index := 1;
            FOR #for_i := #t_LowerBound TO #t_UpperBound DO
                IF #Lista[#for_i].Id <> 0 THEN
                    #t_YaExiste := FALSE;
                    
                    FOR #for_j := 1 TO #t_Index - 1 DO
                        IF #t_ListaTemporal[#for_j].Id = #Lista[#for_i].Id THEN
                            #t_YaExiste := TRUE;
                            EXIT;
                        END_IF;
                    END_FOR;
                    
                    IF NOT #t_YaExiste THEN
                        #t_ListaTemporal[#t_Index] := #Lista[#for_i];
                        #t_Index := #t_Index + 1;
                    END_IF;
                END_IF;
            END_FOR;
            
            //  Copiar de vuelta a lista original
            FOR #for_i := #t_LowerBound TO #t_UpperBound DO
                #Lista[#for_i] := #t_ListaTemporal[#for_i - #t_LowerBound + 1];
            END_FOR;
            
        END_REGION
        
        
    END_NETWORK
END_FUNCTION
