{
    S7_Author := "ABH";
    S7_BlockComment := "MLC_39g";
    S7_BlockNumber := "15103";
    S7_BlockTitle := "MLC_hM";
    S7_EditorMode := "SCL";
    S7_Family := "ZeusControl";
    S7_IECCheck := "TRUE";
    S7_Optimized := "TRUE";
    S7_Version := "1.0"
}
FUNCTION "FC15103_ZC_CALCULO_RAMPA" : Void
    VAR_INPUT
        { S7_MLC := "MLC_3wW" }
        Pulso100ms : Bool;
        { S7_MLC := "MLC_4nN" }
        HabilitarRampa : Bool;
        { S7_MLC := "MLC_4Hj" }
        ValorObjetivo : Real;
        { S7_MLC := "MLC_3Mi" }
        IncRespRapida : Real;
        { S7_MLC := "MLC_4DE" }
        DecRespRapida : Real;
        { S7_MLC := "MLC_3Br" }
        IncRespLenta : Real;
        { S7_MLC := "MLC_4dK" }
        DecRespLenta : Real;
        { S7_MLC := "MLC_4zR" }
        HistRapidaLenta : Real;
    END_VAR
    VAR_IN_OUT
        { S7_MLC := "MLC_52n" }
        ValorActual : Real;
    END_VAR
    VAR_TEMP
        t_Diferencia : Real;
        t_Incremento : Real;
    END_VAR

    { S7_Language := "SCL" }
    NETWORK
        REGION DESCRIPCION
        (*
        ###### (C)Copyright ZeusControl 2023 - 2023
        
        ---
        ### 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 calcular rampas hasta alcanzar valor objetivo.
        
        El bloque opera de la siguiente manera:
        
            1. Si esta la rampa habilitada:
            2. Realiza el calculo de la diferencia entre el valor actual y el valor objetivo.
            3. En funcion de en que rango este, realiza los incrementos en el valor actual.
          
        ---
        ### Dependencias Requeridas
        | Tipo | Elementos |
        |------|-----------|
        | FC   | - |
        | FB   | - |
        | DB   | - |
        | UDT  | - |
            
        ---
        ### Historial de Cambios
        | Versión  | Fecha      | Técnico | Cambios |
        |----------|------------|---------|---------|
        | 01.00.00 | 05.09.2023 | (HCR)   | Primera version. |
        *)
        END_REGION DESCRIPCION
        
        
        //  ==========================================================================================================
        REGION CALCULO_RAMPA
            
            //  Gestion de la rampa de Set Point al cambiar de valor
            IF #HabilitarRampa THEN
                
                //  ==========================================================================================================
                REGION CALCULOS
                    
                    //  Calculo diferencia entre Set Point y valor de la rampa
                    #t_Diferencia := ABS(#ValorObjetivo - #ValorActual);
                    
                    //  Calculo de incremento DOWN
                    IF #ValorObjetivo < #ValorActual THEN
                        IF #t_Diferencia > #HistRapidaLenta THEN
                            #t_Incremento := #DecRespRapida / 10;
                        ELSE
                            #t_Incremento := #DecRespLenta / 10;
                        END_IF;
                    END_IF;
                    
                    //  Calculo de incremento UP
                    IF #ValorObjetivo > #ValorActual THEN
                        IF #t_Diferencia > #HistRapidaLenta THEN
                            #t_Incremento := #IncRespRapida / 10;
                        ELSE
                            #t_Incremento := #IncRespLenta / 10;
                        END_IF;
                    END_IF;
                    
                END_REGION
                
                
                //  ==========================================================================================================
                REGION GESTION_INCREMENTOS
                    
                    //  Gestion incremento UP
                    IF #ValorActual < #ValorObjetivo
                        AND
                        #t_Diferencia > #t_Incremento
                        AND
                        #Pulso100ms
                    THEN
                        #ValorActual := #ValorActual + #t_Incremento;
                    END_IF;
                    
                    //  Gestion incremento DOWN
                    IF #ValorActual > #ValorObjetivo
                        AND
                        #t_Diferencia > #t_Incremento
                        AND
                        #Pulso100ms
                    THEN
                        #ValorActual := #ValorActual - #t_Incremento;
                    END_IF;
                    
                    //  Gestion limite alcanzado o sin incremento configurado
                    IF #t_Diferencia <= #t_Incremento
                        OR
                        #t_Incremento = 0
                    THEN
                        #ValorActual := #ValorObjetivo;
                    END_IF;
                    
                END_REGION
                
                
            ELSE
                
                #ValorActual := #ValorObjetivo;
                
            END_IF;
            
        END_REGION CALCULO_RAMPA
        
        
    END_NETWORK
END_FUNCTION
