{
    S7_Author := "ABH";
    S7_BlockNumber := "15051";
    S7_BlockTitle := "MLC_34A";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_IECCheck := "TRUE";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION_BLOCK "FB15051_ZC_INF_CPR"
    VAR_INPUT
        { S7_MLC := "MLC_3B4" }
        GuardarDatos : Bool;
        { S7_MLC := "MLC_4T9" }
        FinGuardarDatos : Bool;
        { S7_MLC := "MLC_34T" }
        FechaActual : DTL;
        { S7_MLC := "MLC_3BK" }
        TipoProceso : Int;
        { S7_MLC := "MLC_R5" }
        Destino : Int;
        { S7_MLC := "MLC_LQ" }
        Producto : Int;
        { S7_MLC := "MLC_3Xj" }
        Producto1Destino : Int;
        { S7_MLC := "MLC_39P" }
        Producto2Destino : Int;
        { S7_MLC := "MLC_3GY" }
        Nombre : String[40];
        { S7_MLC := "MLC_3FA" }
        Matricula : String[10];
        { S7_MLC := "MLC_39J" }
        LetraQ : String[10];
        { S7_MLC := "MLC_YL" }
        KilosSP : Real;
        { S7_MLC := "MLC_4D7" }
        KilosDescargados : Real;
        { S7_MLC := "MLC_4mb" }
        DensidadMedia : LReal;
        { S7_MLC := "MLC_UF" }
        TempMediaDescarga : LReal;
        { S7_MLC := "MLC_UC" }
        TempMediaEnfriamiento : LReal;
        { S7_MLC := "MLC_f2" }
        EmpujeRealizado : Bool;
        { S7_MLC := "MLC_4AR" }
        AclaradoRealizado : Bool;
    END_VAR
    VAR_OUTPUT
        GuardarSQL : Bool;
    END_VAR
    VAR_IN_OUT
        { S7_MLC := "MLC_Xb" }
        "Mux" : _.UDT_ZC_MUX;
        { S7_MLC := "MLC_YB" }
        Informe : Array[*] of _.UDT_ZC_INF_CPR_PROD;
    END_VAR
    VAR RETAIN
        { S7_MLC := "MLC_46u" }
        s_OrdenGuardarDatos : Bool;
        { S7_MLC := "MLC_4bi" }
        s_OrdenGuardarFechaInicio : Bool;
    END_VAR
    VAR
        { S7_MLC := "MLC_4UZ" }
        s_OrdenGuardarFechaFin : Bool;
        { S7_MLC := "MLC_t6" }
        s_OrdenBorrarInforme : Bool;
        { S7_MLC := "MLC_58h" }
        s_NumeroBorrado : Int;
    END_VAR
    VAR RETAIN
        { S7_MLC := "MLC_45h" }
        s_P_Trig_TomarFechaInicio : Bool;
        { S7_MLC := "MLC_3bH" }
        s_P_Trig_TomarFechaFin : Bool;
    END_VAR
    VAR_TEMP
        { S7_MLC := "MLC_56M" }
        for_i : Int;
        t_dummyInt : Int;
        { S7_MLC := "MLC_P3" }
        t_IndiceSuperior : Int;
        { S7_MLC := "MLC_u6" }
        t_IndiceInferior : Int;
        t_InformeVacio : _.UDT_ZC_INF_CPR_PROD;
    END_VAR
    VAR CONSTANT
        ACTUAL : Int := 1;
        { S7_MLC := "MLC_5Ae" }
        TIPO_DESCARGA_PARCIAL : Int := 1;
        { S7_MLC := "MLC_4e8" }
        TIPO_DESCARGA_TOTAL : Int := 2;
    END_VAR

    { S7_Language := "SCL" }
    NETWORK
        REGION DESCRIPCION
        (*
        ###### (C)Copyright ZeusControl 2023 - 2026
        
        ---
        ### Información del Sistema
        | Hardware Compatible | Entorno de Ingeniería |
        |---------------------|-----------------------|
        | PLC serie 1200/1500 | TIA Portal 18         |
        
        ---
        > **Restricciones:** Ninguna.
        
        ---
        ### Descripción Funcional
        
        Bloque de funcion para la gestión de informes de descargas de compacto de recepcion.
        
        En ella se realizan las siguientes acciones:
        
        - Cálculo dinámico de indices de array de informes.
        - Gestion de ordenes de inicio y fin informe.
        - Desplazamiento y captura de datos de informe.
        - Borrado de informes.
        
        ---
        ### Dependencias Requeridas
        | Tipo | Elementos |
        |------|-----------|
        | FC   | `FC15005_ZC_DTL_TO_ZC_FECHA` |
        | FB   | - |
        | DB   | - |
        | UDT  | `UDT_ZC_MUX`, `UDT_ZC_INF_CPR_PROD` |
        
        ---
        ### Historial de Cambios
        | Versión  | Fecha      | Técnico | Cambios |
        |----------|------------|---------|---------|
        | 00.00.01 | 01.08.2023 | (HCR)   | Primera version. |
        | 00.00.02 | 16.04.2024 | (ABH)   | Se cambian los nombre a variables para estandarizar. |
        | 01.00.02 | 13.07.2026 | (ABH)   | Cambio a SCL. |
        *)
        END_REGION DESCRIPCION
        
        
        //  ==========================================================================================================
        REGION LIMITES_Y_MULTIPLEXADO
            
            //  Calculo limites array de informes
            #t_IndiceInferior := DINT_TO_INT(LOWER_BOUND(ARR := #Informe, DIM := 1));
            #t_IndiceSuperior := DINT_TO_INT(UPPER_BOUND(ARR := #Informe, DIM := 1));
            
            //  Si no hay informes configurados, salimos inmediatamente.
            IF #t_IndiceInferior <= 0 THEN
                #Mux.Index := 0;
                RETURN;
            END_IF;
            
            //  Limites multiplexado
            IF #Mux.Index < 1 THEN
                #Mux.Index := 0;
            END_IF;
            IF #Mux.Index > #t_IndiceSuperior THEN
                #Mux.Index := #t_IndiceSuperior;
            END_IF;
            
        END_REGION LIMITES_Y_MULTIPLEXADO
        
        
        //  ==========================================================================================================
        REGION ORDEN_INICIO_FIN
            
            //  Orden de inicio
            IF #GuardarDatos AND NOT #s_P_Trig_TomarFechaInicio THEN
                #s_OrdenGuardarFechaInicio := TRUE;
                #s_OrdenGuardarDatos := TRUE;
            END_IF;
            
            //  Orden de fin
            #GuardarSQL := FALSE;
            IF #FinGuardarDatos AND NOT #s_P_Trig_TomarFechaFin THEN
                #s_OrdenGuardarFechaFin := TRUE;
                #GuardarSQL := TRUE;
            END_IF;
            
            //  Estados anteriores
            #s_P_Trig_TomarFechaInicio := #GuardarDatos;
            #s_P_Trig_TomarFechaFin := #FinGuardarDatos;
            
        END_REGION ORDEN_INICIO_FIN
        
        
        //  ==========================================================================================================
        REGION ADQUISICION_DE_DATOS
            
            //  Con flanco de guardar datos fecha de inicio, desplazamos los registros y almacenamos la fecha de inicio
            IF #s_OrdenGuardarFechaInicio THEN
                
                //  Desplazamiento de datos
                #t_dummyInt := MOVE_BLK_VARIANT(SRC := #Informe, COUNT := INT_TO_UDINT(#t_IndiceSuperior - 1), SRC_INDEX := 0, DEST_INDEX := 1, DEST => #Informe);
                
                //  Tomar valor de fecha de inicio
                #Informe[#ACTUAL].FechaInicio := "FC15005_ZC_DTL_TO_ZC_FECHA"(#FechaActual);
                #s_OrdenGuardarFechaInicio := FALSE;
            END_IF;
            
            //  Tomar datos 
            IF #s_OrdenGuardarDatos THEN
                #Informe[#ACTUAL].Descarga.TipoProceso := #TipoProceso;
                #Informe[#ACTUAL].Descarga.Destino := #Destino;
                IF #TipoProceso = #TIPO_DESCARGA_PARCIAL OR #TipoProceso = #TIPO_DESCARGA_TOTAL THEN
                    #Informe[#ACTUAL].Descarga.Producto := #Producto;
                    #Informe[#ACTUAL].Descarga.Producto1Destino := #Producto1Destino;
                    #Informe[#ACTUAL].Descarga.Producto2Destino := #Producto2Destino;
                    #Informe[#ACTUAL].Descarga.KilosSP := #KilosSP;
                    #Informe[#ACTUAL].Descarga.KilosDescargados := #KilosDescargados;
                    #Informe[#ACTUAL].Descarga.DensidadMedia := #DensidadMedia;
                    #Informe[#ACTUAL].Descarga.TemperaturaMediaDescarga := #TempMediaDescarga;
                    #Informe[#ACTUAL].Descarga.TemperaturaMediaEnfriamiento := #TempMediaEnfriamiento;
                    #Informe[#ACTUAL].Descarga.Nombre := #Nombre;
                    #Informe[#ACTUAL].Descarga.Matricula := #Matricula;
                    #Informe[#ACTUAL].Descarga.LetraQ := #LetraQ;
                END_IF;
                #Informe[#ACTUAL].Descarga.EmpujeRealizado := #EmpujeRealizado;
                #Informe[#ACTUAL].Descarga.AclaradoRealizado := #AclaradoRealizado;
            END_IF;
            
            //  Con flanco de guardar datos fecha de fin almacenamos la fecha de fin y resetemos guardar datos
            IF #s_OrdenGuardarFechaFin THEN
                #Informe[#ACTUAL].FechaFin := "FC15005_ZC_DTL_TO_ZC_FECHA"(#FechaActual);
                #s_OrdenGuardarDatos := FALSE;
                #s_OrdenGuardarFechaFin := FALSE;
            END_IF;
            
        END_REGION ADQUISICION_DE_DATOS
        
        
        //  ==========================================================================================================
        REGION BORRADO_INFORMES
            
            //  Borrado de todos los registros
            IF #s_OrdenBorrarInforme THEN
                IF #s_NumeroBorrado = -1 OR #s_NumeroBorrado = 0 THEN
                    
                    //  Borrado total
                    FOR #for_i := 1 TO #t_IndiceSuperior DO
                        #Informe[#for_i] := #t_InformeVacio;
                    END_FOR;
                    
                ELSIF #s_NumeroBorrado >= 1 AND #s_NumeroBorrado < #t_IndiceSuperior THEN
                    
                    //  Borrado registro especifico
                    #Informe[#s_NumeroBorrado] := #t_InformeVacio;
                    
                    //  Desplazamiento de datos
                    #t_dummyInt := MOVE_BLK_VARIANT(SRC := #Informe,
                                                    COUNT := INT_TO_UDINT(#t_IndiceSuperior - #s_NumeroBorrado),
                                                    SRC_INDEX := #s_NumeroBorrado,
                                                    DEST_INDEX := #s_NumeroBorrado - 1,
                                                    DEST => #Informe);
                    
                    //  Borrado del ultimo registro
                    #Informe[#t_IndiceSuperior] := #t_InformeVacio;
                    
                ELSIF #s_NumeroBorrado = #t_IndiceSuperior THEN
                    
                    //  Borrado de ultimo registro
                    #Informe[#s_NumeroBorrado] := #t_InformeVacio;
                    
                END_IF;
                
                #s_OrdenBorrarInforme := FALSE;
                
            END_IF;
            
            
        END_REGION BORRADO_INFORMES
        
    END_NETWORK
END_FUNCTION_BLOCK
