Primera version

This commit is contained in:
2026-07-14 10:21:52 +02:00
parent 273e2be076
commit 430e3b4db0
222 changed files with 176320 additions and 0 deletions
@@ -0,0 +1,24 @@
DATA_BLOCK "DB11_INF"
TITLE = DB11_INFORMES
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
NON_RETAIN
VAR RETAIN
Gestion { S7_SetPoint := 'False'} : "UDT_ZC_INF_GESTION";
Buffer { S7_SetPoint := 'False'} : Array[0.."N_MAX_INF_BUFFER"] of "UDT_ZC_INF_DATOS";
END_VAR
BEGIN
Gestion.HabilitacionGeneral := TRUE;
Gestion.EstadoConexion := TRUE;
Gestion.OrdenIniciar := FALSE;
Gestion.Etapa := 0;
Gestion.SP_Tiempo := 10;
Gestion.TiempoActual := 0;
Gestion.NumeroMaxIntentos := 3;
END_DATA_BLOCK
@@ -0,0 +1,246 @@
FUNCTION_BLOCK "FB15051_ZC_INF_CPR"
TITLE = FB15051_ZC_INF_CPR
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
VAR_INPUT
GuardarDatos : Bool; // Orden guardar datos
FinGuardarDatos : Bool; // Orden finalizar guardar datos
FechaActual {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // Fecha y hora actual
TipoProceso : Int; // Tipo de proceso
Destino : Int; // Destino
Producto : Int; // Producto
Producto1Destino : Int; // Producto 1 en destino
Producto2Destino : Int; // Producto 2 en destino
Nombre : String[40]; // Nombre
Matricula : String[10]; // Matricula
LetraQ : String[10]; // Letra Q
KilosSP : Real; // Kilos SP
KilosDescargados : Real; // Cantidad
DensidadMedia : LReal; // Densidad Media
TempMediaDescarga : LReal; // Temperatura media en descarga
TempMediaEnfriamiento : LReal; // Temperatura media enfriamiento
EmpujeRealizado : Bool; // Empuje realizado
AclaradoRealizado : Bool; // Aclarado realizado
END_VAR
VAR_OUTPUT
GuardarSQL : Bool;
END_VAR
VAR_IN_OUT
Mux : "UDT_ZC_MUX"; // Variable Mux
Informe : Array[*] of "UDT_ZC_INF_CPR_PROD"; // Informes de compacto
END_VAR
VAR RETAIN
s_OrdenGuardarDatos : Bool; // Orden adquirir datos de informes
s_OrdenGuardarFechaInicio : Bool; // Orden guardar fecha de inicio y dezplazar informes
END_VAR
VAR
s_OrdenGuardarFechaFin : Bool; // Orden guardar fecha de fin
s_OrdenBorrarInforme : Bool; // Orden borrar informe
s_NumeroBorrado : Int; // -1= Todos / Valor= Numero de registro
END_VAR
VAR RETAIN
s_P_Trig_TomarFechaInicio : Bool; // Pulso
s_P_Trig_TomarFechaFin : Bool; // Pulso
END_VAR
VAR_TEMP
for_i : Int; // Variable para bucles FOR
t_dummyInt : Int;
t_IndiceSuperior : Int; // Indice superior del array
t_IndiceInferior : Int; // Indice inferior del array
t_InformeVacio : "UDT_ZC_INF_CPR_PROD";
END_VAR
VAR CONSTANT
ACTUAL : Int := 1;
TIPO_DESCARGA_PARCIAL : Int := 1; // TIPO DE PROCESO DESCARGA PARCIAL
TIPO_DESCARGA_TOTAL : Int := 2; // TIPO DE PROCESO DESCARGA TOTAL
END_VAR
BEGIN
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_FUNCTION_BLOCK
@@ -0,0 +1,236 @@
FUNCTION_BLOCK "FB15052_ZC_INF_PROD_MEM"
TITLE = FB15052_ZC_INF_PROD_MEM
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Bloque de gestion para adquisicion de datos para informe de produccion maquina membranas
VAR_INPUT
OrdenInicioInforme { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Orden inicio informe
OrdenFinInforme : Bool; // Orden fin informe
EnProduccion : Bool; // En produccion
FechaHoraActual {InstructionName := 'DTL'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DTL; // Fecha y hora actual
Producto : Int; // Producto
DestinoConcentrado : Int; // Destino concentrado
DestinoPermeado : Int; // Destino permeado
LitrosEntrada : LReal; // Totalizador litros Entrada
LitrosConcentrado : LReal; // Totalizador litros Concentrado
Brix : LReal; // Media Brix en produccion
Fcv : Real; // Media FCV En produccion
TempEntrada : LReal; // Media temperatura entrada
TempConcentrado : LReal; // Media temperatura concentrado
TempPermeado : LReal; // Media temperatura permeado
TiempoProduccion : "UDT_ZC_CONTADOR_TIEMPO"; // Tiempo Produccion
END_VAR
VAR_IN_OUT
Informe : Array[*] of "UDT_ZC_INF_PROD_MEM";
END_VAR
VAR
s_OrdenInicioInforme { S7_SetPoint := 'True'} : Bool; // Orden inicio informe
s_OrdenFinInforme { S7_SetPoint := 'True'} : Bool; // Orden fin informe
END_VAR
VAR RETAIN
s_oldInicio { S7_SetPoint := 'True'} : Bool; // Estado anterior inicio
s_oldFin { S7_SetPoint := 'True'} : Bool; // Estado anterior fin
END_VAR
VAR
s_OrdenBorrarInforme : Bool; // Orden borrar informe
s_NumeroBorrado : Int; // -1= Todos / Valor= Numero de registro
END_VAR
VAR_TEMP
for_i : Int;
t_dummyInt : Int;
t_IndiceSuperior : Int; // Indice superior del array
t_IndiceInferior : Int; // Indice inferior del array
t_InformeVacio : "UDT_ZC_INF_PROD_MEM";
END_VAR
VAR CONSTANT
ACTUAL : Int := 1;
END_VAR
BEGIN
REGION DESCRIPCION
//=======================================================================
// (C)Copyright ZeusControl 2023 - 2026
//=======================================================================
(*
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
### Descripción Funcional
Bloque de funcion que implementa la gestión de los datos de informe de producción de una máquina de membranas, manteniendo un histórico de hasta `#N_REGISTROS` producciones con todos los datos relevantes del proceso (volúmenes, Brix, FCV, temperaturas, tiempos, destinos y producto) para su trazabilidad y consulta desde el sistema de supervisión.
Funcionalidades principales:
- Detección de flanco ascendente en las órdenes `#OrdenInicioInforme` y `#OrdenFinInforme` mediante las variables estáticas `#s_P_Trig_Inicio` y `#s_P_Trig_Fin`, generando los pulsos internos `#s_OrdenInicioInforme` y `#s_OrdenFinInforme`.
- Inicialización de informe: al recibir `#s_OrdenInicioInforme` se desplazan los informes existentes una posición hacia abajo mediante `MOVE_BLK_VARIANT`, se reinicializan los campos del nuevo informe activo (`#Informe[#ACTUAL]`: fechas, tiempo de producción, destinos, producto, litros, Brix, FCV y temperaturas) y se almacena la fecha/hora de inicio mediante la conversión realizada por `FC15005_ZC_DTL_TO_ZC_FECHA`.
- Datos en curso: mientras `#EnProduccion` está activo, se copian en `#Informe[#ACTUAL]` los valores de proceso en tiempo real: tiempo de producción, destinos de concentrado y permeado, código de producto, litros (entrada, concentrado y permeado por diferencia), Brix, FCV y las tres temperaturas (concentrado, permeado y entrada), aplicando `LREAL_TO_REAL` para adaptar la precisión al tipo de dato del UDT.
- Fin de informe: al detectar `#s_OrdenFinInforme` se registra la fecha/hora de fin en `#Informe[#ACTUAL].FechaFin`.
- Borrado masivo: la entrada `#s_Borrar` permite limpiar completamente todos los registros del array, inicializando fechas, tiempos, litros, Brix, FCV, temperatura de concentrado y código de producto a sus valores neutros. La propia variable de orden se autodesactiva tras la operación.
> **Restricciones:** PLC serie 1200/1500.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | `FC15005_ZC_DTL_TO_ZC_FECHA` |
| FB | - |
| DB | - |
| UDT | `UDT_ZC_CONTADOR_TIEMPO`, `UDT_ZC_INF_PROD_MEM` |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 24.05.2023 | (ABH) | Primera versión. |
| 01.00.01 | 16.02.2024 | (ABH) | Cambios en datos de REAL a LREAL para coincidir con UDT. |
| 01.00.02 | 23.05.2024 | (HCR) | Se añaden temperaturas de entrada, destinos concentrado y destinos permeado. |
| 01.00.03 | 03.07.2026 | (ABH) | Cambio a SCL. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION LIMITES
// 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
RETURN;
END_IF;
END_REGION LIMITES
// ==========================================================================================================
REGION GESTION_ORDENES
// Orden de inicio
#s_OrdenInicioInforme := #OrdenInicioInforme AND NOT #s_oldInicio;
// Orden de fin
#s_OrdenFinInforme := #OrdenFinInforme AND NOT #s_oldFin;
// Estados anteriores
#s_oldInicio := #OrdenInicioInforme;
#s_oldFin := #OrdenFinInforme;
END_REGION GESTION_ORDENES
// ==========================================================================================================
REGION INICIALIZACION
// Con flanco de inicio informe, desplazamos los registros, reinicializamos los datos y almacenamos la fecha y hora de inicio, todo en la poisicion 1
IF #s_OrdenInicioInforme 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);
// Reinicializacion de los datos
#Informe[#ACTUAL] := #t_InformeVacio;
// Guardado de fecha y hora actual
#Informe[#ACTUAL].FechaInicio := "FC15005_ZC_DTL_TO_ZC_FECHA"(FechaDTL := #FechaHoraActual);
END_IF;
END_REGION INICIALIZACION
// ==========================================================================================================
REGION DATOS_DURANTE_PRODUCCION
// Se guardan los datos durante la produccion
IF #EnProduccion THEN
#Informe[#ACTUAL].TiempoProduccion.Hora := #TiempoProduccion.Hora;
#Informe[#ACTUAL].TiempoProduccion.Minuto := #TiempoProduccion.Minuto;
#Informe[#ACTUAL].TiempoProduccion.Segundo := #TiempoProduccion.Segundo;
#Informe[#ACTUAL].DestinoConcentrado := #DestinoConcentrado;
#Informe[#ACTUAL].DestinoPermeado := #DestinoPermeado;
#Informe[#ACTUAL].Producto := #Producto;
#Informe[#ACTUAL].LitrosEntrada := LREAL_TO_REAL(#LitrosEntrada);
#Informe[#ACTUAL].LitrosConcentrado := LREAL_TO_REAL(#LitrosConcentrado);
#Informe[#ACTUAL].LitrosPermeado := LREAL_TO_REAL(#LitrosEntrada - #LitrosConcentrado);
#Informe[#ACTUAL].Brix := LREAL_TO_REAL(#Brix);
#Informe[#ACTUAL].FCV := #Fcv;
#Informe[#ACTUAL].TempConcentrado := LREAL_TO_REAL(#TempConcentrado);
#Informe[#ACTUAL].TempPermeado := LREAL_TO_REAL(#TempPermeado);
#Informe[#ACTUAL].TempEntrada := LREAL_TO_REAL(#TempEntrada);
END_IF;
END_REGION DATOS_DURANTE_PRODUCCION
// ==========================================================================================================
REGION FIN_INFORME
// Se guardan los datos durante la produccion
IF #s_OrdenFinInforme THEN
// Guardado de fecha y hora actual
#Informe[#ACTUAL].FechaFin := "FC15005_ZC_DTL_TO_ZC_FECHA"(FechaDTL := #FechaHoraActual);
END_IF;
END_REGION FIN_INFORME
// ==========================================================================================================
REGION BORRADO_DATOS
// Borrado de todos los registros
IF #s_OrdenBorrarInforme THEN
IF #s_NumeroBorrado = -1 OR #s_NumeroBorrado = 0 THEN
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_DATOS
END_FUNCTION_BLOCK
@@ -0,0 +1,264 @@
FUNCTION_BLOCK "FB15053_ZC_INF_LIMP_MAQ"
TITLE = FB15053_ZC_INF_LIMP_MAQ
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Bloque de gestion para adquisicion de datos para informe de limpieza de maquinas
VAR_INPUT
EnLimpieza : Bool; // En limpieza
LimpBasica1 : Bool; // En limpieza basica 1
LimpAcida : Bool; // En limpieza acida
LimpBasica2 : Bool; // En limpieza basica 2
Pulso1Seg : Bool; // Pulso de 1 segundo
FechaHoraActual {InstructionName := 'DTL'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DTL; // Fecha y hora actual
TempBasica1 : LReal; // Temperatura basica 1
CTLimpBasica1 : LReal; // Conductividad limpieza basica 1
CTEnjBasica1 : LReal; // Conductividad enjuague basica 1
PorcentajeQRefBasica1 : LReal; // Porcentaje Q Referencia basica 1
TempAcida : LReal; // Temperatura acida
CTLimpAcida : LReal; // Conductividad limpieza acida
CTEnjAcida : LReal; // Conductividad enjuague acida
PorcentajeQRefAcida : LReal; // Porcentaje Q Referencia acida
TempBasica2 : LReal; // Temperatura basica 2
CTLimpBasica2 : LReal; // Conductividad limpieza basica 2
CTEnjBasica2 : LReal; // Conductividad enjuague basica 2
PorcentajeQRefBasica2 : LReal; // Porcentaje Q Referencia basica 2
TipoLimpieza : Int; // Tipo de limpieza
TiempoLimpieza : "UDT_ZC_CONTADOR_TIEMPO"; // Tiempo de limpieza
END_VAR
VAR_IN_OUT
Informe : Array[*] of "UDT_ZC_INF_LIMP_MAQ"; // Informe
END_VAR
VAR
s_OrdenInicioInforme { S7_SetPoint := 'True'} : Bool; // Orden inicio informe
s_OrdenFinInforme { S7_SetPoint := 'True'} : Bool; // Orden fin informe
END_VAR
VAR RETAIN
s_oldInicio { S7_SetPoint := 'True'} : Bool; // Estado anterior inicio
s_oldFin { S7_SetPoint := 'True'} : Bool; // Estado anterior fin
END_VAR
VAR
s_OrdenBorrarInforme : Bool; // Orden borrar informe
s_NumeroBorrado : Int; // -1= Todos / Valor= Numero de registro
END_VAR
VAR RETAIN
TiempoRecircBasica1 : Int; // Tiempo en recirculacion basica 1
TiempoRecircAcida : Int; // Tiempo en recirculacion acida
TiempoRecircBasica2 : Int; // Tiempo en recirculacion basica 2
END_VAR
VAR_TEMP
for_i : Int;
t_dummyInt : Int;
t_IndiceSuperior : Int; // Indice superior del array
t_IndiceInferior : Int; // Indice inferior del array
t_InformeVacio : "UDT_ZC_INF_LIMP_MAQ";
END_VAR
VAR CONSTANT
ACTUAL : Int := 1;
END_VAR
BEGIN
REGION DESCRIPCION
//=======================================================================
// (C)Copyright ZeusControl 2025 - 2026
//=======================================================================
(*
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
### Descripción Funcional
Bloque de funcion que implementa la gestión de los datos de informe de limpieza de la máquina, manteniendo un histórico de hasta `#N_REGISTROS` limpiezas con todos los datos relevantes de cada fase (básica 1, ácida y básica 2): tiempo total, tipo de limpieza, temperaturas, conductividades de limpieza y enjuague, porcentaje de caudal de referencia y tiempo de recirculación por etapa. Se utiliza en máquinas de membranas para trazabilidad y consulta desde el sistema de supervisión.
Funcionalidades principales:
- Detección de flanco ascendente y descendente en `#EnLimpieza` mediante las variables estáticas `#s_P_Trig_Inicio` y `#s_P_Trig_Fin`, generando el pulso de inicio `#s_OrdenInicioInforme` y el de fin `#s_OrdenFinInforme`.
- Inicialización del informe: al recibir `#s_OrdenInicioInforme` se desplazan los informes existentes una posición hacia abajo mediante `MOVE_BLK_VARIANT`, se reinicializan a cero los contadores internos de recirculación (`#TiempoRecircBasica1`, `#TiempoRecircAcida`, `#TiempoRecircBasica2`) y los campos del nuevo informe activo (`#Informe[1]`: tipo de limpieza, tiempos de recirculación por fase, tiempo total, temperaturas, conductividades y porcentajes de caudal de referencia de cada fase). Se almacena la fecha/hora de inicio mediante la conversión realizada por `FC15005_ZC_DTL_TO_ZC_FECHA`.
- Datos en curso: mientras `#EnLimpieza` está activo, se incrementan los contadores de tiempo de recirculación de cada fase (`#TiempoRecircBasica1`, `#TiempoRecircAcida`, `#TiempoRecircBasica2`) cuando el pulso de 1 segundo y el flag de fase correspondiente (`#LimpBasica1`, `#LimpAcida`, `#LimpBasica2`) están activos, y se copian en `#Informe[1]` los valores de proceso en tiempo real: tipo de limpieza, tiempo total de limpieza, temperatura, conductividad de limpieza, conductividad de enjuague, porcentaje de caudal de referencia y tiempo de recirculación para cada una de las tres fases.
- Fin de informe: al detectar `#s_OrdenFinInforme` se registra la fecha/hora de fin en `#Informe[1].FechaFin`.
- Borrado masivo: la entrada `#s_Borrar` permite limpiar completamente todos los registros del array, inicializando fechas, tipo de limpieza, tiempos de recirculación, tiempo total, temperaturas, conductividades y porcentajes de caudal de referencia a sus valores neutros. La propia variable de orden se autodesactiva tras la operación.
> **Restricciones:** Ninguna.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | `FC15005_ZC_DTL_TO_ZC_FECHA` |
| FB | - |
| DB | - |
| UDT | `UDT_ZC_CONTADOR_TIEMPO`, `ZC_INF_LIMP_MAQ` |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 10.11.2025 | (CNR) | Primera versión. |
| 01.00.01 | 03.07.2026 | (ABH) | Cambio a SCL. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION LIMITES
// 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
RETURN;
END_IF;
END_REGION LIMITES
// ==========================================================================================================
REGION GESTION_ORDENES
// Orden inicio produccion
#s_OrdenInicioInforme := #EnLimpieza AND NOT #s_oldInicio;
// Orden fin produccion
#s_OrdenFinInforme := NOT #EnLimpieza AND #s_oldFin;
// Estados anteriores
#s_oldInicio := #EnLimpieza;
#s_oldFin := #EnLimpieza;
END_REGION GESTION_ORDENES
// ==========================================================================================================
REGION INICIALIZACION
// Con flanco de inicio informe, desplazamos los registros, reinicializamos los datos y almacenamos la fecha y hora de inicio, todo en la poisicion 1
IF #s_OrdenInicioInforme 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);
// Reinicializacion de los datos
#Informe[#ACTUAL] := #t_InformeVacio;
#TiempoRecircBasica1 := 0;
#TiempoRecircAcida := 0;
#TiempoRecircBasica2 := 0;
// Guardado de fecha y hora actual
#Informe[#ACTUAL].FechaInicio := "FC15005_ZC_DTL_TO_ZC_FECHA"(FechaDTL := #FechaHoraActual);
END_IF;
END_REGION INICIALIZACION
// ==========================================================================================================
REGION DATOS_DURANTE_PRODUCCION
// Se guardan los datos durante la produccion
IF #EnLimpieza THEN
IF #Pulso1Seg AND #LimpBasica1 THEN
#TiempoRecircBasica1 += 1;
END_IF;
IF #Pulso1Seg AND #LimpAcida THEN
#TiempoRecircAcida += 1;
END_IF;
IF #Pulso1Seg AND #LimpBasica2 THEN
#TiempoRecircBasica2 += 1;
END_IF;
#Informe[#ACTUAL].TipoLimpieza := #TipoLimpieza;
#Informe[#ACTUAL].TiempoLimpieza.Hora := #TiempoLimpieza.Hora;
#Informe[#ACTUAL].TiempoLimpieza.Minuto := #TiempoLimpieza.Minuto;
#Informe[#ACTUAL].TiempoLimpieza.Segundo := #TiempoLimpieza.Segundo;
#Informe[#ACTUAL].TempBasica1 := #TempBasica1;
#Informe[#ACTUAL].CTLimpBasica1 := #CTLimpBasica1;
#Informe[#ACTUAL].CTEnjBasica1 := #CTEnjBasica1;
#Informe[#ACTUAL].PorcentajeQRefBasica1 := #PorcentajeQRefBasica1;
#Informe[#ACTUAL].TiempoRecircBasica1 := #TiempoRecircBasica1;
#Informe[#ACTUAL].TempAcida := #TempAcida;
#Informe[#ACTUAL].CTLimpAcida := #CTLimpAcida;
#Informe[#ACTUAL].CTEnjAcida := #CTEnjAcida;
#Informe[#ACTUAL].PorcentajeQRefAcida := #PorcentajeQRefAcida;
#Informe[#ACTUAL].TiempoRecircAcida := #TiempoRecircAcida;
#Informe[#ACTUAL].TempBasica2 := #TempBasica2;
#Informe[#ACTUAL].CTLimpBasica2 := #CTLimpBasica2;
#Informe[#ACTUAL].CTEnjBasica2 := #CTEnjBasica2;
#Informe[#ACTUAL].PorcentajeQRefBasica2 := #PorcentajeQRefBasica2;
#Informe[#ACTUAL].TiempoRecircBasica2 := #TiempoRecircBasica2;
END_IF;
END_REGION DATOS_DURANTE_PRODUCCION
// ==========================================================================================================
REGION FIN_INFORME
// Se guardan los datos durante la produccion
IF #s_OrdenFinInforme THEN
// Guardado de fecha y hora actual
#Informe[#ACTUAL].FechaFin := "FC15005_ZC_DTL_TO_ZC_FECHA"(FechaDTL := #FechaHoraActual);
END_IF;
END_REGION FIN_INFORME
// ==========================================================================================================
REGION BORRADO_DATOS
// Borrado de todos los registros
IF #s_OrdenBorrarInforme THEN
IF #s_NumeroBorrado = -1 OR #s_NumeroBorrado = 0 THEN
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_DATOS
END_FUNCTION_BLOCK
@@ -0,0 +1,477 @@
FUNCTION "FC11_ZC_INF_GESTOR" : Void
TITLE = FC11_ZC_GESTOR_INFORMES
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion para gestion de informes
VAR_INPUT
Pulso1Seg : Bool; // Pulso de 1 segundo
END_VAR
VAR_TEMP
for_i : Int; // Variable para bucles FOR
t_PosicionRegistro : Int; // Posicion del registro encontrado en el buffer
t_RegistroEncontrado : Bool; // Indicador de registro encontrado
t_RetVal : Int; // Variable para su uso en programa
END_VAR
VAR CONSTANT
REPOSO : Int := 0; // Etapa reposo
ESPERA_ENTRE_AVISOS : Int := 10; // Etapa espera entre avisos
LANZAR_AVISO : Int := 20; // Etapa lanzar aviso
ESPERA_CONFIRMACION : Int := 30; // Etapa espera confirmacion
FALLO : Int := 40; // Etapa fallo
BORRAR_DATOS : Int := 50; // Etapa borrar datos
END_VAR
BEGIN
REGION DESCRIPCION
(*
###### (C)Copyright ZeusControl 2024 - 2024
---
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
> **Restricciones:** Ninguna.
---
### Descripción Funcional
Función para la gestión e interfaz de escritura de informes hacia el sistema SCADA/HMI mediante una máquina de estados y la lectura de un buffer.
Las tareas que realiza son las siguientes:
- Extracción de datos del buffer: Búsqueda inversa del registro más antiguo pendiente de envío evaluando la condición `Registrar` = 1 mediante un bucle `FOR`.
- Transferencia del registro a la estructura estática `Gestion.Datos` y generación de un `Id` único basado en la fecha y hora actual.
- Limpieza inmediata de todas las variables (Booleanos, Reales, Enteros, Fechas y Strings) en la posición original del buffer.
- Ejecución de la etapa **REPOSO**: Activación de la secuencia ante la orden `OrdenIniciar`, siempre que se detecte conexión con el SCADA y la habilitación general esté activa.
- Ejecución de la etapa **ESPERA_ENTRE_AVISOS**: Temporización basada en pulsos de 1 segundo (`Pulso1Seg`) antes de un reintento. Deriva a fallo si se supera el máximo de intentos.
- Ejecución de la etapa **LANZAR_AVISO**: Activación de la señal `Aviso.Registrar` hacia el SCADA y paso a espera tras cumplirse el tiempo parametrizado.
- Ejecución de la etapa **ESPERA_CONFIRMACION**: Monitoreo de la respuesta del sistema superior. Si `Aviso.Estado` es igual a 4, el envío es exitoso. Si hay error (estado 12) o agotamiento de tiempo, se incrementa el contador de intentos y se repite el ciclo.
- Ejecución de la etapa **FALLO**: Generación de una traza de sistema (`TRZ_CAT_1_SYS`) registrando el código de error `TRZ_SYS_INF_ERR` ante la imposibilidad de entrega del informe.
- Ejecución de la etapa **BORRAR_DATOS**: Reseteo íntegro de la estructura `Gestion.Datos` para preparar el sistema para el próximo ciclo de comunicación y retorno al estado de reposo.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | - |
| FB | - |
| DB | - |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 30.07.2024 | (ABH) | Primera version. |
| 01.00.01 | 11.09.2024 | (ABH) | Se añade la generacion de ID con fecha y hora en el momento del guardar en SQL. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION GESTION_INFORMES
// =============================================================================
// COPIAMOS EL ULTIMO REGISTRO (El mas antiguo) A LA VARIABLE REGISTRO QUE ES LA
// ENCARGADA DE COMUNICARLA CON EL SCADA/HMI
IF "DB11_INF".Gestion.HabilitacionGeneral AND "DB11_INF".Gestion.Datos.Registrar = 0 AND #Pulso1Seg THEN
// =============================================================================
// Buscamos el ultimo registro
FOR #for_i := "N_MAX_INF_BUFFER" TO 0 BY -1 DO
// =============================================================================
// Registro encontrado
IF "DB11_INF".Buffer[#for_i].Registrar = 1 THEN
#t_PosicionRegistro := #for_i;
#t_RegistroEncontrado := TRUE;
EXIT;
END_IF;
END_FOR;
// =============================================================================
// Si hemos encontrado el registro, copiamos a variable estatica
IF #t_RegistroEncontrado THEN
// =============================================================================
// Copiamos el los datos de la traza a variable estatica para tratarla
"DB11_INF".Gestion.Datos := "DB11_INF".Buffer[#t_PosicionRegistro];
"DB11_INF".Gestion.Datos.Id := "FC15006_ZC_DTL_TO_STRING"(FechaDTL := "DB1_SYS".FechaHoraActual, Formato := 3);
// =============================================================================
// Quitamos el registro del buffer
"DB11_INF".Buffer[#t_PosicionRegistro].Registrar := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Id := '';
"DB11_INF".Buffer[#t_PosicionRegistro].Tipo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Codigo := '';
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Ano := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Mes := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Dia := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.DiaSemana := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Hora := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Minuto := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.Segundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_1.NanoSegundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Ano := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Mes := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Dia := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.DiaSemana := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Hora := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Minuto := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.Segundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_2.NanoSegundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Ano := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Mes := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Dia := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.DiaSemana := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Hora := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Minuto := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.Segundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Fecha_3.NanoSegundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_1 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_2 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_3 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_4 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_5 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_6 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_7 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_8 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_9 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_10 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_11 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_12 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_13 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_14 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_15 := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_1 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_2 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_3 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_4 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_5 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_6 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_7 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_8 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_9 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_10 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_11 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_12 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_13 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_14 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_15 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_16 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_17 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_18 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_19 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_20 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_21 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_22 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_23 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_24 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_25 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_26 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_27 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_28 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_29 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_30 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_31 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Bool_32 := FALSE;
"DB11_INF".Buffer[#t_PosicionRegistro].Real_1 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_2 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_3 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_4 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_5 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_6 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_7 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_8 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_9 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_10 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_11 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_12 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_13 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_14 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_15 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_16 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_17 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_18 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_19 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Real_20 := 0.0;
"DB11_INF".Buffer[#t_PosicionRegistro].Int_1 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_2 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_3 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_4 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_5 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_6 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_7 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_8 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_9 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_10 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_11 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_12 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_13 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_14 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_15 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_16 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_17 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_18 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_19 :=
"DB11_INF".Buffer[#t_PosicionRegistro].Int_20 := 0;
END_IF;
END_IF;
// =============================================================================
// Si existe registro a trazar, lanzamos la orden de iniciar la secuencia
IF "DB11_INF".Gestion.Datos.Registrar = 1 AND "DB11_INF".Gestion.Etapa = #REPOSO AND "DB11_INF".Gestion.EstadoConexion THEN
// Lanzamos la orden de iniciar la secuencia de registro
"DB11_INF".Gestion.OrdenIniciar := TRUE;
END_IF;
END_REGION
// ==========================================================================================================
REGION SECUENCIA_INFORME
IF NOT "DB11_INF".Gestion.HabilitacionGeneral AND "DB11_INF".Gestion.Etapa <> #REPOSO THEN
"DB11_INF".Gestion.Etapa := #BORRAR_DATOS;
END_IF;
CASE "DB11_INF".Gestion.Etapa OF
// =============================================================================
#REPOSO:
IF "DB11_INF".Gestion.OrdenIniciar THEN
"DB11_INF".Gestion.Etapa := #LANZAR_AVISO;
"DB11_INF".Gestion.OrdenIniciar := FALSE;
"DB11_INF".Gestion.Aviso.Registrar := 0;
"DB11_INF".Gestion.TiempoActual := 0;
"DB11_INF".Gestion.Aviso.NumeroIntentosActual := 0;
END_IF;
// =============================================================================
#ESPERA_ENTRE_AVISOS:
// Contador de tiempo de etapa
IF #Pulso1Seg THEN
"DB11_INF".Gestion.TiempoActual += 1;
END_IF;
// Tiempo maximo de espera
IF ("DB11_INF".Gestion.TiempoActual >= "DB11_INF".Gestion.SP_Tiempo) THEN
"DB11_INF".Gestion.TiempoActual := 0;
"DB11_INF".Gestion.Etapa := #LANZAR_AVISO;
END_IF;
// Si ya se ha alcanzado el numero maximo de intentos, generamos la traza
IF "DB11_INF".Gestion.Aviso.NumeroIntentosActual >= "DB11_INF".Gestion.NumeroMaxIntentos THEN
"DB11_INF".Gestion.Etapa := #FALLO;
"DB11_INF".Gestion.Aviso.Registrar := 0;
END_IF;
// =============================================================================
#LANZAR_AVISO:
IF #Pulso1Seg THEN
"DB11_INF".Gestion.TiempoActual += 1;
END_IF;
"DB11_INF".Gestion.Aviso.Registrar := TRUE;
IF ("DB11_INF".Gestion.TiempoActual >= "DB11_INF".Gestion.SP_Tiempo) THEN
"DB11_INF".Gestion.Etapa := #ESPERA_CONFIRMACION;
END_IF;
// =============================================================================
#ESPERA_CONFIRMACION:
IF #Pulso1Seg THEN
"DB11_INF".Gestion.TiempoActual += 1;
END_IF;
// Confirmacion desde SCADA OK
IF "DB11_INF".Gestion.Aviso.Estado = 4 THEN
"DB11_INF".Gestion.TiempoActual := 0;
"DB11_INF".Gestion.Aviso.Estado := 0;
"DB11_INF".Gestion.Aviso.Registrar := FALSE;
"DB11_INF".Gestion.Etapa := #BORRAR_DATOS;
END_IF;
// Tiempo maximo de espera
IF ("DB11_INF".Gestion.TiempoActual >= "DB11_INF".Gestion.SP_Tiempo)
OR
("DB11_INF".Gestion.Aviso.Estado = 12)
THEN
"DB11_INF".Gestion.TiempoActual := 0;
"DB11_INF".Gestion.Aviso.Estado := 0;
"DB11_INF".Gestion.Aviso.Registrar := FALSE;
"DB11_INF".Gestion.Etapa := #ESPERA_ENTRE_AVISOS;
"DB11_INF".Gestion.Aviso.NumeroIntentosActual += 1;
END_IF;
// =============================================================================
#BORRAR_DATOS:
"DB11_INF".Gestion.Datos.Registrar := 0;
"DB11_INF".Gestion.Datos.Id := '';
"DB11_INF".Gestion.Datos.Tipo := 0;
"DB11_INF".Gestion.Datos.Codigo := '';
"DB11_INF".Gestion.Datos.Fecha_1.Ano := 0;
"DB11_INF".Gestion.Datos.Fecha_1.Mes := 0;
"DB11_INF".Gestion.Datos.Fecha_1.Dia := 0;
"DB11_INF".Gestion.Datos.Fecha_1.DiaSemana := 0;
"DB11_INF".Gestion.Datos.Fecha_1.Hora := 0;
"DB11_INF".Gestion.Datos.Fecha_1.Minuto := 0;
"DB11_INF".Gestion.Datos.Fecha_1.Segundo := 0;
"DB11_INF".Gestion.Datos.Fecha_1.NanoSegundo := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Ano := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Mes := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Dia := 0;
"DB11_INF".Gestion.Datos.Fecha_2.DiaSemana := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Hora := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Minuto := 0;
"DB11_INF".Gestion.Datos.Fecha_2.Segundo := 0;
"DB11_INF".Gestion.Datos.Fecha_2.NanoSegundo := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Ano := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Mes := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Dia := 0;
"DB11_INF".Gestion.Datos.Fecha_3.DiaSemana := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Hora := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Minuto := 0;
"DB11_INF".Gestion.Datos.Fecha_3.Segundo := 0;
"DB11_INF".Gestion.Datos.Fecha_3.NanoSegundo := 0;
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_1 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_2 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_3 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_4 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_5 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_6 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_7 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_8 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_9 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_10 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_11 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_12 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_13 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_14 :=
"DB11_INF".Buffer[#t_PosicionRegistro].CodString_15 := 0;
"DB11_INF".Gestion.Datos.Bool_1 :=
"DB11_INF".Gestion.Datos.Bool_2 :=
"DB11_INF".Gestion.Datos.Bool_3 :=
"DB11_INF".Gestion.Datos.Bool_4 :=
"DB11_INF".Gestion.Datos.Bool_5 :=
"DB11_INF".Gestion.Datos.Bool_6 :=
"DB11_INF".Gestion.Datos.Bool_7 :=
"DB11_INF".Gestion.Datos.Bool_8 :=
"DB11_INF".Gestion.Datos.Bool_9 :=
"DB11_INF".Gestion.Datos.Bool_10 :=
"DB11_INF".Gestion.Datos.Bool_11 :=
"DB11_INF".Gestion.Datos.Bool_12 :=
"DB11_INF".Gestion.Datos.Bool_13 :=
"DB11_INF".Gestion.Datos.Bool_14 :=
"DB11_INF".Gestion.Datos.Bool_15 :=
"DB11_INF".Gestion.Datos.Bool_16 :=
"DB11_INF".Gestion.Datos.Bool_17 :=
"DB11_INF".Gestion.Datos.Bool_18 :=
"DB11_INF".Gestion.Datos.Bool_19 :=
"DB11_INF".Gestion.Datos.Bool_20 :=
"DB11_INF".Gestion.Datos.Bool_21 :=
"DB11_INF".Gestion.Datos.Bool_22 :=
"DB11_INF".Gestion.Datos.Bool_23 :=
"DB11_INF".Gestion.Datos.Bool_24 :=
"DB11_INF".Gestion.Datos.Bool_25 :=
"DB11_INF".Gestion.Datos.Bool_26 :=
"DB11_INF".Gestion.Datos.Bool_27 :=
"DB11_INF".Gestion.Datos.Bool_28 :=
"DB11_INF".Gestion.Datos.Bool_29 :=
"DB11_INF".Gestion.Datos.Bool_30 :=
"DB11_INF".Gestion.Datos.Bool_31 :=
"DB11_INF".Gestion.Datos.Bool_32 := FALSE;
"DB11_INF".Gestion.Datos.Real_1 :=
"DB11_INF".Gestion.Datos.Real_2 :=
"DB11_INF".Gestion.Datos.Real_3 :=
"DB11_INF".Gestion.Datos.Real_4 :=
"DB11_INF".Gestion.Datos.Real_5 :=
"DB11_INF".Gestion.Datos.Real_6 :=
"DB11_INF".Gestion.Datos.Real_7 :=
"DB11_INF".Gestion.Datos.Real_8 :=
"DB11_INF".Gestion.Datos.Real_9 :=
"DB11_INF".Gestion.Datos.Real_10 :=
"DB11_INF".Gestion.Datos.Real_11 :=
"DB11_INF".Gestion.Datos.Real_12 :=
"DB11_INF".Gestion.Datos.Real_13 :=
"DB11_INF".Gestion.Datos.Real_14 :=
"DB11_INF".Gestion.Datos.Real_15 :=
"DB11_INF".Gestion.Datos.Real_16 :=
"DB11_INF".Gestion.Datos.Real_17 :=
"DB11_INF".Gestion.Datos.Real_18 :=
"DB11_INF".Gestion.Datos.Real_19 :=
"DB11_INF".Gestion.Datos.Real_20 := 0.0;
"DB11_INF".Gestion.Datos.Int_1 :=
"DB11_INF".Gestion.Datos.Int_2 :=
"DB11_INF".Gestion.Datos.Int_3 :=
"DB11_INF".Gestion.Datos.Int_4 :=
"DB11_INF".Gestion.Datos.Int_5 :=
"DB11_INF".Gestion.Datos.Int_6 :=
"DB11_INF".Gestion.Datos.Int_7 :=
"DB11_INF".Gestion.Datos.Int_8 :=
"DB11_INF".Gestion.Datos.Int_9 :=
"DB11_INF".Gestion.Datos.Int_10 :=
"DB11_INF".Gestion.Datos.Int_11 :=
"DB11_INF".Gestion.Datos.Int_12 :=
"DB11_INF".Gestion.Datos.Int_13 :=
"DB11_INF".Gestion.Datos.Int_14 :=
"DB11_INF".Gestion.Datos.Int_15 :=
"DB11_INF".Gestion.Datos.Int_16 :=
"DB11_INF".Gestion.Datos.Int_17 :=
"DB11_INF".Gestion.Datos.Int_18 :=
"DB11_INF".Gestion.Datos.Int_19 :=
"DB11_INF".Gestion.Datos.Int_20 := 0;
"DB11_INF".Gestion.Aviso.Registrar := 0;
"DB11_INF".Gestion.Etapa := #REPOSO;
// =============================================================================
#FALLO:
"FC8_ZC_TRZ_REGISTRO"(FechaHora := "DB1_SYS".FechaHoraActual,
Registrar := 1,
Categoria := "TRZ_CAT_1_SYS",
User := '',
CodInt_1 := "TRZ_SYS_INF_ERR",
CodInt_2 := 0,
CodInt_3 := 0,
CodInt_4 := 0,
CodInt_5 := 0,
CodReal_1 := 0.0,
CodReal_2 := 0.0);
"DB11_INF".Gestion.Datos.Registrar := 0;
"DB11_INF".Gestion.Etapa := #REPOSO;
END_CASE;
END_REGION
END_FUNCTION
@@ -0,0 +1,365 @@
FUNCTION "FC12_ZC_INF_REGISTRO" : Void
TITLE = FC12_ZC_INFORME_REGISTRO
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Funcion para almacenar una traza en el buffer de informes
VAR_INPUT
Registrar : USInt; // Orden registrar (0= no registrar / 1= registrar)
Tipo : Int; // Tipo
Codigo : String; // Codigo produccion
Fecha_1_Ano : UInt; // Fecha 1 Año
Fecha_1_Mes : USInt; // Fecha 1 Mes
Fecha_1_Dia : USInt; // Fecha 1 Dia
Fecha_1_DiaSemana : USInt; // Fecha 1 Dia de la semana
Fecha_1_Hora : USInt; // Fecha 1 Hora
Fecha_1_Minuto : USInt; // Fecha 1 Minuto
Fecha_1_Segundo : USInt; // Fecha 1 Segundo
Fecha_1_NanoSegundo : UDInt; // Fecha 1 Nanosegundo
Fecha_2_Ano : UInt; // Fecha 2 Año
Fecha_2_Mes : USInt; // Fecha 2 Mes
Fecha_2_Dia : USInt; // Fecha 2 Dia
Fecha_2_DiaSemana : USInt; // Fecha 2 Dia de la semana
Fecha_2_Hora : USInt; // Fecha 2 Hora
Fecha_2_Minuto : USInt; // Fecha 2 Minuto
Fecha_2_Segundo : USInt; // Fecha 2 Segundo
Fecha_2_NanoSegundo : UDInt; // Fecha 2 Nanosegundo
Fecha_3_Ano : UInt; // Fecha 3 Año
Fecha_3_Mes : USInt; // Fecha 3 Mes
Fecha_3_Dia : USInt; // Fecha 3 Dia
Fecha_3_DiaSemana : USInt; // Fecha 3 Dia de la semana
Fecha_3_Hora : USInt; // Fecha 3 Hora
Fecha_3_Minuto : USInt; // Fecha 3 Minuto
Fecha_3_Segundo : USInt; // Fecha 3 Segundo
Fecha_3_NanoSegundo : UDInt; // Fecha 3 Nanosegundo
Fecha_4_Ano : UInt; // Fecha 4 Año
Fecha_4_Mes : USInt; // Fecha 4 Mes
Fecha_4_Dia : USInt; // Fecha 4 Dia
Fecha_4_DiaSemana : USInt; // Fecha 4 Dia de la semana
Fecha_4_Hora : USInt; // Fecha 4 Hora
Fecha_4_Minuto : USInt; // Fecha 4 Minuto
Fecha_4_Segundo : USInt; // Fecha 4 Segundo
Fecha_4_NanoSegundo : UDInt; // Fecha 4 Nanosegundo
CodString_1 : Int; // Codigo string 1
CodString_2 : Int; // Codigo string 2
CodString_3 : Int; // Codigo string 3
CodString_4 : Int; // Codigo string 4
CodString_5 : Int; // Codigo string 5
CodString_6 : Int; // Codigo string 6
CodString_7 : Int; // Codigo string 7
CodString_8 : Int; // Codigo string 8
CodString_9 : Int; // Codigo string 9
CodString_10 : Int; // Codigo string 10
CodString_11 : Int; // Codigo string 11
CodString_12 : Int; // Codigo string 12
CodString_13 : Int; // Codigo string 13
CodString_14 : Int; // Codigo string 14
CodString_15 : Int; // Codigo string 15
Bool_1 : Bool; // Valor booleano 1
Bool_2 : Bool; // Valor booleano 2
Bool_3 : Bool; // Valor booleano 3
Bool_4 : Bool; // Valor booleano 4
Bool_5 : Bool; // Valor booleano 5
Bool_6 : Bool; // Valor booleano 6
Bool_7 : Bool; // Valor booleano 7
Bool_8 : Bool; // Valor booleano 8
Bool_9 : Bool; // Valor booleano 9
Bool_10 : Bool; // Valor booleano 10
Bool_11 : Bool; // Valor booleano 11
Bool_12 : Bool; // Valor booleano 12
Bool_13 : Bool; // Valor booleano 13
Bool_14 : Bool; // Valor booleano 14
Bool_15 : Bool; // Valor booleano 15
Bool_16 : Bool; // Valor booleano 16
Bool_17 : Bool; // Valor booleano 17
Bool_18 : Bool; // Valor booleano 18
Bool_19 : Bool; // Valor booleano 19
Bool_20 : Bool; // Valor booleano 20
Bool_21 : Bool; // Valor booleano 21
Bool_22 : Bool; // Valor booleano 22
Bool_23 : Bool; // Valor booleano 23
Bool_24 : Bool; // Valor booleano 24
Bool_25 : Bool; // Valor booleano 25
Bool_26 : Bool; // Valor booleano 26
Bool_27 : Bool; // Valor booleano 27
Bool_28 : Bool; // Valor booleano 28
Bool_29 : Bool; // Valor booleano 29
Bool_30 : Bool; // Valor booleano 30
Bool_31 : Bool; // Valor booleano 31
Bool_32 : Bool; // Valor booleano 32
Real_1 : Real; // Valor real 1
Real_2 : Real; // Valor real 2
Real_3 : Real; // Valor real 3
Real_4 : Real; // Valor real 4
Real_5 : Real; // Valor real 5
Real_6 : Real; // Valor real 6
Real_7 : Real; // Valor real 7
Real_8 : Real; // Valor real 8
Real_9 : Real; // Valor real 9
Real_10 : Real; // Valor real 10
Real_11 : Real; // Valor real 11
Real_12 : Real; // Valor real 12
Real_13 : Real; // Valor real 13
Real_14 : Real; // Valor real 14
Real_15 : Real; // Valor real 15
Real_16 : Real; // Valor real 16
Real_17 : Real; // Valor real 17
Real_18 : Real; // Valor real 18
Real_19 : Real; // Valor real 19
Real_20 : Real; // Valor real 20
Int_1 : Int; // Valor entero 1
Int_2 : Int; // Valor entero 2
Int_3 : Int; // Valor entero 3
Int_4 : Int; // Valor entero 4
Int_5 : Int; // Valor entero 5
Int_6 : Int; // Valor entero 6
Int_7 : Int; // Valor entero 7
Int_8 : Int; // Valor entero 8
Int_9 : Int; // Valor entero 9
Int_10 : Int; // Valor entero 10
Int_11 : Int; // Valor entero 11
Int_12 : Int; // Valor entero 12
Int_13 : Int; // Valor entero 13
Int_14 : Int; // Valor entero 14
Int_15 : Int; // Valor entero 15
Int_16 : Int; // Valor entero 16
Int_17 : Int; // Valor entero 17
Int_18 : Int; // Valor entero 18
Int_19 : Int; // Valor entero 19
Int_20 : Int; // Valor entero 20
END_VAR
VAR_TEMP
t_dummy : Int;
t_fecha_vacia {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL;
END_VAR
BEGIN
REGION DESCRIPCION
(*
###### (C)Copyright ZeusControl 2024 - 2026
---
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
> **Restricciones:** Ninguna.
---
### Descripción Funcional
Función para el almacenamiento y estructuración masiva de registros de trazabilidad dentro del buffer de informes del sistema.
En ella se realizan las siguientes acciones:
- Comprobación de habilitación: Verificación de la variable de permiso `HabilitacionGeneral`; si no se encuentra activa, se omite la ejecución del bloque mediante un retorno anticipado.
- Desplazamiento de datos (FIFO):
- Ejecución de la instrucción de bloque para desplazar todos los registros existentes en el Buffer una posición hacia abajo.
- Liberación del índice 0 del array para permitir la inserción del nuevo registro sin sobrescribir el histórico reciente.
- Gestión e inserción del nuevo registro:
- Generación y asignación de un identificador único (Id) transformando la fecha y hora actual del sistema a formato cadena.
- Escritura de los metadatos de control y catalogación (Registrar, Tipo, Codigo) en la primera posición del buffer.
- Procesamiento y validación de hasta 4 marcas de tiempo dinámicas (Fecha_1 a Fecha_4), forzando una fecha por defecto (01/01/1970) si el año recibido es 0.
- Mapeo y transferencia masiva de todas las variables de proceso vinculadas al evento, incluyendo cadenas de texto (CodString_1 a 15), booleanos (Bool_1 a 32), reales (Real_1 a 20) y enteros (Int_1 a 20).
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | - |
| FB | - |
| DB | - |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.01 | 30.07.2024 | (ABH) | Primera version. |
| 01.00.02 | 11.09.2024 | (ABH) | Se elimina la generacion de ID, para que lo genere el gestor. |
| 01.00.03 | 06.11.2025 | (ABH) | Fix escritura de hora si año seleccionado es 0. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION COMPROBACION_HABILITACION
// Si no esta habilitado los informes, salimos de la funcion.
IF NOT "DB11_INF".Gestion.HabilitacionGeneral THEN
RETURN;
END_IF;
END_REGION COMPROBACION_HABILITACION
// ==========================================================================================================
REGION DESPLAZAMIENTO_DE_DATOS
// Desplazamos los datos del buffer una posicion hacia abajo
#t_dummy := MOVE_BLK_VARIANT(SRC := "DB11_INF".Buffer, COUNT := INT_TO_UDINT(("N_MAX_INF_BUFFER")), SRC_INDEX := 0, DEST_INDEX := 1, DEST => "DB11_INF".Buffer);
END_REGION DESPLAZAMIENTO_DE_DATOS
// ==========================================================================================================
REGION GESTION_REGISTRO_INFORME
// Grabamos el nuevo registro
"DB11_INF".Buffer[0].Registrar := #Registrar;
"DB11_INF".Buffer[0].Id := "FC15006_ZC_DTL_TO_STRING"(FechaDTL := "DB1_SYS".FechaHoraActual, Formato := 3);
"DB11_INF".Buffer[0].Tipo := #Tipo;
"DB11_INF".Buffer[0].Codigo := #Codigo;
IF #Fecha_1_Ano = 0 THEN
"DB11_INF".Buffer[0].Fecha_1.Ano := 1970;
"DB11_INF".Buffer[0].Fecha_1.Mes := 1;
"DB11_INF".Buffer[0].Fecha_1.Dia := 1;
"DB11_INF".Buffer[0].Fecha_1.DiaSemana := 5;
ELSE
"DB11_INF".Buffer[0].Fecha_1.Ano := #Fecha_1_Ano;
"DB11_INF".Buffer[0].Fecha_1.Mes := #Fecha_1_Mes;
"DB11_INF".Buffer[0].Fecha_1.Dia := #Fecha_1_Dia;
"DB11_INF".Buffer[0].Fecha_1.DiaSemana := #Fecha_1_DiaSemana;
END_IF;
"DB11_INF".Buffer[0].Fecha_1.Hora := #Fecha_1_Hora;
"DB11_INF".Buffer[0].Fecha_1.Minuto := #Fecha_1_Minuto;
"DB11_INF".Buffer[0].Fecha_1.Segundo := #Fecha_1_Segundo;
"DB11_INF".Buffer[0].Fecha_1.NanoSegundo := #Fecha_1_NanoSegundo;
IF #Fecha_2_Ano = 0 THEN
"DB11_INF".Buffer[0].Fecha_2.Ano := 1970;
"DB11_INF".Buffer[0].Fecha_2.Mes := 1;
"DB11_INF".Buffer[0].Fecha_2.Dia := 1;
"DB11_INF".Buffer[0].Fecha_2.DiaSemana := 5;
ELSE
"DB11_INF".Buffer[0].Fecha_2.Ano := #Fecha_2_Ano;
"DB11_INF".Buffer[0].Fecha_2.Mes := #Fecha_2_Mes;
"DB11_INF".Buffer[0].Fecha_2.Dia := #Fecha_2_Dia;
"DB11_INF".Buffer[0].Fecha_2.DiaSemana := #Fecha_2_DiaSemana;
END_IF;
"DB11_INF".Buffer[0].Fecha_2.Hora := #Fecha_2_Hora;
"DB11_INF".Buffer[0].Fecha_2.Minuto := #Fecha_2_Minuto;
"DB11_INF".Buffer[0].Fecha_2.Segundo := #Fecha_2_Segundo;
"DB11_INF".Buffer[0].Fecha_2.NanoSegundo := #Fecha_2_NanoSegundo;
IF #Fecha_3_Ano = 0 THEN
"DB11_INF".Buffer[0].Fecha_3.Ano := 1970;
"DB11_INF".Buffer[0].Fecha_3.Mes := 1;
"DB11_INF".Buffer[0].Fecha_3.Dia := 1;
"DB11_INF".Buffer[0].Fecha_3.DiaSemana := 5;
ELSE
"DB11_INF".Buffer[0].Fecha_3.Ano := #Fecha_3_Ano;
"DB11_INF".Buffer[0].Fecha_3.Mes := #Fecha_3_Mes;
"DB11_INF".Buffer[0].Fecha_3.Dia := #Fecha_3_Dia;
"DB11_INF".Buffer[0].Fecha_3.DiaSemana := #Fecha_3_DiaSemana;
END_IF;
IF #Fecha_4_Ano = 0 THEN
"DB11_INF".Buffer[0].Fecha_4.Ano := 1970;
"DB11_INF".Buffer[0].Fecha_4.Mes := 1;
"DB11_INF".Buffer[0].Fecha_4.Dia := 1;
"DB11_INF".Buffer[0].Fecha_4.DiaSemana := 5;
ELSE
"DB11_INF".Buffer[0].Fecha_4.Ano := #Fecha_4_Ano;
"DB11_INF".Buffer[0].Fecha_4.Mes := #Fecha_4_Mes;
"DB11_INF".Buffer[0].Fecha_4.Dia := #Fecha_4_Dia;
"DB11_INF".Buffer[0].Fecha_4.DiaSemana := #Fecha_4_DiaSemana;
END_IF;
"DB11_INF".Buffer[0].Fecha_3.Hora := #Fecha_3_Hora;
"DB11_INF".Buffer[0].Fecha_3.Minuto := #Fecha_3_Minuto;
"DB11_INF".Buffer[0].Fecha_3.Segundo := #Fecha_3_Segundo;
"DB11_INF".Buffer[0].Fecha_3.NanoSegundo := #Fecha_3_NanoSegundo;
"DB11_INF".Buffer[0].CodString_1 := #CodString_1;
"DB11_INF".Buffer[0].CodString_2 := #CodString_2;
"DB11_INF".Buffer[0].CodString_3 := #CodString_3;
"DB11_INF".Buffer[0].CodString_4 := #CodString_4;
"DB11_INF".Buffer[0].CodString_5 := #CodString_5;
"DB11_INF".Buffer[0].CodString_6 := #CodString_6;
"DB11_INF".Buffer[0].CodString_7 := #CodString_7;
"DB11_INF".Buffer[0].CodString_8 := #CodString_8;
"DB11_INF".Buffer[0].CodString_9 := #CodString_9;
"DB11_INF".Buffer[0].CodString_10 := #CodString_10;
"DB11_INF".Buffer[0].CodString_11 := #CodString_11;
"DB11_INF".Buffer[0].CodString_12 := #CodString_12;
"DB11_INF".Buffer[0].CodString_13 := #CodString_13;
"DB11_INF".Buffer[0].CodString_14 := #CodString_14;
"DB11_INF".Buffer[0].CodString_15 := #CodString_15;
"DB11_INF".Buffer[0].Bool_1 := #Bool_1;
"DB11_INF".Buffer[0].Bool_2 := #Bool_2;
"DB11_INF".Buffer[0].Bool_3 := #Bool_3;
"DB11_INF".Buffer[0].Bool_4 := #Bool_4;
"DB11_INF".Buffer[0].Bool_5 := #Bool_5;
"DB11_INF".Buffer[0].Bool_6 := #Bool_6;
"DB11_INF".Buffer[0].Bool_7 := #Bool_7;
"DB11_INF".Buffer[0].Bool_8 := #Bool_8;
"DB11_INF".Buffer[0].Bool_9 := #Bool_9;
"DB11_INF".Buffer[0].Bool_10 := #Bool_10;
"DB11_INF".Buffer[0].Bool_11 := #Bool_11;
"DB11_INF".Buffer[0].Bool_12 := #Bool_12;
"DB11_INF".Buffer[0].Bool_13 := #Bool_13;
"DB11_INF".Buffer[0].Bool_14 := #Bool_14;
"DB11_INF".Buffer[0].Bool_15 := #Bool_15;
"DB11_INF".Buffer[0].Bool_16 := #Bool_16;
"DB11_INF".Buffer[0].Bool_17 := #Bool_17;
"DB11_INF".Buffer[0].Bool_18 := #Bool_18;
"DB11_INF".Buffer[0].Bool_19 := #Bool_19;
"DB11_INF".Buffer[0].Bool_20 := #Bool_20;
"DB11_INF".Buffer[0].Bool_21 := #Bool_21;
"DB11_INF".Buffer[0].Bool_22 := #Bool_22;
"DB11_INF".Buffer[0].Bool_23 := #Bool_23;
"DB11_INF".Buffer[0].Bool_24 := #Bool_24;
"DB11_INF".Buffer[0].Bool_25 := #Bool_25;
"DB11_INF".Buffer[0].Bool_26 := #Bool_26;
"DB11_INF".Buffer[0].Bool_27 := #Bool_27;
"DB11_INF".Buffer[0].Bool_28 := #Bool_28;
"DB11_INF".Buffer[0].Bool_29 := #Bool_29;
"DB11_INF".Buffer[0].Bool_30 := #Bool_30;
"DB11_INF".Buffer[0].Bool_31 := #Bool_31;
"DB11_INF".Buffer[0].Bool_32 := #Bool_32;
"DB11_INF".Buffer[0].Real_1 := #Real_1;
"DB11_INF".Buffer[0].Real_2 := #Real_2;
"DB11_INF".Buffer[0].Real_3 := #Real_3;
"DB11_INF".Buffer[0].Real_4 := #Real_4;
"DB11_INF".Buffer[0].Real_5 := #Real_5;
"DB11_INF".Buffer[0].Real_6 := #Real_6;
"DB11_INF".Buffer[0].Real_7 := #Real_7;
"DB11_INF".Buffer[0].Real_8 := #Real_8;
"DB11_INF".Buffer[0].Real_9 := #Real_9;
"DB11_INF".Buffer[0].Real_10 := #Real_10;
"DB11_INF".Buffer[0].Real_11 := #Real_11;
"DB11_INF".Buffer[0].Real_12 := #Real_12;
"DB11_INF".Buffer[0].Real_13 := #Real_13;
"DB11_INF".Buffer[0].Real_14 := #Real_14;
"DB11_INF".Buffer[0].Real_15 := #Real_15;
"DB11_INF".Buffer[0].Real_16 := #Real_16;
"DB11_INF".Buffer[0].Real_17 := #Real_17;
"DB11_INF".Buffer[0].Real_18 := #Real_18;
"DB11_INF".Buffer[0].Real_19 := #Real_19;
"DB11_INF".Buffer[0].Real_20 := #Real_20;
"DB11_INF".Buffer[0].Int_1 := #Int_1;
"DB11_INF".Buffer[0].Int_2 := #Int_2;
"DB11_INF".Buffer[0].Int_3 := #Int_3;
"DB11_INF".Buffer[0].Int_4 := #Int_4;
"DB11_INF".Buffer[0].Int_5 := #Int_5;
"DB11_INF".Buffer[0].Int_6 := #Int_6;
"DB11_INF".Buffer[0].Int_7 := #Int_7;
"DB11_INF".Buffer[0].Int_8 := #Int_8;
"DB11_INF".Buffer[0].Int_9 := #Int_9;
"DB11_INF".Buffer[0].Int_10 := #Int_10;
"DB11_INF".Buffer[0].Int_11 := #Int_11;
"DB11_INF".Buffer[0].Int_12 := #Int_12;
"DB11_INF".Buffer[0].Int_13 := #Int_13;
"DB11_INF".Buffer[0].Int_14 := #Int_14;
"DB11_INF".Buffer[0].Int_15 := #Int_15;
"DB11_INF".Buffer[0].Int_16 := #Int_16;
"DB11_INF".Buffer[0].Int_17 := #Int_17;
"DB11_INF".Buffer[0].Int_18 := #Int_18;
"DB11_INF".Buffer[0].Int_19 := #Int_19;
"DB11_INF".Buffer[0].Int_20 := #Int_20;
END_REGION GESTION_REGISTRO_INFORME
END_FUNCTION