Cambio de formato de exportacion a S7dcl.

This commit is contained in:
2026-07-20 16:03:44 +02:00
parent 350bcb6b01
commit d551a132c0
714 changed files with 44789 additions and 30182 deletions
@@ -1,204 +0,0 @@
DATA_BLOCK "DB1_SYS"
TITLE = Datos de sistema
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : ABH
VERSION : 0.1
NON_RETAIN
VAR
ON : Bool; // Siempre a 1
OFF : Bool; // Siempre a 0
SIM : Bool; // Sistema en simulacion
ACK : Bool; // Acuse general de errores
ARRANQUE : Bool; // Marca de primer arranque del sistema
Pulso100ms : Bool; // Pulso 100 ms
Pulso1seg : Bool; // Pulso 1 segundo
Pulso2seg : Bool; // Pulso 2 segundo
Pulso5seg : Bool; // Pulso 5 segundos
Pulso1min : Bool; // Pulso 1 minuto
Pulso1h : Bool; // Pulso 1 hora
FlipFlop1seg : Bool; // Flip flop 1 seg ON - 1 seg OFF
FlipFlop2seg : Bool; // Flip flop 2 seg ON - 2 seg OFF
FlipFlop5seg : Bool; // Flip flop 5 seg ON - 5 seg OFF
ResetEntidades { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset todas las entidades
SincronizarFecha : Bool; // Orden sincronizacion fecha desde sistema superior
WatchDog : Int; // Watchdog para comunicaciones
Pulsador : Struct
EscribirFechaHora { S7_SetPoint := 'False'} : "UDT_ZC_PULSADOR"; // Pulsador cambio de fecha y hora desde hmi
Ack { S7_SetPoint := 'False'} : Array[0..9] of "UDT_ZC_PULSADOR"; // Pulsador acuse general de errores
END_STRUCT;
FechaHoraActual {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // Fecha y hora actual del sistema
END_VAR
VAR RETAIN
FechaHoraNuevaManual {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // Fecha y hora nueva escrita manualmente desde HMI
FechaHoraNuevaAuto {InstructionName := 'DTL'; LibVersion := '1.0'} : DTL; // Fecha y hora nueva escrita automaticamente
END_VAR
VAR
TiempoCiclo : Real; // Tiempo de ciclo del PLC
END_VAR
VAR RETAIN
Usuario : Struct
Seleccion : Array[0..9] of Struct
Orden : Bool;
Usuario : String[25];
END_STRUCT;
Actual : String[25]; // Usuario actual
END_STRUCT;
END_VAR
VAR
RedProfinet : Array[0..1023] of Bool;
END_VAR
VAR RETAIN
Aux : Struct
P_Trig_Pulso100ms : Bool; // P_TRIG Pulso 100 ms
P_Trig_Pulso1Seg : Bool; // P_TRIG Pulso 1 segundo
Contador2seg : USInt; // Aux. Contador 2 segundos
Contador5seg : USInt; // Aux. Contador 5 segundos
Contador1min : USInt; // Aux. Contador 1 minuto
Contador1h : UInt; // Aux. Contador 1 hora
auxRuntime : LReal; // Aux. Runtime
END_STRUCT;
END_VAR
BEGIN
ON := TRUE;
OFF := FALSE;
SIM := FALSE;
ACK := FALSE;
ARRANQUE := FALSE;
Pulso100ms := FALSE;
Pulso1seg := FALSE;
Pulso2seg := FALSE;
Pulso5seg := FALSE;
Pulso1min := FALSE;
Pulso1h := FALSE;
FlipFlop1seg := TRUE;
FlipFlop2seg := TRUE;
FlipFlop5seg := TRUE;
ResetEntidades := FALSE;
SincronizarFecha := FALSE;
Pulsador.EscribirFechaHora.Hmi := FALSE;
Pulsador.EscribirFechaHora.Plc := FALSE;
Pulsador.EscribirFechaHora.Permiso := TRUE;
Pulsador.EscribirFechaHora.Visibilidad := TRUE;
Pulsador.EscribirFechaHora.AuxPulso := FALSE;
Pulsador.EscribirFechaHora.AuxTiempo := 0;
Pulsador.Ack[0].Hmi := FALSE;
Pulsador.Ack[0].Plc := FALSE;
Pulsador.Ack[0].Permiso := TRUE;
Pulsador.Ack[0].Visibilidad := FALSE;
Pulsador.Ack[0].AuxPulso := FALSE;
Pulsador.Ack[0].AuxTiempo := 0;
Pulsador.Ack[1].Hmi := FALSE;
Pulsador.Ack[1].Plc := FALSE;
Pulsador.Ack[1].Permiso := TRUE;
Pulsador.Ack[1].Visibilidad := FALSE;
Pulsador.Ack[1].AuxPulso := FALSE;
Pulsador.Ack[1].AuxTiempo := 0;
Pulsador.Ack[2].Hmi := FALSE;
Pulsador.Ack[2].Plc := FALSE;
Pulsador.Ack[2].Permiso := TRUE;
Pulsador.Ack[2].Visibilidad := FALSE;
Pulsador.Ack[2].AuxPulso := FALSE;
Pulsador.Ack[2].AuxTiempo := 0;
Pulsador.Ack[3].Hmi := FALSE;
Pulsador.Ack[3].Plc := FALSE;
Pulsador.Ack[3].Permiso := TRUE;
Pulsador.Ack[3].Visibilidad := FALSE;
Pulsador.Ack[3].AuxPulso := FALSE;
Pulsador.Ack[3].AuxTiempo := 0;
Pulsador.Ack[4].Hmi := FALSE;
Pulsador.Ack[4].Plc := FALSE;
Pulsador.Ack[4].Permiso := TRUE;
Pulsador.Ack[4].Visibilidad := FALSE;
Pulsador.Ack[4].AuxPulso := FALSE;
Pulsador.Ack[4].AuxTiempo := 0;
Pulsador.Ack[5].Hmi := FALSE;
Pulsador.Ack[5].Plc := FALSE;
Pulsador.Ack[5].Permiso := TRUE;
Pulsador.Ack[5].Visibilidad := FALSE;
Pulsador.Ack[5].AuxPulso := FALSE;
Pulsador.Ack[5].AuxTiempo := 0;
Pulsador.Ack[6].Hmi := FALSE;
Pulsador.Ack[6].Plc := FALSE;
Pulsador.Ack[6].Permiso := TRUE;
Pulsador.Ack[6].Visibilidad := FALSE;
Pulsador.Ack[6].AuxPulso := FALSE;
Pulsador.Ack[6].AuxTiempo := 0;
Pulsador.Ack[7].Hmi := FALSE;
Pulsador.Ack[7].Plc := FALSE;
Pulsador.Ack[7].Permiso := TRUE;
Pulsador.Ack[7].Visibilidad := FALSE;
Pulsador.Ack[7].AuxPulso := FALSE;
Pulsador.Ack[7].AuxTiempo := 0;
Pulsador.Ack[8].Hmi := FALSE;
Pulsador.Ack[8].Plc := FALSE;
Pulsador.Ack[8].Permiso := TRUE;
Pulsador.Ack[8].Visibilidad := FALSE;
Pulsador.Ack[8].AuxPulso := FALSE;
Pulsador.Ack[8].AuxTiempo := 0;
Pulsador.Ack[9].Hmi := FALSE;
Pulsador.Ack[9].Plc := FALSE;
Pulsador.Ack[9].Permiso := TRUE;
Pulsador.Ack[9].Visibilidad := FALSE;
Pulsador.Ack[9].AuxPulso := FALSE;
Pulsador.Ack[9].AuxTiempo := 0;
FechaHoraActual.YEAR := 2025;
FechaHoraActual.MONTH := 9;
FechaHoraActual.DAY := 18;
FechaHoraActual.WEEKDAY := 5;
FechaHoraActual.HOUR := 19;
FechaHoraActual.MINUTE := 1;
FechaHoraActual.SECOND := 56;
FechaHoraActual.NANOSECOND := 550304800;
FechaHoraActual := DTL#2025-09-18-19:01:56.550304800;
FechaHoraNuevaManual.YEAR := 2026;
FechaHoraNuevaManual.MONTH := 3;
FechaHoraNuevaManual.DAY := 26;
FechaHoraNuevaManual.WEEKDAY := 5;
FechaHoraNuevaManual.HOUR := 11;
FechaHoraNuevaManual.MINUTE := 31;
FechaHoraNuevaManual.SECOND := 44;
FechaHoraNuevaManual.NANOSECOND := 10900982;
FechaHoraNuevaManual := DTL#2026-03-26-11:31:44.010900982;
FechaHoraNuevaAuto.YEAR := 2026;
FechaHoraNuevaAuto.MONTH := 3;
FechaHoraNuevaAuto.DAY := 26;
FechaHoraNuevaAuto.WEEKDAY := 5;
FechaHoraNuevaAuto.HOUR := 11;
FechaHoraNuevaAuto.MINUTE := 31;
FechaHoraNuevaAuto.SECOND := 44;
FechaHoraNuevaAuto.NANOSECOND := 10900982;
FechaHoraNuevaAuto := DTL#2026-03-26-11:31:44.010900982;
TiempoCiclo := 28.34702;
Usuario.Seleccion[0].Orden := FALSE;
Usuario.Seleccion[0].Usuario := 'sive';
Usuario.Seleccion[1].Orden := FALSE;
Usuario.Seleccion[1].Usuario := '';
Usuario.Seleccion[2].Orden := FALSE;
Usuario.Seleccion[2].Usuario := '';
Usuario.Seleccion[3].Orden := FALSE;
Usuario.Seleccion[3].Usuario := '';
Usuario.Seleccion[4].Orden := FALSE;
Usuario.Seleccion[4].Usuario := '';
Usuario.Seleccion[5].Orden := FALSE;
Usuario.Seleccion[5].Usuario := 's';
Usuario.Seleccion[6].Orden := FALSE;
Usuario.Seleccion[6].Usuario := '';
Usuario.Seleccion[7].Orden := FALSE;
Usuario.Seleccion[7].Usuario := '';
Usuario.Seleccion[8].Orden := FALSE;
Usuario.Seleccion[8].Usuario := '';
Usuario.Seleccion[9].Orden := FALSE;
Usuario.Seleccion[9].Usuario := '';
Usuario.Actual := 's';
Aux.P_Trig_Pulso100ms := TRUE;
Aux.P_Trig_Pulso1Seg := TRUE;
Aux.Contador2seg := 0;
Aux.Contador5seg := 0;
Aux.Contador1min := 33;
Aux.Contador1h := 573;
Aux.auxRuntime := 3.12728340475131E-308;
END_DATA_BLOCK
@@ -0,0 +1,266 @@
{
S7_Author := "ABH";
S7_BlockNumber := "1";
S7_BlockTitle := "MLC_4UZ";
S7_Optimized := "TRUE";
S7_StandardRetain := "FALSE";
S7_Version := "0.1"
}
DATA_BLOCK DB1_SYS
VAR
{ S7_MLC := "MLC_Q5" }
"ON" : Bool;
{ S7_MLC := "MLC_4iT" }
OFF : Bool;
{ S7_MLC := "MLC_55m" }
SIM : Bool;
{ S7_MLC := "MLC_5Af" }
ACK : Bool;
{ S7_MLC := "MLC_52i" }
ARRANQUE : Bool;
{ S7_MLC := "MLC_3vb" }
Pulso100ms : Bool;
{ S7_MLC := "MLC_4uy" }
Pulso1seg : Bool;
{ S7_MLC := "MLC_3Sv" }
Pulso2seg : Bool;
{ S7_MLC := "MLC_ep" }
Pulso5seg : Bool;
{ S7_MLC := "MLC_526" }
Pulso1min : Bool;
{ S7_MLC := "MLC_dF" }
Pulso1h : Bool;
{ S7_MLC := "MLC_WT" }
FlipFlop1seg : Bool;
{ S7_MLC := "MLC_Ny" }
FlipFlop2seg : Bool;
{ S7_MLC := "MLC_55w" }
FlipFlop5seg : Bool;
{
S7_Access := "ReadOnly := External";
S7_MLC := "MLC_3dU";
S7_Visibility := "Hidden := External"
}
ResetEntidades : Bool;
{ S7_MLC := "MLC_3pE" }
SincronizarFecha : Bool;
{ S7_MLC := "MLC_3v5" }
WatchDog : Int;
Pulsador : STRUCT
{
S7_MLC := "MLC_3ER";
S7_Setpoint := "False"
}
EscribirFechaHora : _.UDT_ZC_PULSADOR;
{
S7_MLC := "MLC_4K9";
S7_Setpoint := "False"
}
Ack : Array[0..9] of _.UDT_ZC_PULSADOR;
END_STRUCT;
{ S7_MLC := "MLC_4Fe" }
FechaHoraActual : DTL;
END_VAR
VAR RETAIN
{ S7_MLC := "MLC_4QZ" }
FechaHoraNuevaManual : DTL;
{ S7_MLC := "MLC_gz" }
FechaHoraNuevaAuto : DTL;
END_VAR
VAR
{ S7_MLC := "MLC_4Bs" }
TiempoCiclo : Real;
END_VAR
VAR RETAIN
Usuario : STRUCT
Seleccion : Array[0..9] of STRUCT
Orden : Bool;
Usuario : String[25];
END_STRUCT;
{ S7_MLC := "MLC_3JT" }
Actual : String[25];
END_STRUCT;
END_VAR
VAR
RedProfinet : Array[0..1023] of Bool;
END_VAR
VAR RETAIN
Aux : STRUCT
{ S7_MLC := "MLC_45G" }
P_Trig_Pulso100ms : Bool;
{ S7_MLC := "MLC_3zd" }
P_Trig_Pulso1Seg : Bool;
{ S7_MLC := "MLC_4V6" }
Contador2seg : USInt;
{ S7_MLC := "MLC_4r4" }
Contador5seg : USInt;
{ S7_MLC := "MLC_Yr" }
Contador1min : USInt;
{ S7_MLC := "MLC_3XQ" }
Contador1h : UInt;
{ S7_MLC := "MLC_5C3" }
auxRuntime : LReal;
END_STRUCT;
END_VAR
"ON" := TRUE;
OFF := FALSE;
SIM := FALSE;
ACK := FALSE;
ARRANQUE := FALSE;
Pulso100ms := FALSE;
Pulso1seg := FALSE;
Pulso2seg := FALSE;
Pulso5seg := FALSE;
Pulso1min := FALSE;
Pulso1h := FALSE;
FlipFlop1seg := TRUE;
FlipFlop2seg := TRUE;
FlipFlop5seg := TRUE;
ResetEntidades := FALSE;
SincronizarFecha := FALSE;
Pulsador.EscribirFechaHora.Hmi := FALSE;
Pulsador.EscribirFechaHora.Plc := FALSE;
Pulsador.EscribirFechaHora.Permiso := TRUE;
Pulsador.EscribirFechaHora.Visibilidad := TRUE;
Pulsador.EscribirFechaHora.AuxPulso := FALSE;
Pulsador.EscribirFechaHora.AuxTiempo := 0;
Pulsador.Ack[0].Hmi := FALSE;
Pulsador.Ack[0].Plc := FALSE;
Pulsador.Ack[0].Permiso := TRUE;
Pulsador.Ack[0].Visibilidad := FALSE;
Pulsador.Ack[0].AuxPulso := FALSE;
Pulsador.Ack[0].AuxTiempo := 0;
{ S7_MLC := "MLC_3Yi" }
Pulsador.Ack[0] := ();
Pulsador.Ack[1].Hmi := FALSE;
Pulsador.Ack[1].Plc := FALSE;
Pulsador.Ack[1].Permiso := TRUE;
Pulsador.Ack[1].Visibilidad := FALSE;
Pulsador.Ack[1].AuxPulso := FALSE;
Pulsador.Ack[1].AuxTiempo := 0;
{ S7_MLC := "MLC_44F" }
Pulsador.Ack[1] := ();
Pulsador.Ack[2].Hmi := FALSE;
Pulsador.Ack[2].Plc := FALSE;
Pulsador.Ack[2].Permiso := TRUE;
Pulsador.Ack[2].Visibilidad := FALSE;
Pulsador.Ack[2].AuxPulso := FALSE;
Pulsador.Ack[2].AuxTiempo := 0;
{ S7_MLC := "MLC_4tj" }
Pulsador.Ack[2] := ();
Pulsador.Ack[3].Hmi := FALSE;
Pulsador.Ack[3].Plc := FALSE;
Pulsador.Ack[3].Permiso := TRUE;
Pulsador.Ack[3].Visibilidad := FALSE;
Pulsador.Ack[3].AuxPulso := FALSE;
Pulsador.Ack[3].AuxTiempo := 0;
{ S7_MLC := "MLC_4s8" }
Pulsador.Ack[3] := ();
Pulsador.Ack[4].Hmi := FALSE;
Pulsador.Ack[4].Plc := FALSE;
Pulsador.Ack[4].Permiso := TRUE;
Pulsador.Ack[4].Visibilidad := FALSE;
Pulsador.Ack[4].AuxPulso := FALSE;
Pulsador.Ack[4].AuxTiempo := 0;
{ S7_MLC := "MLC_N4" }
Pulsador.Ack[4] := ();
Pulsador.Ack[5].Hmi := FALSE;
Pulsador.Ack[5].Plc := FALSE;
Pulsador.Ack[5].Permiso := TRUE;
Pulsador.Ack[5].Visibilidad := FALSE;
Pulsador.Ack[5].AuxPulso := FALSE;
Pulsador.Ack[5].AuxTiempo := 0;
{ S7_MLC := "MLC_3Nv" }
Pulsador.Ack[5] := ();
Pulsador.Ack[6].Hmi := FALSE;
Pulsador.Ack[6].Plc := FALSE;
Pulsador.Ack[6].Permiso := TRUE;
Pulsador.Ack[6].Visibilidad := FALSE;
Pulsador.Ack[6].AuxPulso := FALSE;
Pulsador.Ack[6].AuxTiempo := 0;
{ S7_MLC := "MLC_575" }
Pulsador.Ack[6] := ();
Pulsador.Ack[7].Hmi := FALSE;
Pulsador.Ack[7].Plc := FALSE;
Pulsador.Ack[7].Permiso := TRUE;
Pulsador.Ack[7].Visibilidad := FALSE;
Pulsador.Ack[7].AuxPulso := FALSE;
Pulsador.Ack[7].AuxTiempo := 0;
{ S7_MLC := "MLC_es" }
Pulsador.Ack[7] := ();
Pulsador.Ack[8].Hmi := FALSE;
Pulsador.Ack[8].Plc := FALSE;
Pulsador.Ack[8].Permiso := TRUE;
Pulsador.Ack[8].Visibilidad := FALSE;
Pulsador.Ack[8].AuxPulso := FALSE;
Pulsador.Ack[8].AuxTiempo := 0;
{ S7_MLC := "MLC_4N5" }
Pulsador.Ack[8] := ();
Pulsador.Ack[9].Hmi := FALSE;
Pulsador.Ack[9].Plc := FALSE;
Pulsador.Ack[9].Permiso := TRUE;
Pulsador.Ack[9].Visibilidad := FALSE;
Pulsador.Ack[9].AuxPulso := FALSE;
Pulsador.Ack[9].AuxTiempo := 0;
{ S7_MLC := "MLC_3jD" }
Pulsador.Ack[9] := ();
FechaHoraActual := DTL#2025-09-18-19:01:56.550304800;
FechaHoraNuevaManual := DTL#2026-03-26-11:31:44.010900982;
FechaHoraNuevaAuto := DTL#2026-03-26-11:31:44.010900982;
TiempoCiclo := 28.34702;
Usuario.Seleccion[0].Orden := FALSE;
Usuario.Seleccion[0].Usuario := 'sive';
{ S7_MLC := "MLC_37Y" }
Usuario.Seleccion[0] := ();
Usuario.Seleccion[1].Orden := FALSE;
Usuario.Seleccion[1].Usuario := '';
{ S7_MLC := "MLC_58D" }
Usuario.Seleccion[1] := ();
Usuario.Seleccion[2].Orden := FALSE;
Usuario.Seleccion[2].Usuario := '';
{ S7_MLC := "MLC_RC" }
Usuario.Seleccion[2] := ();
Usuario.Seleccion[3].Orden := FALSE;
Usuario.Seleccion[3].Usuario := '';
{ S7_MLC := "MLC_jP" }
Usuario.Seleccion[3] := ();
Usuario.Seleccion[4].Orden := FALSE;
Usuario.Seleccion[4].Usuario := '';
{ S7_MLC := "MLC_3Xk" }
Usuario.Seleccion[4] := ();
Usuario.Seleccion[5].Orden := FALSE;
Usuario.Seleccion[5].Usuario := 's';
{ S7_MLC := "MLC_3hH" }
Usuario.Seleccion[5] := ();
Usuario.Seleccion[6].Orden := FALSE;
Usuario.Seleccion[6].Usuario := '';
{ S7_MLC := "MLC_uK" }
Usuario.Seleccion[6] := ();
Usuario.Seleccion[7].Orden := FALSE;
Usuario.Seleccion[7].Usuario := '';
{ S7_MLC := "MLC_56U" }
Usuario.Seleccion[7] := ();
Usuario.Seleccion[8].Orden := FALSE;
Usuario.Seleccion[8].Usuario := '';
{ S7_MLC := "MLC_48z" }
Usuario.Seleccion[8] := ();
Usuario.Seleccion[9].Orden := FALSE;
Usuario.Seleccion[9].Usuario := '';
{ S7_MLC := "MLC_X5" }
Usuario.Seleccion[9] := ();
Usuario.Actual := 's';
Aux.P_Trig_Pulso100ms := TRUE;
Aux.P_Trig_Pulso1Seg := TRUE;
Aux.Contador2seg := 0;
Aux.Contador5seg := 0;
Aux.Contador1min := 33;
Aux.Contador1h := 573;
Aux.auxRuntime := 3.12728340475131E-308;
END_DATA_BLOCK
@@ -0,0 +1,105 @@
MultiLingualTexts:
- id: MLC_4UZ
es-ES: Datos de sistema
- id: MLC_Q5
es-ES: Siempre a 1
- id: MLC_4iT
es-ES: Siempre a 0
- id: MLC_55m
es-ES: Sistema en simulacion
- id: MLC_5Af
es-ES: Acuse general de errores
- id: MLC_52i
es-ES: Marca de primer arranque del sistema
- id: MLC_3vb
es-ES: Pulso 100 ms
- id: MLC_4uy
es-ES: Pulso 1 segundo
- id: MLC_3Sv
es-ES: Pulso 2 segundo
- id: MLC_ep
es-ES: Pulso 5 segundos
- id: MLC_526
es-ES: Pulso 1 minuto
- id: MLC_dF
es-ES: Pulso 1 hora
- id: MLC_WT
es-ES: Flip flop 1 seg ON - 1 seg OFF
- id: MLC_Ny
es-ES: Flip flop 2 seg ON - 2 seg OFF
- id: MLC_55w
es-ES: Flip flop 5 seg ON - 5 seg OFF
- id: MLC_3dU
es-ES: Reset todas las entidades
- id: MLC_3pE
es-ES: Orden sincronizacion fecha desde sistema superior
- id: MLC_3v5
es-ES: Watchdog para comunicaciones
- id: MLC_3ER
es-ES: Pulsador cambio de fecha y hora desde hmi
- id: MLC_4K9
es-ES: Pulsador acuse general de errores
- id: MLC_3Yi
es-ES: Scada 01
- id: MLC_44F
es-ES: Scada 02
- id: MLC_4tj
es-ES: Hmi zona 2 Pasto
- id: MLC_4s8
es-ES: Hmi zona 1 recepcion
- id: MLC_N4
es-ES: Hmi zona 3 Fermentacion
- id: MLC_3Nv
es-ES: Hmi zona 4 CIP 1
- id: MLC_575
es-ES: Hmi zona 5 CIP 2
- id: MLC_es
es-ES: '-'
- id: MLC_4N5
es-ES: '-'
- id: MLC_3jD
es-ES: '-'
- id: MLC_4Fe
es-ES: Fecha y hora actual del sistema
- id: MLC_4QZ
es-ES: Fecha y hora nueva escrita manualmente desde HMI
- id: MLC_gz
es-ES: Fecha y hora nueva escrita automaticamente
- id: MLC_4Bs
es-ES: Tiempo de ciclo del PLC
- id: MLC_37Y
es-ES: Scada 01
- id: MLC_58D
es-ES: Scada 02
- id: MLC_RC
es-ES: Hmi zona 2 Pasto
- id: MLC_jP
es-ES: Hmi zona 1 recepcion
- id: MLC_3Xk
es-ES: Hmi zona 3 Fermentacion
- id: MLC_3hH
es-ES: Hmi zona 4 CIP 1
- id: MLC_uK
es-ES: Hmi zona 5 CIP 2
- id: MLC_56U
es-ES: '-'
- id: MLC_48z
es-ES: '-'
- id: MLC_X5
es-ES: '-'
- id: MLC_3JT
es-ES: Usuario actual
- id: MLC_45G
es-ES: P_TRIG Pulso 100 ms
- id: MLC_3zd
es-ES: P_TRIG Pulso 1 segundo
- id: MLC_4V6
es-ES: Aux. Contador 2 segundos
- id: MLC_4r4
es-ES: Aux. Contador 5 segundos
- id: MLC_Yr
es-ES: Aux. Contador 1 minuto
- id: MLC_3XQ
es-ES: Aux. Contador 1 hora
- id: MLC_5C3
es-ES: Aux. Runtime
@@ -1,10 +0,0 @@
DATA_BLOCK "DB3_CHECKSUM"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
NON_RETAIN
"FB3_ZC_CHECKSUM"
BEGIN
END_DATA_BLOCK
@@ -0,0 +1,8 @@
{
S7_BlockNumber := "3";
S7_Optimized := "TRUE";
S7_StandardRetain := "FALSE";
S7_Version := "0.1"
}
DATA_BLOCK DB3_CHECKSUM : FB3_ZC_CHECKSUM
END_DATA_BLOCK
@@ -0,0 +1,130 @@
{
S7_BlockNumber := "3";
S7_EditorMode := "SCL";
S7_IECCheck := "TRUE";
S7_Optimized := "TRUE";
S7_Version := "0.1"
}
FUNCTION_BLOCK "FB3_ZC_CHECKSUM"
VAR_INPUT
Comprobar : Bool;
Copiar : Bool;
END_VAR
VAR_OUTPUT
CheckSumOK : Bool;
END_VAR
VAR
{
S7_Access := "ReadOnly := External";
S7_Setpoint := "False";
S7_Visibility := "Hidden := External"
}
s_GetCheckSum : GetChecksum;
END_VAR
VAR RETAIN
{
S7_Access := "ReadOnly := External";
S7_Visibility := "Hidden := External"
}
s_EstadoCheckSum : Array[0..7] of Byte;
{
S7_Access := "ReadOnly := External";
S7_Visibility := "Hidden := External"
}
s_CheckSumFabrica : Array[0..7] of Byte;
END_VAR
VAR
{
S7_Access := "ReadOnly := External";
S7_Visibility := "Hidden := External"
}
s_Comprobar : Bool;
{
S7_Access := "ReadOnly := External";
S7_Visibility := "Hidden := External"
}
s_OldComprobar : Bool;
END_VAR
{ S7_Language := "SCL" }
NETWORK
REGION DESCRIPCION
//=======================================================================
// (C)Copyright ZeusControl 2020 - 2026
//=======================================================================
(*
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
### Descripción Funcional
El bloque `FB3_CHECKSUM` implementa la lectura del checksum del programa actual del PLC y su comparación con el checksum de fábrica, permitiendo detectar modificaciones no autorizadas en el proyecto.
Funcionalidades principales:
- Detección de flanco ascendente en la entrada `#Comprobar` para ejecutar la comprobación bajo demanda (modo "pulso"), mediante la variable interna `#s_OldComprobar`.
- Lectura del checksum del bloque `Scope:=1` (objeto PLC) con `Range:=0` y `Subrange:=0` (rango completo), invocando la función de sistema `GetChecksum` a través del FB `GetChecksum` y depositando el resultado en `#s_EstadoCheckSum`.
- Captura del checksum de fábrica: cuando se activa la entrada `#Copiar`, se copia el checksum actual al valor de referencia `#s_CheckSumFabrica`, operación que se realiza una sola vez durante la puesta en marcha para fijar la línea base.
- Comparación continua entre el checksum actual y el de fábrica, exponiendo el resultado en la salida `#CheckSumOK` (TRUE cuando coinciden).
> **Restricciones:** Ninguna.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | - |
| FB | `GetChecksum` |
| DB | - |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 28.09.2020 | (ABH) | Primera versión. |
| 01.00.01 | 02.07.2026 | (ABH) | Cambio a SCL. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION ORDEN_COMPROBACION
// Comprobacion mediante un pulso
#s_Comprobar := #Comprobar AND NOT #s_OldComprobar;
// Estado anterior
#s_OldComprobar := #Comprobar;
END_REGION ORDEN_COMPROBACION
// ==========================================================================================================
REGION LECTURA_CHECKSUM
// Comprobacion mediante un pulso
#s_GetCheckSum(Scope:=1,
Range:=0,
Subrange:=0,
Checksum:=#s_EstadoCheckSum);
// Copia de checksum a valor de fabrica
IF #Copiar THEN
#s_CheckSumFabrica := #s_EstadoCheckSum;
END_IF;
END_REGION LECTURA_CHECKSUM
// ==========================================================================================================
REGION SALIDAS
// Checksum OK
#CheckSumOK := #s_EstadoCheckSum = #s_CheckSumFabrica;
END_REGION SALIDAS
END_NETWORK
END_FUNCTION_BLOCK
@@ -1,106 +0,0 @@
FUNCTION_BLOCK "FB3_ZC_CHECKSUM"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Comprobar : Bool;
Copiar : Bool;
END_VAR
VAR_OUTPUT
CheckSumOK : Bool;
END_VAR
VAR
s_GetCheckSum {InstructionName := 'GetChecksum'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : GetChecksum;
END_VAR
VAR RETAIN
s_EstadoCheckSum { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[0..7] of Byte;
s_CheckSumFabrica { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[0..7] of Byte;
END_VAR
VAR
s_Comprobar { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
s_OldComprobar { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
END_VAR
BEGIN
REGION DESCRIPCION
//=======================================================================
// (C)Copyright ZeusControl 2020 - 2026
//=======================================================================
(*
### Información del Sistema
| Hardware Compatible | Entorno de Ingeniería |
|---------------------|-----------------------|
| PLC serie 1200/1500 | TIA Portal 18 |
---
### Descripción Funcional
El bloque `FB3_CHECKSUM` implementa la lectura del checksum del programa actual del PLC y su comparación con el checksum de fábrica, permitiendo detectar modificaciones no autorizadas en el proyecto.
Funcionalidades principales:
- Detección de flanco ascendente en la entrada `#Comprobar` para ejecutar la comprobación bajo demanda (modo "pulso"), mediante la variable interna `#s_OldComprobar`.
- Lectura del checksum del bloque `Scope:=1` (objeto PLC) con `Range:=0` y `Subrange:=0` (rango completo), invocando la función de sistema `GetChecksum` a través del FB `GetChecksum` y depositando el resultado en `#s_EstadoCheckSum`.
- Captura del checksum de fábrica: cuando se activa la entrada `#Copiar`, se copia el checksum actual al valor de referencia `#s_CheckSumFabrica`, operación que se realiza una sola vez durante la puesta en marcha para fijar la línea base.
- Comparación continua entre el checksum actual y el de fábrica, exponiendo el resultado en la salida `#CheckSumOK` (TRUE cuando coinciden).
> **Restricciones:** Ninguna.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | - |
| FB | `GetChecksum` |
| DB | - |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 28.09.2020 | (ABH) | Primera versión. |
| 01.00.01 | 02.07.2026 | (ABH) | Cambio a SCL. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION ORDEN_COMPROBACION
// Comprobacion mediante un pulso
#s_Comprobar := #Comprobar AND NOT #s_OldComprobar;
// Estado anterior
#s_OldComprobar := #Comprobar;
END_REGION ORDEN_COMPROBACION
// ==========================================================================================================
REGION LECTURA_CHECKSUM
// Comprobacion mediante un pulso
#s_GetCheckSum(Scope:=1,
Range:=0,
Subrange:=0,
Checksum:=#s_EstadoCheckSum);
// Copia de checksum a valor de fabrica
IF #Copiar THEN
#s_CheckSumFabrica := #s_EstadoCheckSum;
END_IF;
END_REGION LECTURA_CHECKSUM
// ==========================================================================================================
REGION SALIDAS
// Checksum OK
#CheckSumOK := #s_EstadoCheckSum = #s_CheckSumFabrica;
END_REGION SALIDAS
END_FUNCTION_BLOCK
@@ -0,0 +1,418 @@
{
S7_Author := "HCR";
S7_BlockComment := "MLC_3dQ";
S7_BlockTitle := "MLC_42k";
S7_EditorMode := "SCL";
S7_Family := "ZeusControl";
S7_IECCheck := "TRUE";
S7_Optimized := "TRUE";
S7_Version := "2.0"
}
FUNCTION "FC1_ZC_SISTEMA" : Void
VAR_INPUT
{ S7_MLC := "MLC_576" }
CPU_MarcasCiclo : Byte;
{ S7_MLC := "MLC_4Mc" }
CPU_MarcasSistema : Byte;
{ S7_MLC := "MLC_3B7" }
RedProfinet : HW_IOSYSTEM;
END_VAR
VAR_TEMP
{ S7_MLC := "MLC_3bT" }
for_i : Int;
{ S7_MLC := "MLC_4GP" }
t_RetVal : Int;
END_VAR
{ S7_Language := "SCL" }
NETWORK
REGION DESCRIPCION
(*
###### (C)Copyright ZeusControl 2020 - 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 central para la gestión de marcas de sistema, temporizaciones generales, usuarios y resets del sistema.
En ella se realizan las siguientes acciones:
- Cálculo dinámico del tiempo de ciclo del OB1 (en milisegundos) evaluando la variable auxiliar con la instrucción RUNTIME.
- Tratamiento y registro de trazabilidad de los 10 pulsadores de acuse de alarmas y del pulsador de modificación de fecha/hora mediante la función FC15026_ZC_PULSADOR.
- Consolidación del acuse general (ACK), agrupando las activaciones del PLC de todos los pulsadores de reconocimiento en una única marca.
- Generación de marcas estáticas (ON fijo y OFF fijo) y captura del primer ciclo de escáner tras el arranque.
- Creación de pulsos temporizados (100 ms, 1 s, 2 s, 5 s, 1 min, 1 h) y señales Flip-Flop a partir de las marcas de ciclo del hardware de la CPU.
- Lectura constante de la fecha y hora local (RD_LOC_T) y ejecución de la escritura en el sistema (WR_SYS_T) ante una orden del HMI.
- Escaneo continuo de las órdenes de selección para determinar y fijar el usuario actualmente activo en el sistema.
- Ejecución bajo demanda del reset general del array de entidades (solo aplicable con procesos parados), reinicializando sus variables a estados de disponibilidad, limpieza y vacío.
- Llamada a la rutina DB3_CHECKSUM para la validación y gestión de la suma de comprobación del programa.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | `FC15026_ZC_PULSADOR` |
| FB | `FB3_ZC_CHECKSUM` |
| DB | `DB1_SYS`, `DB3_CHECKSUM`, `DB6_ENTIDAD` |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 03.11.2022 | (HCR) | Primera version. |
| 01.00.01 | 02.06.2023 | (ABH) | Optimizacion de bloque para integrar en libreria. Se eliminan marcas no utilizadas. Se reorganizan las variables y se ponen bien los comentarios. |
| 01.00.02 | 24.04.2025 | (HCR) | Se añade gestion de idioma. |
| 01.00.03 | 11.09.2025 | (ABH) | Se eliminan las constantes de idioma dentro del FC. Se utilizan constantes globales para facilitar su traduccion. |
| 02.00.00 | 25.03.2026 | (ABH) | Se cambia lenguaje a SCL. Se eliminan idiomas. Se añade watchdog para comunicaciones. Se integra estado red profinet. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION TIEMPO_DE_CICLO
// Se almacena el tiempo de ciclo del OB1
"DB1_SYS".TiempoCiclo := LREAL_TO_REAL(RUNTIME("DB1_SYS".Aux.auxRuntime));
"DB1_SYS".TiempoCiclo := ("DB1_SYS".TiempoCiclo * 1000.0);
END_REGION TIEMPO_DE_CICLO
// ==========================================================================================================
REGION GESTION_PULSADORES
// Gestion pulsadores de ack
"DB1_SYS".Pulsador.Ack[0].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_01",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[0]);
"DB1_SYS".Pulsador.Ack[1].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_02",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[1]);
"DB1_SYS".Pulsador.Ack[2].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_03",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[2]);
"DB1_SYS".Pulsador.Ack[3].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_04",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[3]);
"DB1_SYS".Pulsador.Ack[4].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_05",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[4]);
"DB1_SYS".Pulsador.Ack[5].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_06",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[5]);
"DB1_SYS".Pulsador.Ack[6].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_07",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[6]);
"DB1_SYS".Pulsador.Ack[7].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_08",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[7]);
"DB1_SYS".Pulsador.Ack[8].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_09",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[8]);
"DB1_SYS".Pulsador.Ack[9].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_10",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[9]);
// Gestion pulsador cambio de fecha y hora
"DB1_SYS".Pulsador.EscribirFechaHora.Permiso := TRUE;
"DB1_SYS".Pulsador.EscribirFechaHora.Visibilidad := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_FECHA",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.EscribirFechaHora);
END_REGION GESTION_PULSADORES
// ==========================================================================================================
REGION GESTION_ACUSE_GENERAL
// Activacion de marca de acuse general
"DB1_SYS".ACK :=
"DB1_SYS".Pulsador.Ack[0].Plc OR
"DB1_SYS".Pulsador.Ack[1].Plc OR
"DB1_SYS".Pulsador.Ack[2].Plc OR
"DB1_SYS".Pulsador.Ack[3].Plc OR
"DB1_SYS".Pulsador.Ack[4].Plc OR
"DB1_SYS".Pulsador.Ack[5].Plc OR
"DB1_SYS".Pulsador.Ack[6].Plc OR
"DB1_SYS".Pulsador.Ack[7].Plc OR
"DB1_SYS".Pulsador.Ack[8].Plc OR
"DB1_SYS".Pulsador.Ack[9].Plc;
END_REGION GESTION_ACUSE_GENERAL
// ==========================================================================================================
REGION GESTION_MARCAS_GENERALES_Y_FLANCOS
// ==========================================================================================================
// Marca siempre a ON
"DB1_SYS".OFF := FALSE;
// Marca siempre a OFF
"DB1_SYS".ON := TRUE;
// Marca primer arranque
"DB1_SYS".ARRANQUE := #CPU_MarcasSistema.%X0;
// ==========================================================================================================
// Pulso por 100 ms
"DB1_SYS".Pulso100ms := #CPU_MarcasCiclo.%X0 AND NOT "DB1_SYS".Aux.P_Trig_Pulso100ms;
// Pulso por 1 segundo
"DB1_SYS".Pulso1seg := #CPU_MarcasCiclo.%X5 AND NOT "DB1_SYS".Aux.P_Trig_Pulso1Seg;
// Pulso por 2 segundos
"DB1_SYS".Pulso2seg := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador2seg += 1;
IF "DB1_SYS".Aux.Contador2seg >= 2 THEN
"DB1_SYS".Pulso2seg := TRUE;
"DB1_SYS".Aux.Contador2seg := 0;
END_IF;
END_IF;
// Pulso por 5 segundos
"DB1_SYS".Pulso5seg := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador5seg += 1;
IF "DB1_SYS".Aux.Contador5seg >= 5 THEN
"DB1_SYS".Pulso5seg := TRUE;
"DB1_SYS".Aux.Contador5seg := 0;
END_IF;
END_IF;
// Pulso por 1 minuto
"DB1_SYS".Pulso1min := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador1min += 1;
IF "DB1_SYS".Aux.Contador1min >= 60 THEN
"DB1_SYS".Pulso1min := TRUE;
"DB1_SYS".Aux.Contador1min := 0;
END_IF;
END_IF;
// Pulso por 1 hora
"DB1_SYS".Pulso1h := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador1h += 1;
IF "DB1_SYS".Aux.Contador1h >= 3600 THEN
"DB1_SYS".Pulso1h := TRUE;
"DB1_SYS".Aux.Contador1h := 0;
END_IF;
END_IF;
// ==========================================================================================================
// Flip Flop 1 segundo
IF "DB1_SYS".Pulso1seg AND NOT "DB1_SYS".FlipFlop1seg THEN
"DB1_SYS".FlipFlop1seg := TRUE;
ELSIF "DB1_SYS".Pulso1seg AND "DB1_SYS".FlipFlop1seg THEN
"DB1_SYS".FlipFlop1seg := FALSE;
END_IF;
// Flip Flop 2 segundos
IF "DB1_SYS".Pulso2seg AND NOT "DB1_SYS".FlipFlop2seg THEN
"DB1_SYS".FlipFlop2seg := TRUE;
ELSIF "DB1_SYS".Pulso2seg AND "DB1_SYS".FlipFlop2seg THEN
"DB1_SYS".FlipFlop2seg := FALSE;
END_IF;
// Flip Flop 5 segundos
IF "DB1_SYS".Pulso5seg AND NOT "DB1_SYS".FlipFlop5seg THEN
"DB1_SYS".FlipFlop5seg := TRUE;
ELSIF "DB1_SYS".Pulso5seg AND "DB1_SYS".FlipFlop5seg THEN
"DB1_SYS".FlipFlop5seg := FALSE;
END_IF;
// ==========================================================================================================
// Watchdog
IF "DB1_SYS".Pulso100ms THEN
"DB1_SYS".WatchDog += 1;
IF "DB1_SYS".WatchDog > 20000 THEN
"DB1_SYS".WatchDog := 0;
END_IF;
END_IF;
// ==========================================================================================================
// Estados anteriores
"DB1_SYS".Aux.P_Trig_Pulso100ms := #CPU_MarcasCiclo.%X0;
"DB1_SYS".Aux.P_Trig_Pulso1Seg := #CPU_MarcasCiclo.%X5;
END_REGION GESTION_MARCAS_GENERALES_Y_FLANCOS
// ==========================================================================================================
REGION FECHA_Y_HORA
// Lectura de fecha y hora actual
#t_RetVal := RD_LOC_T("DB1_SYS".FechaHoraActual);
// Escritura de fecha y hora nueva escrita manualmente desde HMI
IF "DB1_SYS".Pulsador.EscribirFechaHora.Plc THEN
#t_RetVal := WR_SYS_T("DB1_SYS".FechaHoraNuevaManual);
END_IF;
// Escritura de fecha y hora nueva escrita autoamticamente desde Script, Scada, etc...
IF "DB1_SYS".SincronizarFecha THEN
#t_RetVal := WR_SYS_T("DB1_SYS".FechaHoraNuevaAuto);
END_IF;
END_REGION FECHA_Y_HORA
// ==========================================================================================================
REGION USUARIOS
// Gestion de usuario actual para trazas
FOR #for_i := 0 TO 9 DO
IF "DB1_SYS".Usuario.Seleccion[#for_i].Orden THEN
"DB1_SYS".Usuario.Actual := "DB1_SYS".Usuario.Seleccion[#for_i].Usuario;
"DB1_SYS".Usuario.Seleccion[#for_i].Orden := FALSE;
EXIT;
END_IF;
END_FOR;
END_REGION USUARIOS
// ==========================================================================================================
REGION RESET_ENTIDADES
// Reset todas las entidades
// CUIDADO!!!!!!!!
// TIENEN QUE ESTAR TODOS LOS PROCESOS PARADOS!!!!!!
IF "DB1_SYS".ResetEntidades THEN
FOR #for_i := 1 TO "N_MAX_ENTIDAD" DO
"DB6_ENTIDAD".ENT[#for_i].Estado.EnProduccion :=
"DB6_ENTIDAD".ENT[#for_i].Estado.EnCIP :=
"DB6_ENTIDAD".ENT[#for_i].Estado.EnSIP :=
"DB6_ENTIDAD".ENT[#for_i].Estado.ConProducto :=
"DB6_ENTIDAD".ENT[#for_i].Estado.ConAgua :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Vacia :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Sucia := FALSE;
"DB6_ENTIDAD".ENT[#for_i].Habilitar :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Disponible :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Limpia := TRUE;
"DB6_ENTIDAD".ENT[#for_i].Estado.CodEstado := 0;
"DB6_ENTIDAD".ENT[#for_i].Asignacion := 0;
"DB6_ENTIDAD".ENT[#for_i].ID := #for_i;
END_FOR;
"DB1_SYS".ResetEntidades := FALSE;
END_IF;
END_REGION RESET_ENTIDADES
// ==========================================================================================================
REGION CHECKSUM
// Gestion de checksum del programa
"DB3_CHECKSUM"();
END_REGION CHECKSUM
// ==========================================================================================================
REGION RED_PROFINET
// Comprobacion de red profinet
#t_RetVal := DeviceStates(LADDR := #RedProfinet, MODE := 4, STATE := "DB1_SYS".RedProfinet);
END_REGION RED_PROFINET
END_NETWORK
END_FUNCTION
@@ -0,0 +1,15 @@
MultiLingualTexts:
- id: MLC_42k
es-ES: FC1_ZC_SISTEMA
- id: MLC_3dQ
es-ES: Funcion para gestion de marcas de sistema
- id: MLC_576
es-ES: Byte Marca de ciclo CPU
- id: MLC_4Mc
es-ES: Byte Marcas de sistema
- id: MLC_3B7
es-ES: ID Profinet IO System
- id: MLC_3bT
es-ES: Variable para bucles FOR
- id: MLC_4GP
es-ES: Variable temporal para su uso en programa
@@ -1,410 +0,0 @@
FUNCTION "FC1_ZC_SISTEMA" : Void
TITLE = FC1_ZC_SISTEMA
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : HCR
FAMILY : ZeusControl
VERSION : 2.0
//Funcion para gestion de marcas de sistema
VAR_INPUT
CPU_MarcasCiclo : Byte; // Byte Marca de ciclo CPU
CPU_MarcasSistema : Byte; // Byte Marcas de sistema
RedProfinet : HW_IOSYSTEM; // ID Profinet IO System
END_VAR
VAR_TEMP
for_i : Int; // Variable para bucles FOR
t_RetVal : Int; // Variable temporal para su uso en programa
END_VAR
BEGIN
REGION DESCRIPCION
(*
###### (C)Copyright ZeusControl 2020 - 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 central para la gestión de marcas de sistema, temporizaciones generales, usuarios y resets del sistema.
En ella se realizan las siguientes acciones:
- Cálculo dinámico del tiempo de ciclo del OB1 (en milisegundos) evaluando la variable auxiliar con la instrucción RUNTIME.
- Tratamiento y registro de trazabilidad de los 10 pulsadores de acuse de alarmas y del pulsador de modificación de fecha/hora mediante la función FC15026_ZC_PULSADOR.
- Consolidación del acuse general (ACK), agrupando las activaciones del PLC de todos los pulsadores de reconocimiento en una única marca.
- Generación de marcas estáticas (ON fijo y OFF fijo) y captura del primer ciclo de escáner tras el arranque.
- Creación de pulsos temporizados (100 ms, 1 s, 2 s, 5 s, 1 min, 1 h) y señales Flip-Flop a partir de las marcas de ciclo del hardware de la CPU.
- Lectura constante de la fecha y hora local (RD_LOC_T) y ejecución de la escritura en el sistema (WR_SYS_T) ante una orden del HMI.
- Escaneo continuo de las órdenes de selección para determinar y fijar el usuario actualmente activo en el sistema.
- Ejecución bajo demanda del reset general del array de entidades (solo aplicable con procesos parados), reinicializando sus variables a estados de disponibilidad, limpieza y vacío.
- Llamada a la rutina DB3_CHECKSUM para la validación y gestión de la suma de comprobación del programa.
---
### Dependencias Requeridas
| Tipo | Elementos |
|------|-----------|
| FC | `FC15026_ZC_PULSADOR` |
| FB | `FB3_ZC_CHECKSUM` |
| DB | `DB1_SYS`, `DB3_CHECKSUM`, `DB6_ENTIDAD` |
| UDT | - |
---
### Historial de Cambios
| Versión | Fecha | Técnico | Cambios |
|----------|------------|---------|---------|
| 01.00.00 | 03.11.2022 | (HCR) | Primera version. |
| 01.00.01 | 02.06.2023 | (ABH) | Optimizacion de bloque para integrar en libreria. Se eliminan marcas no utilizadas. Se reorganizan las variables y se ponen bien los comentarios. |
| 01.00.02 | 24.04.2025 | (HCR) | Se añade gestion de idioma. |
| 01.00.03 | 11.09.2025 | (ABH) | Se eliminan las constantes de idioma dentro del FC. Se utilizan constantes globales para facilitar su traduccion. |
| 02.00.00 | 25.03.2026 | (ABH) | Se cambia lenguaje a SCL. Se eliminan idiomas. Se añade watchdog para comunicaciones. Se integra estado red profinet. |
*)
END_REGION DESCRIPCION
// ==========================================================================================================
REGION TIEMPO_DE_CICLO
// Se almacena el tiempo de ciclo del OB1
"DB1_SYS".TiempoCiclo := LREAL_TO_REAL(RUNTIME("DB1_SYS".Aux.auxRuntime));
"DB1_SYS".TiempoCiclo := ("DB1_SYS".TiempoCiclo * 1000.0);
END_REGION TIEMPO_DE_CICLO
// ==========================================================================================================
REGION GESTION_PULSADORES
// Gestion pulsadores de ack
"DB1_SYS".Pulsador.Ack[0].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_01",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[0]);
"DB1_SYS".Pulsador.Ack[1].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_02",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[1]);
"DB1_SYS".Pulsador.Ack[2].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_03",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[2]);
"DB1_SYS".Pulsador.Ack[3].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_04",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[3]);
"DB1_SYS".Pulsador.Ack[4].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_05",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[4]);
"DB1_SYS".Pulsador.Ack[5].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_06",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[5]);
"DB1_SYS".Pulsador.Ack[6].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_07",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[6]);
"DB1_SYS".Pulsador.Ack[7].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_08",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[7]);
"DB1_SYS".Pulsador.Ack[8].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_09",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[8]);
"DB1_SYS".Pulsador.Ack[9].Permiso := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_ACK_10",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.Ack[9]);
// Gestion pulsador cambio de fecha y hora
"DB1_SYS".Pulsador.EscribirFechaHora.Permiso := TRUE;
"DB1_SYS".Pulsador.EscribirFechaHora.Visibilidad := TRUE;
"FC15026_ZC_PULSADOR"(Pulso1Seg := "DB1_SYS".Pulso1seg,
SP_Tiempo := 0,
TrazaCategoria := "TRZ_CAT_1_SYS",
TrazaIdProceso := 0,
TrazaIdPulsador := "TRZ_SYS_PUL_FECHA",
Usuario := "DB1_SYS".Usuario.Actual,
FechaHoraActual := "DB1_SYS".FechaHoraActual,
Pulsador := "DB1_SYS".Pulsador.EscribirFechaHora);
END_REGION GESTION_PULSADORES
// ==========================================================================================================
REGION GESTION_ACUSE_GENERAL
// Activacion de marca de acuse general
"DB1_SYS".ACK :=
"DB1_SYS".Pulsador.Ack[0].Plc OR
"DB1_SYS".Pulsador.Ack[1].Plc OR
"DB1_SYS".Pulsador.Ack[2].Plc OR
"DB1_SYS".Pulsador.Ack[3].Plc OR
"DB1_SYS".Pulsador.Ack[4].Plc OR
"DB1_SYS".Pulsador.Ack[5].Plc OR
"DB1_SYS".Pulsador.Ack[6].Plc OR
"DB1_SYS".Pulsador.Ack[7].Plc OR
"DB1_SYS".Pulsador.Ack[8].Plc OR
"DB1_SYS".Pulsador.Ack[9].Plc;
END_REGION GESTION_ACUSE_GENERAL
// ==========================================================================================================
REGION GESTION_MARCAS_GENERALES_Y_FLANCOS
// ==========================================================================================================
// Marca siempre a ON
"DB1_SYS".OFF := FALSE;
// Marca siempre a OFF
"DB1_SYS".ON := TRUE;
// Marca primer arranque
"DB1_SYS".ARRANQUE := #CPU_MarcasSistema.%X0;
// ==========================================================================================================
// Pulso por 100 ms
"DB1_SYS".Pulso100ms := #CPU_MarcasCiclo.%X0 AND NOT "DB1_SYS".Aux.P_Trig_Pulso100ms;
// Pulso por 1 segundo
"DB1_SYS".Pulso1seg := #CPU_MarcasCiclo.%X5 AND NOT "DB1_SYS".Aux.P_Trig_Pulso1Seg;
// Pulso por 2 segundos
"DB1_SYS".Pulso2seg := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador2seg += 1;
IF "DB1_SYS".Aux.Contador2seg >= 2 THEN
"DB1_SYS".Pulso2seg := TRUE;
"DB1_SYS".Aux.Contador2seg := 0;
END_IF;
END_IF;
// Pulso por 5 segundos
"DB1_SYS".Pulso5seg := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador5seg += 1;
IF "DB1_SYS".Aux.Contador5seg >= 5 THEN
"DB1_SYS".Pulso5seg := TRUE;
"DB1_SYS".Aux.Contador5seg := 0;
END_IF;
END_IF;
// Pulso por 1 minuto
"DB1_SYS".Pulso1min := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador1min += 1;
IF "DB1_SYS".Aux.Contador1min >= 60 THEN
"DB1_SYS".Pulso1min := TRUE;
"DB1_SYS".Aux.Contador1min := 0;
END_IF;
END_IF;
// Pulso por 1 hora
"DB1_SYS".Pulso1h := FALSE;
IF "DB1_SYS".Pulso1seg THEN
"DB1_SYS".Aux.Contador1h += 1;
IF "DB1_SYS".Aux.Contador1h >= 3600 THEN
"DB1_SYS".Pulso1h := TRUE;
"DB1_SYS".Aux.Contador1h := 0;
END_IF;
END_IF;
// ==========================================================================================================
// Flip Flop 1 segundo
IF "DB1_SYS".Pulso1seg AND NOT "DB1_SYS".FlipFlop1seg THEN
"DB1_SYS".FlipFlop1seg := TRUE;
ELSIF "DB1_SYS".Pulso1seg AND "DB1_SYS".FlipFlop1seg THEN
"DB1_SYS".FlipFlop1seg := FALSE;
END_IF;
// Flip Flop 2 segundos
IF "DB1_SYS".Pulso2seg AND NOT "DB1_SYS".FlipFlop2seg THEN
"DB1_SYS".FlipFlop2seg := TRUE;
ELSIF "DB1_SYS".Pulso2seg AND "DB1_SYS".FlipFlop2seg THEN
"DB1_SYS".FlipFlop2seg := FALSE;
END_IF;
// Flip Flop 5 segundos
IF "DB1_SYS".Pulso5seg AND NOT "DB1_SYS".FlipFlop5seg THEN
"DB1_SYS".FlipFlop5seg := TRUE;
ELSIF "DB1_SYS".Pulso5seg AND "DB1_SYS".FlipFlop5seg THEN
"DB1_SYS".FlipFlop5seg := FALSE;
END_IF;
// ==========================================================================================================
// Watchdog
IF "DB1_SYS".Pulso100ms THEN
"DB1_SYS".WatchDog += 1;
IF "DB1_SYS".WatchDog > 20000 THEN
"DB1_SYS".WatchDog := 0;
END_IF;
END_IF;
// ==========================================================================================================
// Estados anteriores
"DB1_SYS".Aux.P_Trig_Pulso100ms := #CPU_MarcasCiclo.%X0;
"DB1_SYS".Aux.P_Trig_Pulso1Seg := #CPU_MarcasCiclo.%X5;
END_REGION GESTION_MARCAS_GENERALES_Y_FLANCOS
// ==========================================================================================================
REGION FECHA_Y_HORA
// Lectura de fecha y hora actual
#t_RetVal := RD_LOC_T("DB1_SYS".FechaHoraActual);
// Escritura de fecha y hora nueva escrita manualmente desde HMI
IF "DB1_SYS".Pulsador.EscribirFechaHora.Plc THEN
#t_RetVal := WR_SYS_T("DB1_SYS".FechaHoraNuevaManual);
END_IF;
// Escritura de fecha y hora nueva escrita autoamticamente desde Script, Scada, etc...
IF "DB1_SYS".SincronizarFecha THEN
#t_RetVal := WR_SYS_T("DB1_SYS".FechaHoraNuevaAuto);
END_IF;
END_REGION FECHA_Y_HORA
// ==========================================================================================================
REGION USUARIOS
// Gestion de usuario actual para trazas
FOR #for_i := 0 TO 9 DO
IF "DB1_SYS".Usuario.Seleccion[#for_i].Orden THEN
"DB1_SYS".Usuario.Actual := "DB1_SYS".Usuario.Seleccion[#for_i].Usuario;
"DB1_SYS".Usuario.Seleccion[#for_i].Orden := FALSE;
EXIT;
END_IF;
END_FOR;
END_REGION USUARIOS
// ==========================================================================================================
REGION RESET_ENTIDADES
// Reset todas las entidades
// CUIDADO!!!!!!!!
// TIENEN QUE ESTAR TODOS LOS PROCESOS PARADOS!!!!!!
IF "DB1_SYS".ResetEntidades THEN
FOR #for_i := 1 TO "N_MAX_ENTIDAD" DO
"DB6_ENTIDAD".ENT[#for_i].Estado.EnProduccion :=
"DB6_ENTIDAD".ENT[#for_i].Estado.EnCIP :=
"DB6_ENTIDAD".ENT[#for_i].Estado.EnSIP :=
"DB6_ENTIDAD".ENT[#for_i].Estado.ConProducto :=
"DB6_ENTIDAD".ENT[#for_i].Estado.ConAgua :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Vacia :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Sucia := FALSE;
"DB6_ENTIDAD".ENT[#for_i].Habilitar :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Disponible :=
"DB6_ENTIDAD".ENT[#for_i].Estado.Limpia := TRUE;
"DB6_ENTIDAD".ENT[#for_i].Estado.CodEstado := 0;
"DB6_ENTIDAD".ENT[#for_i].Asignacion := 0;
"DB6_ENTIDAD".ENT[#for_i].ID := #for_i;
END_FOR;
"DB1_SYS".ResetEntidades := FALSE;
END_IF;
END_REGION RESET_ENTIDADES
// ==========================================================================================================
REGION CHECKSUM
// Gestion de checksum del programa
"DB3_CHECKSUM"();
END_REGION CHECKSUM
// ==========================================================================================================
REGION RED_PROFINET
// Comprobacion de red profinet
#t_RetVal := DeviceStates(LADDR := #RedProfinet, MODE := 4, STATE := "DB1_SYS".RedProfinet);
END_REGION RED_PROFINET
END_FUNCTION