Primera version
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
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,10 @@
|
||||
DATA_BLOCK "DB3_CHECKSUM"
|
||||
{ S7_Optimized_Access := 'TRUE' }
|
||||
VERSION : 0.1
|
||||
NON_RETAIN
|
||||
"FB3_ZC_CHECKSUM"
|
||||
|
||||
BEGIN
|
||||
|
||||
END_DATA_BLOCK
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
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,410 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user