FUNCTION "FC15106_ZC_GESTION_LISTA" : Void
TITLE = FC15106_ZC_GESTION_LISTA
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion de gestion listas
   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


BEGIN
	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_FUNCTION

