FUNCTION "FC15103_ZC_CALCULO_RAMPA" : Void
TITLE = FC15103_ZC_CALCULO_RAMPA
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion para calculo de rampa hasta valor objetivo.
   VAR_INPUT 
      Pulso100ms : Bool;   // Pulso 100 ms
      HabilitarRampa : Bool;   // Habilitar Rampa
      ValorObjetivo : Real;   // Valor a alcanzar
      IncRespRapida : Real;   // Incremento rapido en ud. ing. / segundo
      DecRespRapida : Real;   // Decremento Rapido ud. ing. / segundo
      IncRespLenta : Real;   // Incremento lento en ud. ing. / segundo
      DecRespLenta : Real;   // Decremento lento ud. ing. / segundo
      HistRapidaLenta : Real;   // Histeresis respuesta rapida-lenta rampa
   END_VAR

   VAR_IN_OUT 
      ValorActual : Real;   // Valor actual de la rampa
   END_VAR

   VAR_TEMP 
      t_Diferencia : Real;
      t_Incremento : Real;
   END_VAR


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

