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,55 @@
DATA_BLOCK "DB20_GESTION_SCADA"
TITLE = DB16_GESTION_SCADA
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
NON_RETAIN
VAR
BitDevida : Array[0.."N_MAX_SCADA"] of Bool;
ConexionOk : Array[0.."N_MAX_SCADA"] of Bool;
END_VAR
VAR RETAIN
Maestro : Int; // -1= NINGUNO / 10= SCADA01 / 11= SCADA02
END_VAR
VAR
PermisoInformes : Array[0.."N_MAX_SCADA"] of Bool;
Sincronizacion : Struct
AmbosConectados : Bool;
Informes : Array[0.."N_MAX_SCADA"] of Int;
CIP : Array[0.."N_MAX_SCADA"] of Int;
Fermentadores : Array[0.."N_MAX_SCADA"] of Int;
Cocina1 : Array[0.."N_MAX_SCADA"] of Int;
END_STRUCT;
BitVida : Array[0.."N_MAX_SCADA"] of Struct
TON_ON { S7_SetPoint := 'False'} : Array[0..1] of "UDT_ZC_DISP_TON";
TON_OFF : Array[0..1] of "UDT_ZC_DISP_TON";
END_STRUCT;
END_VAR
VAR RETAIN
TON_CIP_ESTADO : Array[0..1] of "UDT_ZC_DISP_TON";
TON_INFORME_ESTADO : Array[0..1] of "UDT_ZC_DISP_TON";
TON_FERM_ESTADO : Array[0..1] of "UDT_ZC_DISP_TON";
TON_COCINA1_ESTADO : Array[0..1] of "UDT_ZC_DISP_TON";
END_VAR
VAR
Aux : Struct
OldAmbosConectados : Bool;
END_STRUCT;
END_VAR
BEGIN
BitDevida[0] := TRUE;
ConexionOk[0] := TRUE;
Maestro := 10;
PermisoInformes[0] := TRUE;
Sincronizacion.AmbosConectados := FALSE;
Sincronizacion.Informes[0] := 0;
Sincronizacion.CIP[0] := 0;
Sincronizacion.Fermentadores[0] := 0;
Sincronizacion.Cocina1[0] := 0;
Aux.OldAmbosConectados := FALSE;
END_DATA_BLOCK
@@ -0,0 +1,288 @@
FUNCTION "FC20_GESTION_SCADA" : Void
TITLE = FC21_GESTION_SCADA
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
FAMILY : ZeusControl
VERSION : 1.0
//Gestor de conexiones con SCADA, para determinar quien es el maestro en un sistema de dos equipos monopuesto
VAR_TEMP
for_i : Int;
END_VAR
BEGIN
(* (*
ZEUS CONTROL, S.A.
(c)Copyright (2024) All Rights Reserved
--------------------------------------------------------------------------------------
Software: TIA Portal 18
Restricciones: PLC serie 1200/1500
Nombre: FC10_GESTION_SCADA
Descripcion: Gestor de conexiones con SCADA, para determinar quien es el maestro en un sistema de
dos equipos monopuesto
Dependencias:
FC: FC2928_ZC_TON_INDV
FC2929_ZC_TOF_INDV
FB: -
DB: -
UDT: -
Change log:
Version Fecha Tecnico a cargo Descripcion
01.00.00 30.08.2024 (ABH) Primera version.
//=====================================================================================
*)
REGION GESTION_CONEXION_OK
// ====================================================================================
// Gestion bit de vida
FOR #for_i := 1 TO "N_MAX_SCADA" DO
"DB21_GESTION_SCADA".ConexionOk[#for_i] := FALSE;
"DB21_GESTION_SCADA".TON_ON[#for_i].SP := 3;
"DB21_GESTION_SCADA".TON_OFF[#for_i].SP := 3;
"DB21_GESTION_SCADA".TON_ON[#for_i].IN := "DB21_GESTION_SCADA".BitDevida[#for_i];
"DB21_GESTION_SCADA".TON_OFF[#for_i].IN := NOT "DB21_GESTION_SCADA".BitDevida[#for_i];
IF "DB21_GESTION_SCADA".TON_ON[#for_i].Q OR "DB21_GESTION_SCADA".TON_OFF[#for_i].Q THEN
"DB21_GESTION_SCADA".ConexionOk[#for_i] := FALSE;
ELSE
"DB21_GESTION_SCADA".ConexionOk[#for_i] := TRUE;
END_IF;
END_FOR;
END_REGION
REGION DEFINICION_MAESTRO
// Si no estan las conexion OK con ninguno de los dos SCADAS, ponemos el maestro a -1
IF NOT "DB21_GESTION_SCADA".ConexionOk[0] AND NOT "DB21_GESTION_SCADA".ConexionOk[1] THEN
"DB21_GESTION_SCADA".Maestro := -1;
END_IF;
// Si todavia no se ha seleccionado ningun maestro, comprobamos el estado de la conexion con los dos Scadas.
IF "DB21_GESTION_SCADA".Maestro = -1 THEN
// Si esta OK la conexion con SCADA01, lo marcamos como el maestro actual
IF "DB21_GESTION_SCADA".ConexionOk[0] THEN
"DB21_GESTION_SCADA".Maestro := 10;
END_IF;
// Si esta OK la conexion con SCADA02 y el SCADA01 esta NO OK, lo marcamos como el maestro actual
IF NOT "DB21_GESTION_SCADA".ConexionOk[0] AND "DB21_GESTION_SCADA".ConexionOk[1] THEN
"DB21_GESTION_SCADA".Maestro := 11;
END_IF;
END_IF;
// Reset seleccion maestro si pierde la conexion
CASE "DB21_GESTION_SCADA".Maestro OF
10:
IF NOT "DB21_GESTION_SCADA".ConexionOk[0] THEN
"DB21_GESTION_SCADA".Maestro := -1;
END_IF;
11:
IF NOT "DB21_GESTION_SCADA".ConexionOk[1] THEN
"DB21_GESTION_SCADA".Maestro := -1;
END_IF;
END_CASE;
// Gestion marcas para ejecucion de scripts
"DB21_GESTION_SCADA".PermisoInformes[0] := "DB21_GESTION_SCADA".Maestro = 10;
"DB21_GESTION_SCADA".PermisoInformes[1] := "DB21_GESTION_SCADA".Maestro = 11;
END_REGION
REGION DEFICION_SINCRONIZACION
// ====================================================================================
// Comprobamos que estan ambos Scadas conectados
"DB21_GESTION_SCADA".Sincronizacion.AmbosConectados := "DB21_GESTION_SCADA".ConexionOk[0] AND "DB21_GESTION_SCADA".ConexionOk[1];
// ====================================================================================
// Reseteamos ordenes de sincronizacion.
// Si estan ambos conectados, quitamos las ordenes de sincronizacion
IF NOT "DB21_GESTION_SCADA".Sincronizacion.AmbosConectados THEN
"DB21_GESTION_SCADA".Sincronizacion.Informes[0] :=
"DB21_GESTION_SCADA".Sincronizacion.CIP[0] :=
"DB21_GESTION_SCADA".Sincronizacion.Fermentadores[0] :=
"DB21_GESTION_SCADA".Sincronizacion.Cocina1[0] := 0;
"DB21_GESTION_SCADA".Sincronizacion.Informes[1] :=
"DB21_GESTION_SCADA".Sincronizacion.CIP[1] :=
"DB21_GESTION_SCADA".Sincronizacion.Fermentadores[1] :=
"DB21_GESTION_SCADA".Sincronizacion.Cocina1[1] := 0;
END_IF;
// ====================================================================================
// Cuando se conecten los dos SCADAs, lanzamos orden para que se sincronicen
IF "DB21_GESTION_SCADA".Sincronizacion.AmbosConectados AND NOT "DB21_GESTION_SCADA".Aux.OldAmbosConectados THEN
IF "DB21_GESTION_SCADA".Maestro = 10 THEN
"DB21_GESTION_SCADA".Sincronizacion.Informes[1] :=
"DB21_GESTION_SCADA".Sincronizacion.CIP[1] :=
"DB21_GESTION_SCADA".Sincronizacion.Fermentadores[1] :=
"DB21_GESTION_SCADA".Sincronizacion.Cocina1[1] := 2;
END_IF;
IF "DB21_GESTION_SCADA".Maestro = 11 THEN
"DB21_GESTION_SCADA".Sincronizacion.Informes[0] :=
"DB21_GESTION_SCADA".Sincronizacion.CIP[0] :=
"DB21_GESTION_SCADA".Sincronizacion.Fermentadores[0] :=
"DB21_GESTION_SCADA".Sincronizacion.Cocina1[0] := 2;
END_IF;
END_IF;
"DB21_GESTION_SCADA".Aux.OldAmbosConectados := "DB21_GESTION_SCADA".Sincronizacion.AmbosConectados;
END_REGION
REGION GESTION_ESTADO_OK
// ====================================================================================
// Gestion estado sinronizacion OK
FOR #for_i := 0 TO 1 DO
"DB21_GESTION_SCADA".TON_CIP_ESTADO[#for_i].SP :=
"DB21_GESTION_SCADA".TON_INFORME_ESTADO[#for_i].SP :=
"DB21_GESTION_SCADA".TON_COCINA1_ESTADO[#for_i].SP :=
"DB21_GESTION_SCADA".TON_FERM_ESTADO[#for_i].SP := 2;
"DB21_GESTION_SCADA".TON_CIP_ESTADO[#for_i].IN := "DB21_GESTION_SCADA".Sincronizacion.CIP[#for_i] = 4 OR "DB21_GESTION_SCADA".Sincronizacion.CIP[#for_i] = 12;
IF "DB21_GESTION_SCADA".TON_CIP_ESTADO[#for_i].Q THEN
IF "DB21_GESTION_SCADA".Sincronizacion.CIP[#for_i] = 12 THEN
"FC8_ZC_TRAZA_REGISTRO"(FechaHora:="DB1_SYS".FechaHoraActual,
Registrar:=1,
Categoria:="TRAZA_CAT_1_SISTEMA",
User:='',
Codigo1:=0,
Codigo2:=0,
Codigo3:=0,
Texto:='Fallo al sincronizar registros CIP',
CodInt_1:=_int_in_,
CodInt_2:=_int_in_,
CodInt_3:=_int_in_,
CodInt_4:=_int_in_,
CodInt_5:=_int_in_,
CodReal_1:=_real_in_,
CodReal_2:=_real_in_);
END_IF;
"DB21_GESTION_SCADA".Sincronizacion.CIP[#for_i] := 0;
END_IF;
"DB21_GESTION_SCADA".TON_INFORME_ESTADO[#for_i].IN := "DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] = 4 OR "DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] = 12;
IF "DB21_GESTION_SCADA".TON_INFORME_ESTADO[#for_i].Q THEN
IF "DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] = 12 THEN
"FC8_ZC_TRAZA_REGISTRO"(FechaHora := "DB1_SYS".FechaHoraActual,
Registrar := 1,
Categoria := "TRAZA_CAT_1_SISTEMA",
User := '',
Codigo1 := 0,
Codigo2 := 0,
Codigo3 := 0,
Texto := 'Fallo al sincronizar registros CIP',
CodInt_1:=_int_in_,
CodInt_2:=_int_in_,
CodInt_3:=_int_in_,
CodInt_4:=_int_in_,
CodInt_5:=_int_in_,
CodReal_1:=_real_in_,
CodReal_2:=_real_in_);
END_IF;
"DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] := 0;
END_IF;
"DB21_GESTION_SCADA".TON_COCINA1_ESTADO[#for_i].IN := "DB21_GESTION_SCADA".Sincronizacion.Cocina1[#for_i] = 4 OR "DB21_GESTION_SCADA".Sincronizacion.Cocina1[#for_i] = 12;
IF "DB21_GESTION_SCADA".TON_COCINA1_ESTADO[#for_i].Q THEN
IF "DB21_GESTION_SCADA".Sincronizacion.Cocina1[#for_i] = 12 THEN
IF "DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] = 12 THEN
"FC8_ZC_TRAZA_REGISTRO"(FechaHora := "DB1_SYS".FechaHoraActual,
Registrar := 1,
Categoria := "TRAZA_CAT_1_SISTEMA",
User := '',
Codigo1 := 0,
Codigo2 := 0,
Codigo3 := 0,
Texto := 'Fallo al sincronizar registros CIP',
CodInt_1:=_int_in_,
CodInt_2:=_int_in_,
CodInt_3:=_int_in_,
CodInt_4:=_int_in_,
CodInt_5:=_int_in_,
CodReal_1:=_real_in_,
CodReal_2:=_real_in_);
END_IF;
"DB21_GESTION_SCADA".Sincronizacion.Cocina1[#for_i] := 0;
END_IF;
END_IF;
"DB21_GESTION_SCADA".TON_FERM_ESTADO[#for_i].IN := "DB21_GESTION_SCADA".Sincronizacion.Fermentadores[#for_i] = 4 OR "DB21_GESTION_SCADA".Sincronizacion.Fermentadores[#for_i] = 12;
IF "DB21_GESTION_SCADA".TON_FERM_ESTADO[#for_i].Q THEN
IF "DB21_GESTION_SCADA".Sincronizacion.Fermentadores[#for_i] = 12 THEN
IF "DB21_GESTION_SCADA".Sincronizacion.Informes[#for_i] = 12 THEN
"FC8_ZC_TRAZA_REGISTRO"(FechaHora := "DB1_SYS".FechaHoraActual,
Registrar := 1,
Categoria := "TRAZA_CAT_1_SISTEMA",
User := '',
Codigo1 := 0,
Codigo2 := 0,
Codigo3 := 0,
Texto := 'Fallo al sincronizar registros CIP',
CodInt_1:=_int_in_,
CodInt_2:=_int_in_,
CodInt_3:=_int_in_,
CodInt_4:=_int_in_,
CodInt_5:=_int_in_,
CodReal_1:=_real_in_,
CodReal_2:=_real_in_);
END_IF;
"DB21_GESTION_SCADA".Sincronizacion.Fermentadores[#for_i] := 0;
END_IF;
END_IF;
END_FOR;
END_REGION
REGION GESTION_TEMPORIZADORES
// ====================================================================================
// Gestion de marcas de bit de vida, reinicializamos los valores
FOR #for_i := 0 TO 1 DO
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_ON[#for_i]);
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_OFF[#for_i]);
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_CIP_ESTADO[#for_i]);
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_INFORME_ESTADO[#for_i]);
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_COCINA1_ESTADO[#for_i]);
"FC2928_ZC_TON_INDV"(Pulso1seg := "DB1_SYS".Pulso1seg,
TON := "DB21_GESTION_SCADA".TON_FERM_ESTADO[#for_i]);
END_FOR;
END_REGION
*)
END_FUNCTION