FUNCTION "FC2938_ZC_MEDIA_VOL_INDV" : Void
TITLE = FC2938_ZC_MEDIA_VOL
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion para gestion de media teniendo en cuenta el volumen/caudal.
   VAR_INPUT 
      Pulso1seg : Bool;   // Pulso de 1 segundo
   END_VAR

   VAR_IN_OUT 
      Media : "UDT_ZC_DISP_MEDIA_VOLUMEN";   // Media
   END_VAR

   VAR_TEMP 
      t_NumeroDatos : LReal;
   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:** Ninguna.
	
	---
	### Descripción Funcional
	
	Función encargada de gestionar un dispositivo Media volumen.
	
	Las tareas que realiza son las siguientes:
	
	- Gestionar la activacion y calculo de la media teniendo en cuenta el volumen/caudal.
	
	---
	### Dependencias Requeridas
	| Tipo | Elementos |
	|------|-----------|
	| FC   | - |
	| FB   | - |
	| DB   | - |
	| UDT  | `UDT_ZC_DISP_MEDIA_VOLUMEN` |
	    
	---
	### Historial de Cambios
	| Versión  | Fecha      | Técnico | Cambios |
	|----------|------------|---------|---------|
	| 01.00.00 | 14.10.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 := 
	            #Media.auxVolumen := 
	            #Media.auxValorMedia := 
	            #Media.Media := 0.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.auxValorMedia := (#Media.Volumen - #Media.auxVolumen) * #Media.ValorActual;
	                #Media.auxVolumen := #Media.Volumen;
	                #Media.auxAcumulado := #Media.auxValorMedia + #Media.auxAcumulado;
	                
	                #Media.Media := #Media.auxAcumulado / #Media.Volumen;
	                
	                #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;
	        
	    END_REGION TOMA_DE_VALORES
	    
	END_REGION GESTION_DISPOSITIVO
	
	
END_FUNCTION

