{
    S7_Author := "ABH";
    S7_BlockComment := "MLC_4CR";
    S7_BlockNumber := "2937";
    S7_BlockTitle := "MLC_Z9";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION "FC2937_ZC_MEDIA_INDV" : Void
    VAR_INPUT
        { S7_MLC := "MLC_3rq" }
        Pulso1seg : Bool;
    END_VAR
    VAR_IN_OUT
        { S7_MLC := "MLC_RE" }
        Media : _.UDT_ZC_DISP_MEDIA;
    END_VAR
    VAR_TEMP
        t_NumeroDatos : LReal;
    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:** Ninguna.
        
        ---
        ### Descripción Funcional
        
        Función encargada de gestionar un dispositivo Media.
        
        Las tareas que realiza son las siguientes:
        
        - Gestionar la activacion y calculo de la media.
        
        ---
        ### Dependencias Requeridas
        | Tipo | Elementos |
        |------|-----------|
        | FC   | - |
        | FB   | - |
        | DB   | - |
        | UDT  | `UDT_ZC_DISP_MEDIA` |
            
        ---
        ### Historial de Cambios
        | Versión  | Fecha      | Técnico | Cambios |
        |----------|------------|---------|---------|
        | 01.00.00 | 20.03.2025 | (ABH)   | Primera version. |
        *)
        END_REGION DESCRIPCION
        
        
        //  ==========================================================================================================
        REGION GESTION_DISPOSITIVO
            
            //  ==========================================================================================================
            REGION REINICIALIZACION_DE_DATOS
                
                //  Reset temporizador interno si no esta habilitada la media
                IF NOT #Media.IniciarMedia THEN
                    #Media.auxTiempo := 0;
                END_IF;
                
                //  Reinicializacion de datos al inicializar
                IF #Media.Inicializar AND NOT #Media.auxInicializar THEN
                    #Media.auxAcumulado := 0.0;
                    #Media.auxIndice := 0;
                    #Media.auxTiempo := 0;
                    #Media.ValorMinimo := 9999999.0;
                    #Media.ValorMaximo := -9999999.0;
                END_IF;
                
                //  Estado anterior
                #Media.auxInicializar := #Media.Inicializar;
                
            END_REGION REINICIALIZACION_DE_DATOS
            
            
            //  ==========================================================================================================
            REGION TOMA_DE_VALORES
                
                IF #Media.IniciarMedia AND #Pulso1seg THEN
                    
                    //  Incrementamos el indice de tiempo
                    #Media.auxTiempo += 1;
                    
                    //  En caso de superar el tiempo de muestreo, incrementamos el acumulado, reseteamos el tiempo y aumentamos el indice
                    IF #Media.auxTiempo >= #Media.TiempoMuestreo THEN
                        
                        #Media.auxAcumulado := #Media.ValorActual + #Media.auxAcumulado;
                        #Media.auxIndice += 1;
                        #Media.auxTiempo := 0;
                        
                    END_IF;
                    
                    //  Guardamos el valor minimo alcanzado
                    IF #Media.ValorActual < #Media.ValorMinimo THEN
                        #Media.ValorMinimo := #Media.ValorActual;
                    END_IF;
                    
                    //  Guardamos el valor maximo alcanzado
                    IF #Media.ValorActual > #Media.ValorMaximo THEN
                        #Media.ValorMaximo := #Media.ValorActual;
                    END_IF;
                    
                END_IF;
                
                //  Conversion de indice a REAL para calculos
                #t_NumeroDatos := DINT_TO_LREAL(#Media.auxIndice);
                
            END_REGION TOMA_DE_VALORES
            
            
            //  ==========================================================================================================
            REGION CALCULO_MEDIA
                
                IF #Media.auxIndice > 0 THEN
                    #Media.Media := #Media.auxAcumulado / #t_NumeroDatos;
                ELSE
                    #Media.Media := 0.0;
                END_IF;
                
            END_REGION CALCULO_MEDIA
            
        END_REGION GESTION_DISPOSITIVO
        
        
    END_NETWORK
END_FUNCTION
