Add Syrup Line MFM Prep DAR Function Block Implementation

- Implemented the "Syrup_Line_MFM_Prep_DAR" function block with optimized access.
- Defined input and output variables for the function block.
- Added various internal state variables and temporary variables for processing.
- Converted logic from LAD and STL to structured text for the syrup preparation process.
- Included fuzzy logic for syrup density checks and syrup line manual drain conditions.
- Integrated timeout handling and pump status management within the function block.
- Ensured compatibility with existing system variables and procedures.
This commit is contained in:
Miguel 2025-08-28 17:32:18 +02:00
parent c907112293
commit fab8c95038
7 changed files with 53106 additions and 72 deletions

View File

@ -119,12 +119,3 @@ print(f"DEBUG: Processing {instr_type} - UID: {instr_uid}")
grep "ERROR\|WARNING\|TODO" log_*.txt grep "ERROR\|WARNING\|TODO" log_*.txt
``` ```
### 6. Checklist de Calidad
Antes de considerar un error "resuelto":
- [ ] No hay comentarios TODO en el SCL
- [ ] No hay líneas duplicadas de P_TRIG
- [ ] No hay acceso directo a memoria (%DB.DBX)
- [ ] Todas las variables de timer están declaradas
- [ ] El código SCL es sintácticamente válido
- [ ] La lógica funcional es equivalente al LAD original

View File

@ -2,14 +2,23 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sympy import sympy
import traceback import traceback
# Asumiendo que estas funciones ahora existen y están adaptadas # Asumiendo que estas funciones ahora existen y están adaptadas
from .processor_utils import get_sympy_representation, sympy_expr_to_scl, format_variable_name, get_target_scl_name from .processor_utils import (
get_sympy_representation,
sympy_expr_to_scl,
format_variable_name,
get_target_scl_name,
)
from .symbol_manager import SymbolManager # Necesitamos pasar el symbol_manager from .symbol_manager import SymbolManager # Necesitamos pasar el symbol_manager
# Definir sufijo globalmente o importar # Definir sufijo globalmente o importar
SCL_SUFFIX = "_sympy_processed" SCL_SUFFIX = "_sympy_processed"
def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManager, data):
def process_call(
instruction, network_id, sympy_map, symbol_manager: SymbolManager, data
):
instr_uid = instruction["instruction_uid"] instr_uid = instruction["instruction_uid"]
instr_type_original = instruction.get("type", "") # Tipo antes de añadir sufijo instr_type_original = instruction.get("type", "") # Tipo antes de añadir sufijo
if instr_type_original.endswith(SCL_SUFFIX) or "_error" in instr_type_original: if instr_type_original.endswith(SCL_SUFFIX) or "_error" in instr_type_original:
@ -25,7 +34,11 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
# --- Manejo de EN --- # --- Manejo de EN ---
en_input = instruction["inputs"].get("en") en_input = instruction["inputs"].get("en")
sympy_en_expr = get_sympy_representation(en_input, network_id, sympy_map, symbol_manager) if en_input else sympy.true sympy_en_expr = (
get_sympy_representation(en_input, network_id, sympy_map, symbol_manager)
if en_input
else sympy.true
)
if sympy_en_expr is None: if sympy_en_expr is None:
# print(f"DEBUG Call {instr_uid}: EN dependency not ready.") # print(f"DEBUG Call {instr_uid}: EN dependency not ready.")
@ -43,7 +56,9 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
if pin_name not in processed_inputs: if pin_name not in processed_inputs:
source_info = instruction["inputs"][pin_name] source_info = instruction["inputs"][pin_name]
# Obtener la representación de la fuente (puede ser SymPy o Constante/String) # Obtener la representación de la fuente (puede ser SymPy o Constante/String)
source_sympy_or_const = get_sympy_representation(source_info, network_id, sympy_map, symbol_manager) source_sympy_or_const = get_sympy_representation(
source_info, network_id, sympy_map, symbol_manager
)
if source_sympy_or_const is None: if source_sympy_or_const is None:
# print(f"DEBUG Call {instr_uid}: Input param '{pin_name}' dependency not ready.") # print(f"DEBUG Call {instr_uid}: Input param '{pin_name}' dependency not ready.")
@ -52,7 +67,9 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
# Convertir la expresión/constante a SCL para la llamada # Convertir la expresión/constante a SCL para la llamada
# Detectar si es una dirección indirecta (comienza con %) # Detectar si es una dirección indirecta (comienza con %)
is_address_ref = isinstance(source_sympy_or_const, str) and source_sympy_or_const.startswith("%") is_address_ref = isinstance(
source_sympy_or_const, str
) and source_sympy_or_const.startswith("%")
# El nombre del pin SÍ necesita formateo # El nombre del pin SÍ necesita formateo
pin_name_scl = format_variable_name(pin_name) pin_name_scl = format_variable_name(pin_name)
@ -63,7 +80,9 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
scl_call_params.append(f"{pin_name_scl} => {source_sympy_or_const}") scl_call_params.append(f"{pin_name_scl} => {source_sympy_or_const}")
else: else:
# Es un parámetro normal (In) # Es un parámetro normal (In)
param_scl_value = sympy_expr_to_scl(source_sympy_or_const, symbol_manager) param_scl_value = sympy_expr_to_scl(
source_sympy_or_const, symbol_manager
)
scl_call_params.append(f"{pin_name_scl} := {param_scl_value}") scl_call_params.append(f"{pin_name_scl} := {param_scl_value}")
processed_inputs.add(pin_name) processed_inputs.add(pin_name)
@ -71,10 +90,21 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
if not dependencies_resolved: if not dependencies_resolved:
return False return False
# --- Construcción de la Llamada SCL (similar a antes) --- # --- Construcción de la Llamada SCL ---
scl_call_body = "" scl_call_body = ""
param_string = ", ".join(scl_call_params) param_string = ", ".join(scl_call_params)
# Verificar si hay una asignación de valor de retorno para FC
ret_val_assignment = None
if block_type == "FC":
ret_val_outputs = instruction.get("outputs", {}).get("Ret_Val", [])
if ret_val_outputs and len(ret_val_outputs) > 0:
# Hay una variable que debe recibir el valor de retorno
ret_val_dest = ret_val_outputs[0] # Tomar el primer destino
if ret_val_dest.get("scope") in ["LocalVariable", "GlobalVariable"]:
ret_val_var_name = ret_val_dest.get("name", "").strip('"')
ret_val_assignment = format_variable_name(ret_val_var_name)
if block_type == "FB": if block_type == "FB":
if not instance_db_scl: if not instance_db_scl:
print(f"Error: Call FB '{block_name_scl}' (UID {instr_uid}) sin instancia.") print(f"Error: Call FB '{block_name_scl}' (UID {instr_uid}) sin instancia.")
@ -83,9 +113,16 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
return True return True
scl_call_body = f"{instance_db_scl}({param_string});" scl_call_body = f"{instance_db_scl}({param_string});"
elif block_type == "FC": elif block_type == "FC":
if ret_val_assignment:
# FC con valor de retorno asignado
scl_call_body = f"{ret_val_assignment} := {block_name_scl}({param_string});"
else:
# FC sin valor de retorno o valor de retorno no utilizado
scl_call_body = f"{block_name_scl}({param_string});" scl_call_body = f"{block_name_scl}({param_string});"
else: else:
print(f"Advertencia: Tipo de bloque no soportado para Call UID {instr_uid}: {block_type}") print(
f"Advertencia: Tipo de bloque no soportado para Call UID {instr_uid}: {block_type}"
)
scl_call_body = f"// ERROR: Call a bloque tipo '{block_type}' no soportado: {block_name_scl}" scl_call_body = f"// ERROR: Call a bloque tipo '{block_type}' no soportado: {block_name_scl}"
instruction["type"] = f"Call_{block_type}_error" # Marcar como error instruction["type"] = f"Call_{block_type}_error" # Marcar como error
@ -94,8 +131,10 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
if sympy_en_expr != sympy.true: if sympy_en_expr != sympy.true:
# Simplificar la condición EN ANTES de convertirla a SCL # Simplificar la condición EN ANTES de convertirla a SCL
try: try:
#simplified_en_expr = sympy.simplify_logic(sympy_en_expr, force=True) # simplified_en_expr = sympy.simplify_logic(sympy_en_expr, force=True)
simplified_en_expr = sympy.logic.boolalg.to_dnf(sympy_en_expr, simplify=True) simplified_en_expr = sympy.logic.boolalg.to_dnf(
sympy_en_expr, simplify=True
)
except Exception as e: except Exception as e:
print(f"Error simplifying EN for Call {instr_uid}: {e}") print(f"Error simplifying EN for Call {instr_uid}: {e}")
simplified_en_expr = sympy_en_expr # Fallback simplified_en_expr = sympy_en_expr # Fallback
@ -108,31 +147,43 @@ def process_call(instruction, network_id, sympy_map, symbol_manager: SymbolManag
# --- Actualizar Instrucción y Mapa SymPy --- # --- Actualizar Instrucción y Mapa SymPy ---
instruction["scl"] = scl_final # Guardar el SCL final generado instruction["scl"] = scl_final # Guardar el SCL final generado
instruction["type"] = (f"Call_{block_type}{SCL_SUFFIX}" if "_error" not in instruction["type"] else instruction["type"]) instruction["type"] = (
f"Call_{block_type}{SCL_SUFFIX}"
if "_error" not in instruction["type"]
else instruction["type"]
)
# Actualizar sympy_map con el estado ENO (es la expresión SymPy de EN) # Actualizar sympy_map con el estado ENO (es la expresión SymPy de EN)
map_key_eno = (network_id, instr_uid, "eno") map_key_eno = (network_id, instr_uid, "eno")
sympy_map[map_key_eno] = sympy_en_expr # Guardar la expresión SymPy para ENO sympy_map[map_key_eno] = sympy_en_expr # Guardar la expresión SymPy para ENO
# Propagar valores de salida (requiere info de interfaz o heurística) # Propagar valores de salida para FC con valor de retorno
# Si se sabe que hay una salida 'MyOutput', se podría añadir su SCL al mapa if block_type == "FC" and ret_val_assignment:
# Ejemplo MUY simplificado: # Para FC con valor de retorno, registrar la variable de destino en el mapa
# for pin_name, dest_list in instruction.get("outputs", {}).items(): map_key_ret = (network_id, instr_uid, "Ret_Val")
# if pin_name != 'eno' and dest_list: # Asumir que hay un destino # Crear un símbolo SymPy para la variable de destino
# map_key_out = (network_id, instr_uid, pin_name) ret_val_symbol = sympy.symbols(ret_val_assignment.replace('"', ""))
# if block_type == "FB" and instance_db_scl: sympy_map[map_key_ret] = ret_val_symbol
# sympy_map[map_key_out] = f"{instance_db_scl}.{format_variable_name(pin_name)}" # Guardar el *string* de acceso SCL
# # Para FCs es más complejo, necesitaría asignación explícita a temp # Para FB, propagar valores de salida (requiere info de interfaz o heurística)
# # else: # FC output -> necesita temp var if block_type == "FB" and instance_db_scl:
# # temp_var = generate_temp_var_name(...) for pin_name, dest_list in instruction.get("outputs", {}).items():
# # sympy_map[map_key_out] = temp_var if (
pin_name not in ["eno", "Ret_Val"] and dest_list
): # FB outputs específicos
map_key_out = (network_id, instr_uid, pin_name)
fb_output_access = f"{instance_db_scl}.{format_variable_name(pin_name)}"
sympy_map[map_key_out] = (
fb_output_access # Guardar el string de acceso SCL
)
return True return True
# --- Processor Information Function --- # --- Processor Information Function ---
def get_processor_info(): def get_processor_info():
"""Devuelve la información para las llamadas a FC y FB.""" """Devuelve la información para las llamadas a FC y FB."""
return [ return [
{'type_name': 'call_fc', 'processor_func': process_call, 'priority': 6}, {"type_name": "call_fc", "processor_func": process_call, "priority": 6},
{'type_name': 'call_fb', 'processor_func': process_call, 'priority': 6} {"type_name": "call_fb", "processor_func": process_call, "priority": 6},
] ]

View File

@ -2,12 +2,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sympy import sympy
import traceback import traceback
from .processor_utils import get_sympy_representation, format_variable_name # No necesita sympy_expr_to_scl aquí from .processor_utils import (
get_sympy_representation,
format_variable_name,
) # No necesita sympy_expr_to_scl aquí
from .symbol_manager import SymbolManager # Necesita acceso al manager from .symbol_manager import SymbolManager # Necesita acceso al manager
SCL_SUFFIX = "_sympy_processed" SCL_SUFFIX = "_sympy_processed"
def process_comparison(instruction, network_id, sympy_map, symbol_manager: SymbolManager, data):
def process_comparison(
instruction, network_id, sympy_map, symbol_manager: SymbolManager, data
):
""" """
Genera la expresión SymPy para Comparadores (GT, LT, GE, LE, NE). Genera la expresión SymPy para Comparadores (GT, LT, GE, LE, NE).
El resultado se propaga por sympy_map['out']. El resultado se propaga por sympy_map['out'].
@ -24,23 +30,35 @@ def process_comparison(instruction, network_id, sympy_map, symbol_manager: Symbo
"LT": sympy.Lt, # Less Than < "LT": sympy.Lt, # Less Than <
"GE": sympy.Ge, # Greater or Equal >= "GE": sympy.Ge, # Greater or Equal >=
"LE": sympy.Le, # Less or Equal <= "LE": sympy.Le, # Less or Equal <=
"NE": sympy.Ne # Not Equal <> (sympy.Ne maneja esto) "NE": sympy.Ne, # Not Equal <> (sympy.Ne maneja esto)
} }
sympy_relation_func = op_map.get(instr_type_original.upper()) sympy_relation_func = op_map.get(instr_type_original.upper())
if not sympy_relation_func: if not sympy_relation_func:
instruction["scl"] = f"// ERROR: Tipo de comparación no soportado para SymPy: {instr_type_original}" instruction["scl"] = (
f"// ERROR: Tipo de comparación no soportado para SymPy: {instr_type_original}"
)
instruction["type"] = instr_type_original + "_error" instruction["type"] = instr_type_original + "_error"
return True return True
# Obtener operandos como expresiones SymPy o constantes/strings # Obtener operandos como expresiones SymPy o constantes/strings
in1_info = instruction["inputs"].get("in1") in1_info = instruction["inputs"].get("in1")
in2_info = instruction["inputs"].get("in2") in2_info = instruction["inputs"].get("in2")
op1_sympy = get_sympy_representation(in1_info, network_id, sympy_map, symbol_manager) op1_sympy = get_sympy_representation(
op2_sympy = get_sympy_representation(in2_info, network_id, sympy_map, symbol_manager) in1_info, network_id, sympy_map, symbol_manager
)
op2_sympy = get_sympy_representation(
in2_info, network_id, sympy_map, symbol_manager
)
# Obtener 'pre' (RLO anterior) como expresión SymPy # Obtener 'pre' (RLO anterior) como expresión SymPy
pre_input = instruction["inputs"].get("pre") # Asumiendo que 'pre' es la entrada RLO pre_input = instruction["inputs"].get(
sympy_pre_rlo = get_sympy_representation(pre_input, network_id, sympy_map, symbol_manager) if pre_input else sympy.true "pre"
) # Asumiendo que 'pre' es la entrada RLO
sympy_pre_rlo = (
get_sympy_representation(pre_input, network_id, sympy_map, symbol_manager)
if pre_input
else sympy.true
)
# Verificar dependencias # Verificar dependencias
if op1_sympy is None or op2_sympy is None or sympy_pre_rlo is None: if op1_sympy is None or op2_sympy is None or sympy_pre_rlo is None:
@ -54,22 +72,29 @@ def process_comparison(instruction, network_id, sympy_map, symbol_manager: Symbo
op1_eval = sympy.sympify(op1_sympy) if isinstance(op1_sympy, str) else op1_sympy op1_eval = sympy.sympify(op1_sympy) if isinstance(op1_sympy, str) else op1_sympy
op2_eval = sympy.sympify(op2_sympy) if isinstance(op2_sympy, str) else op2_sympy op2_eval = sympy.sympify(op2_sympy) if isinstance(op2_sympy, str) else op2_sympy
comparison_expr = sympy_relation_func(op1_eval, op2_eval) comparison_expr = sympy_relation_func(op1_eval, op2_eval)
# IMPORTANTE: Combinar la comparación con la precondición PRE
# El resultado final es: PRE AND (comparación)
final_expr = sympy.And(sympy_pre_rlo, comparison_expr)
except (SyntaxError, TypeError, ValueError) as e: except (SyntaxError, TypeError, ValueError) as e:
print(f"Error creating SymPy comparison for {instr_uid}: {e}") print(f"Error creating SymPy comparison for {instr_uid}: {e}")
instruction["scl"] = f"// ERROR creando expr SymPy Comparison {instr_uid}: {e}" instruction["scl"] = f"// ERROR creando expr SymPy Comparison {instr_uid}: {e}"
instruction["type"] = instr_type_original + "_error" instruction["type"] = instr_type_original + "_error"
return True return True
# Guardar resultado en el mapa para 'out' (es una expresión booleana SymPy) # Guardar resultado en el mapa para 'out' (es una expresión booleana SymPy combinada con PRE)
map_key_out = (network_id, instr_uid, "out") map_key_out = (network_id, instr_uid, "out")
sympy_map[map_key_out] = comparison_expr sympy_map[map_key_out] = final_expr
# Guardar el RLO de entrada ('pre') como ENO en el mapa SymPy # Guardar el RLO de entrada ('pre') como ENO en el mapa SymPy
map_key_eno = (network_id, instr_uid, "eno") map_key_eno = (network_id, instr_uid, "eno")
sympy_map[map_key_eno] = sympy_pre_rlo sympy_map[map_key_eno] = sympy_pre_rlo
# Marcar como procesado, SCL principal es solo comentario # Marcar como procesado, SCL principal es solo comentario
instruction["scl"] = f"// SymPy Comparison {instr_type_original}: {comparison_expr}" # Comentario opcional instruction["scl"] = (
f"// SymPy Comparison {instr_type_original}: {final_expr}" # Comentario opcional
)
instruction["type"] = instr_type_original + SCL_SUFFIX instruction["type"] = instr_type_original + SCL_SUFFIX
return True return True
@ -78,10 +103,10 @@ def process_comparison(instruction, network_id, sympy_map, symbol_manager: Symbo
def get_processor_info(): def get_processor_info():
"""Devuelve la información para los comparadores (excepto EQ, que debe ser similar).""" """Devuelve la información para los comparadores (excepto EQ, que debe ser similar)."""
return [ return [
{'type_name': 'gt', 'processor_func': process_comparison, 'priority': 2}, {"type_name": "gt", "processor_func": process_comparison, "priority": 2},
{'type_name': 'lt', 'processor_func': process_comparison, 'priority': 2}, {"type_name": "lt", "processor_func": process_comparison, "priority": 2},
{'type_name': 'ge', 'processor_func': process_comparison, 'priority': 2}, {"type_name": "ge", "processor_func": process_comparison, "priority": 2},
{'type_name': 'le', 'processor_func': process_comparison, 'priority': 2}, {"type_name": "le", "processor_func": process_comparison, "priority": 2},
{'type_name': 'ne', 'processor_func': process_comparison, 'priority': 2} {"type_name": "ne", "processor_func": process_comparison, "priority": 2},
# Asegúrate de tener también un procesador para 'eq' usando sympy.Eq # Asegúrate de tener también un procesador para 'eq' usando sympy.Eq
] ]

View File

@ -0,0 +1,269 @@
// FB1813
// Block Type: FB
// Block Name (Original): Syrup Line MFM Prep DAR
// Block Number: 1813
// Original Network Languages: LAD, STL
FUNCTION_BLOCK "Syrup_Line_MFM_Prep_DAR"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
IN : Bool;
PT : Time;
END_VAR
VAR_OUTPUT
Q : Bool;
ET : Time;
END_VAR
VAR_STAT
mStepNum : Int;
mTimeStep : Int;
Real_Time : Time;
mTransition : Bool;
mSyrLineMFMPrepONS : Bool;
mSyrupLineManualDrainSR : Bool;
mQTM306_PrepReqTPON : Bool;
mQTM306_PrepReqTP1ON : Bool;
mDelayON_StopPumpON : Bool;
mDelayON_SyrupMinON : Bool;
mDelayON_PumpStatusON : Bool;
mHVP302_TONON : Bool;
mQTM306_Prep_TimeOutON : Bool;
mQTM306_PrepReqTP : "TP:v1.0";
mQTM306_PrepReqTP1 : "TP:v1.0";
mDelayON_StopPump : "TON:v1.0";
mDelayON_SyrupMin : "TON:v1.0";
mDelayON_PumpStatus : "TON:v1.0";
mHVP302_TON : "TON:v1.0";
mQTM306_Prep_TimeOut : "TON:v1.0";
END_VAR
VAR_TEMP
mDummy : Bool;
mAux1 : Real;
mAux2 : Real;
mTimeOutElapsed : Bool;
mStopPumpP2 : Bool;
mSyrMinLevel : Bool;
mPumpP2Running : Bool;
mWaterCountAcheaved : Bool;
mSyrupLineManualDrained : Bool;
mFuzzyNetOut : Bool;
Out_Time_DI : DInt;
Real_Time_S5 : S5Time;
mProcSlctd : Bool;
mFuzzyNetAdd1 : Real;
mFuzzyNetAdd2 : Real;
mFuzzyNetAdd3 : Real;
mSyrBrixAux : Real;
mSyrBrixAux_1 : Real;
Aux_Somma_Lt : Real;
END_VAR
#_1S : Bool; // Auto-generated temporary
#_4S : Bool; // Auto-generated temporary
#_4S_600MS : Bool; // Auto-generated temporary
#_5S : Bool; // Auto-generated temporary
#TON_INSTANCE_26_dup3 : TON; // Auto-generated temporary
#TON_INSTANCE_26_dup5 : TON; // Auto-generated temporary
#TON_INSTANCE_27_dup4 : TON; // Auto-generated temporary
#TON_INSTANCE_30_dup5 : TON; // Auto-generated temporary
#TP_INSTANCE_44 : TP; // Auto-generated temporary
BEGIN
// Network 1: (Original Language: LAD)
%DB960.DBX56.0 := ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Blender_Variables_Pers"."gWaterRecipe") OR ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode");
// Network 2: SyrLineMFMPrepReq (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"Tag_69" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone") - Mem: "Tag_69"
#TP_INSTANCE_44(IN := "System_RunOut_Variables"."FastChangeOverActivated" AND "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone" AND "HMI_Variables_Cmd"."GLOBAL_CMD"."_EnableNextRecipe" AND "System_RunOut_Variables"."NextRecipeOk" AND NOT %DB960.DBX56.6, PT := T#1S);
%DB960.DBX56.1 := ("mQTM306_PrepReqTP1ON" AND %DB960.DBX56.0) OR (%DB960.DBX56.0 AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Tag_69" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone");
// Network 3: (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"mSyrLineMFMPrepONS" := %DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated"; // P_TRIG(%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") - Mem: "mSyrLineMFMPrepONS"
%DB960.DBX56.2 := "gBlenderCIPMode" OR "Blender_Variables_Pers"."gWaterRecipe" OR ("gEmergencyPressed" AND %DB960.DBX56.3) OR ("Procedure_Variables"."SyrupLineRinse"."Latch" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("gBlenderRinseMode" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") OR (%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "mSyrLineMFMPrepONS");
// Network 4: (Original Language: LAD)
IF ("Procedure_Variables"."Blender_Rinse"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("Procedure_Variables"."Syr_RunOut"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("CIP_Program_Variables"."Status"."Started" AND NOT "AUX MASTER VALIDATION") THEN
%DB960.DBX57.0 := FALSE;
END_IF;
// Network 5: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mStepNum" := 0;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
%DB960.DBX56.6 := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mWaterCountAcheaved" := FALSE;
END_IF;
// Network 6: (Original Language: LAD)
%DB960.DBX56.5 := "HMI_Device"."PPP302"."Alarm" OR "HMI_Device"."SyrupRoom_SyrupPump"."Alarm" OR NOT "HMI_Digital"."PSM311"."Filtered";
// Network 7: (Original Language: LAD)
%DB960.DBX56.3 := (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6);
IF (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) THEN
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 3;
END_IF;
// Network 8: (Original Language: LAD)
%DB960.DBX56.4 := %DB960.DBX56.3 AND NOT %DB960.DBX56.5;
// Network 9: MIX - (Original Language: LAD)
"mAux1" := "Blender_Variables"."gMinProduction" / 6.0;
SEL_R(G := Ne("mAux1", 0.0), IN0 := 1.0, IN1 := "mAux1");
"mAux2" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" * 1.5;
"mAux1" := "mAux2" / "mAux1";
"Out_Time_DI" := CEIL("mAux1");
"mDummy" := TRUE;
// Network 10: (Original Language: STL)
// #Out_Time_DI (DINT) converted in #Real_Time_S5 (S5Time)
// Use L#1000 IF #Out_Time_DI is in ms
// --- BEGIN STL Network 10 ---
```stl
L "Out_Time_DI"
L 1000
MUL_D
T "Real_Time"
```
// --- END STL Network 10 ---
// Network 11: SyrLineMFMPrep_TimeOut (Original Language: LAD)
#TON_INSTANCE_26_dup3(IN := %DBX56.3, PT := "Real_Time");
"mTimeOutElapsed" := "mQTM306_Prep_TimeOutON";
// Network 12: DelayON_StopPump (Original Language: LAD)
#TON_INSTANCE_27_dup4(IN := NOT "gIN_SyrTank_MinLvl", PT := T#4S_600MS);
"mStopPumpP2" := "mDelayON_StopPumpON";
// Network 13: DelayON_SyrupMin (Original Language: LAD)
"mSyrMinLevel" := "gIN_SyrTank_MinLvl";
// Network 14: DelayON_PumpStatus (Original Language: LAD)
#TON_INSTANCE_26_dup5(IN := "HMI_Device"."PPP302"."Out", PT := T#4S);
"mPumpP2Running" := "mDelayON_PumpStatusON";
// Network 15: SYRUP LINE MANUAL DRAIN (Original Language: LAD)
// THIS PROCEDURE HAS TO BE DONE BEFORE TO SELECT THE SYRUP LINE STARTUP.
#TON_INSTANCE_30_dup5(IN := "gIN_HVP301_Aux", PT := T#5S);
// Network 16: MIX - HMI Variables Cmd (Original Language: LAD)
"mSyrupLineManualDrained" := %DB960.DBX56.3 AND "mSyrupLineManualDrainSR" AND NOT "gIN_HVP301_Aux";
// Network 17: (Original Language: LAD)
IF NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" THEN
"Blender_Variables_Pers"."gSyrLinePrepCountInit" := "Profibus_Variables"."gFTP302_Tot";
END_IF;
// Network 18: BRIX PRODUCT STARTUP THRESHOLD (Original Language: LAD)
"mSyrBrixAux" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupBrix" * "HMI_Blender_Parameters"."ProcessSetup"."_PercSyrupBrixSyrStarUp";
"mSyrBrixAux_1" := "mSyrBrixAux" / 100.0;
"Blender_Constants"."gSugaredSyrupBrixThrsd" := "mSyrBrixAux_1";
// Network 19: Fuzzy Net (Original Language: LAD)
SEL_R(G := "M_validat_27_01_25" AND "gPV_SyrDensOk" AND "HMI_Device"."PPP302"."Out" AND NOT "Blender_Variables_Pers"."gSugarBeverage", IN0 := 0.0, IN1 := 101.0);
IF "Blender_Variables_Pers"."gSugarBeverage" THEN
"mAux1" := "Profibus_Variables"."gFTP302_Brix" * "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupFactor";
END_IF;
SEL_R(G := "gIN_SyrTank_MinLvl" AND ("mAux1" > "Blender_Constants"."gSugaredSyrupBrixThrsd"), IN0 := 0.0, IN1 := 101.0);
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"Aux_Somma_Lt" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" + %DBD784;
END_IF;
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" := "Profibus_Variables"."gFTP302_Tot" - "Blender_Variables_Pers"."gSyrLinePrepCountInit";
END_IF;
"mWaterCountAcheaved" := NOT "mSyrupLineManualDrainSR" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt");
SEL_R(G := "HMI_Device"."PPP302"."Out" AND NOT "mSyrupLineManualDrainSR" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt"), IN0 := 0.0, IN1 := 101.0);
"mDummy" := TRUE;
// Network 20: Fuzzy Net (Original Language: LAD)
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd2";
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd3";
"mFuzzyNetOut" := "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND ("mFuzzyNetAdd1" > 100.0);
IF "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX MASTER VALIDATION" AND ("mFuzzyNetAdd1" > 100.0) THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := TRUE;
END_IF;
// Network 21: Opeartor Run Syrup Prep (Original Language: LAD)
_HMI_Alarms___gH_Message__8_ := "gBlenderProdMode" AND "Procedure_Variables"."FTP302Line_Preparation"."Qualifier" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode" AND NOT "Procedure_Variables"."FTP302_StartUp"."Latch" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Done" AND NOT "System_RunOut_Variables"."FastChangeOverActivated";
// Network 22: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
"HMI_Variables_Status"."Procedures"."TP301PrepRun" := "Procedure_Variables"."FTP302Line_Preparation"."Latch";
// Network 23: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
_HMI_Alarms___gH_Status__3_ := "Procedure_Variables"."FTP302Line_Preparation"."Latch" OR "Procedure_Variables"."FTP302_StartUp"."Latch";
// Network 24: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Running" THEN
Syrup_Line_MFM_Prep_Seq(FuzzyNetOut := "mFuzzyNetOut", SyrupLineManualDrained := "mSyrupLineManualDrained", WaterCountAcheaved := "mWaterCountAcheaved", mStep := "mStepNum", mStopPumpP2 := "mStopPumpP2", mSyrMinLevel := "mDelayON_SyrupMinON", mTimer := "mTimeStep", mTransition := "mTransition");
END_IF;
// Network 25: (Original Language: LAD)
"HMI_Variables_Status"."System_Run_Out"."TP301PrepDone" := "Procedure_Variables"."FTP302Line_Preparation"."Done";
END_FUNCTION_BLOCK

View File

@ -0,0 +1,269 @@
// FB1813
// Block Type: FB
// Block Name (Original): Syrup Line MFM Prep DAR
// Block Number: 1813
// Original Network Languages: LAD, STL
FUNCTION_BLOCK "Syrup_Line_MFM_Prep_DAR"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
IN : Bool;
PT : Time;
END_VAR
VAR_OUTPUT
Q : Bool;
ET : Time;
END_VAR
VAR_STAT
mStepNum : Int;
mTimeStep : Int;
Real_Time : Time;
mTransition : Bool;
mSyrLineMFMPrepONS : Bool;
mSyrupLineManualDrainSR : Bool;
mQTM306_PrepReqTPON : Bool;
mQTM306_PrepReqTP1ON : Bool;
mDelayON_StopPumpON : Bool;
mDelayON_SyrupMinON : Bool;
mDelayON_PumpStatusON : Bool;
mHVP302_TONON : Bool;
mQTM306_Prep_TimeOutON : Bool;
mQTM306_PrepReqTP : "TP:v1.0";
mQTM306_PrepReqTP1 : "TP:v1.0";
mDelayON_StopPump : "TON:v1.0";
mDelayON_SyrupMin : "TON:v1.0";
mDelayON_PumpStatus : "TON:v1.0";
mHVP302_TON : "TON:v1.0";
mQTM306_Prep_TimeOut : "TON:v1.0";
END_VAR
VAR_TEMP
mDummy : Bool;
mAux1 : Real;
mAux2 : Real;
mTimeOutElapsed : Bool;
mStopPumpP2 : Bool;
mSyrMinLevel : Bool;
mPumpP2Running : Bool;
mWaterCountAcheaved : Bool;
mSyrupLineManualDrained : Bool;
mFuzzyNetOut : Bool;
Out_Time_DI : DInt;
Real_Time_S5 : S5Time;
mProcSlctd : Bool;
mFuzzyNetAdd1 : Real;
mFuzzyNetAdd2 : Real;
mFuzzyNetAdd3 : Real;
mSyrBrixAux : Real;
mSyrBrixAux_1 : Real;
Aux_Somma_Lt : Real;
END_VAR
#_1S : Bool; // Auto-generated temporary
#_4S : Bool; // Auto-generated temporary
#_4S_600MS : Bool; // Auto-generated temporary
#_5S : Bool; // Auto-generated temporary
#TON_INSTANCE_26_dup3 : TON; // Auto-generated temporary
#TON_INSTANCE_26_dup5 : TON; // Auto-generated temporary
#TON_INSTANCE_27_dup4 : TON; // Auto-generated temporary
#TON_INSTANCE_30_dup5 : TON; // Auto-generated temporary
#TP_INSTANCE_44 : TP; // Auto-generated temporary
BEGIN
// Network 1: (Original Language: LAD)
%DB960.DBX56.0 := ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Blender_Variables_Pers"."gWaterRecipe") OR ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode");
// Network 2: SyrLineMFMPrepReq (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"Tag_69" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone") - Mem: "Tag_69"
#TP_INSTANCE_44(IN := "System_RunOut_Variables"."FastChangeOverActivated" AND "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone" AND "HMI_Variables_Cmd"."GLOBAL_CMD"."_EnableNextRecipe" AND "System_RunOut_Variables"."NextRecipeOk" AND NOT %DB960.DBX56.6, PT := T#1S);
%DB960.DBX56.1 := ("mQTM306_PrepReqTP1ON" AND %DB960.DBX56.0) OR (%DB960.DBX56.0 AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Tag_69" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone");
// Network 3: (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"mSyrLineMFMPrepONS" := %DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated"; // P_TRIG(%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") - Mem: "mSyrLineMFMPrepONS"
%DB960.DBX56.2 := "gBlenderCIPMode" OR "Blender_Variables_Pers"."gWaterRecipe" OR ("gEmergencyPressed" AND %DB960.DBX56.3) OR ("Procedure_Variables"."SyrupLineRinse"."Latch" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("gBlenderRinseMode" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") OR (%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "mSyrLineMFMPrepONS");
// Network 4: (Original Language: LAD)
IF ("Procedure_Variables"."Blender_Rinse"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("Procedure_Variables"."Syr_RunOut"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("CIP_Program_Variables"."Status"."Started" AND NOT "AUX MASTER VALIDATION") THEN
%DB960.DBX57.0 := FALSE;
END_IF;
// Network 5: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mStepNum" := 0;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
%DB960.DBX56.6 := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mWaterCountAcheaved" := FALSE;
END_IF;
// Network 6: (Original Language: LAD)
%DB960.DBX56.5 := "HMI_Device"."PPP302"."Alarm" OR "HMI_Device"."SyrupRoom_SyrupPump"."Alarm" OR NOT "HMI_Digital"."PSM311"."Filtered";
// Network 7: (Original Language: LAD)
%DB960.DBX56.3 := (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6);
IF (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) THEN
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 3;
END_IF;
// Network 8: (Original Language: LAD)
%DB960.DBX56.4 := %DB960.DBX56.3 AND NOT %DB960.DBX56.5;
// Network 9: MIX - (Original Language: LAD)
"mAux1" := "Blender_Variables"."gMinProduction" / 6.0;
mAux1 := SEL_R(G := Ne("mAux1", 0.0), IN0 := 1.0, IN1 := "mAux1");
"mAux2" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" * 1.5;
"mAux1" := "mAux2" / "mAux1";
"Out_Time_DI" := CEIL("mAux1");
"mDummy" := TRUE;
// Network 10: (Original Language: STL)
// #Out_Time_DI (DINT) converted in #Real_Time_S5 (S5Time)
// Use L#1000 IF #Out_Time_DI is in ms
// --- BEGIN STL Network 10 ---
```stl
L "Out_Time_DI"
L 1000
MUL_D
T "Real_Time"
```
// --- END STL Network 10 ---
// Network 11: SyrLineMFMPrep_TimeOut (Original Language: LAD)
#TON_INSTANCE_26_dup3(IN := %DBX56.3, PT := "Real_Time");
"mTimeOutElapsed" := "mQTM306_Prep_TimeOutON";
// Network 12: DelayON_StopPump (Original Language: LAD)
#TON_INSTANCE_27_dup4(IN := NOT "gIN_SyrTank_MinLvl", PT := T#4S_600MS);
"mStopPumpP2" := "mDelayON_StopPumpON";
// Network 13: DelayON_SyrupMin (Original Language: LAD)
"mSyrMinLevel" := "gIN_SyrTank_MinLvl";
// Network 14: DelayON_PumpStatus (Original Language: LAD)
#TON_INSTANCE_26_dup5(IN := "HMI_Device"."PPP302"."Out", PT := T#4S);
"mPumpP2Running" := "mDelayON_PumpStatusON";
// Network 15: SYRUP LINE MANUAL DRAIN (Original Language: LAD)
// THIS PROCEDURE HAS TO BE DONE BEFORE TO SELECT THE SYRUP LINE STARTUP.
#TON_INSTANCE_30_dup5(IN := "gIN_HVP301_Aux", PT := T#5S);
// Network 16: MIX - HMI Variables Cmd (Original Language: LAD)
"mSyrupLineManualDrained" := %DB960.DBX56.3 AND "mSyrupLineManualDrainSR" AND NOT "gIN_HVP301_Aux";
// Network 17: (Original Language: LAD)
IF NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" THEN
"Blender_Variables_Pers"."gSyrLinePrepCountInit" := "Profibus_Variables"."gFTP302_Tot";
END_IF;
// Network 18: BRIX PRODUCT STARTUP THRESHOLD (Original Language: LAD)
"mSyrBrixAux" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupBrix" * "HMI_Blender_Parameters"."ProcessSetup"."_PercSyrupBrixSyrStarUp";
"mSyrBrixAux_1" := "mSyrBrixAux" / 100.0;
"Blender_Constants"."gSugaredSyrupBrixThrsd" := "mSyrBrixAux_1";
// Network 19: Fuzzy Net (Original Language: LAD)
mFuzzyNetAdd1 := SEL_R(G := "M_validat_27_01_25" AND "gPV_SyrDensOk" AND "HMI_Device"."PPP302"."Out" AND NOT "Blender_Variables_Pers"."gSugarBeverage", IN0 := 0.0, IN1 := 101.0);
IF "Blender_Variables_Pers"."gSugarBeverage" THEN
"mAux1" := "Profibus_Variables"."gFTP302_Brix" * "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupFactor";
END_IF;
mFuzzyNetAdd2 := SEL_R(G := "gIN_SyrTank_MinLvl" AND ("mAux1" > "Blender_Constants"."gSugaredSyrupBrixThrsd"), IN0 := 0.0, IN1 := 101.0);
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"Aux_Somma_Lt" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" + %DBD784;
END_IF;
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" := "Profibus_Variables"."gFTP302_Tot" - "Blender_Variables_Pers"."gSyrLinePrepCountInit";
END_IF;
"mWaterCountAcheaved" := NOT "mSyrupLineManualDrainSR" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt");
mFuzzyNetAdd3 := SEL_R(G := "HMI_Device"."PPP302"."Out" AND NOT "mSyrupLineManualDrainSR" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt"), IN0 := 0.0, IN1 := 101.0);
"mDummy" := TRUE;
// Network 20: Fuzzy Net (Original Language: LAD)
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd2";
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd3";
"mFuzzyNetOut" := "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND ("mFuzzyNetAdd1" > 100.0);
IF "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX MASTER VALIDATION" AND ("mFuzzyNetAdd1" > 100.0) THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := TRUE;
END_IF;
// Network 21: Opeartor Run Syrup Prep (Original Language: LAD)
_HMI_Alarms___gH_Message__8_ := "gBlenderProdMode" AND "Procedure_Variables"."FTP302Line_Preparation"."Qualifier" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode" AND NOT "Procedure_Variables"."FTP302_StartUp"."Latch" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Done" AND NOT "System_RunOut_Variables"."FastChangeOverActivated";
// Network 22: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
"HMI_Variables_Status"."Procedures"."TP301PrepRun" := "Procedure_Variables"."FTP302Line_Preparation"."Latch";
// Network 23: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
_HMI_Alarms___gH_Status__3_ := "Procedure_Variables"."FTP302Line_Preparation"."Latch" OR "Procedure_Variables"."FTP302_StartUp"."Latch";
// Network 24: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Running" THEN
Syrup_Line_MFM_Prep_Seq(FuzzyNetOut := "mFuzzyNetOut", SyrupLineManualDrained := "mSyrupLineManualDrained", WaterCountAcheaved := "mWaterCountAcheaved", mStep := "mStepNum", mStopPumpP2 := "mStopPumpP2", mSyrMinLevel := "mDelayON_SyrupMinON", mTimer := "mTimeStep", mTransition := "mTransition");
END_IF;
// Network 25: (Original Language: LAD)
"HMI_Variables_Status"."System_Run_Out"."TP301PrepDone" := "Procedure_Variables"."FTP302Line_Preparation"."Done";
END_FUNCTION_BLOCK

View File

@ -0,0 +1,269 @@
// FB1813
// Block Type: FB
// Block Name (Original): Syrup Line MFM Prep DAR
// Block Number: 1813
// Original Network Languages: STL, LAD
FUNCTION_BLOCK "Syrup_Line_MFM_Prep_DAR"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
IN : Bool;
PT : Time;
END_VAR
VAR_OUTPUT
Q : Bool;
ET : Time;
END_VAR
VAR_STAT
mStepNum : Int;
mTimeStep : Int;
Real_Time : Time;
mTransition : Bool;
mSyrLineMFMPrepONS : Bool;
mSyrupLineManualDrainSR : Bool;
mQTM306_PrepReqTPON : Bool;
mQTM306_PrepReqTP1ON : Bool;
mDelayON_StopPumpON : Bool;
mDelayON_SyrupMinON : Bool;
mDelayON_PumpStatusON : Bool;
mHVP302_TONON : Bool;
mQTM306_Prep_TimeOutON : Bool;
mQTM306_PrepReqTP : "TP:v1.0";
mQTM306_PrepReqTP1 : "TP:v1.0";
mDelayON_StopPump : "TON:v1.0";
mDelayON_SyrupMin : "TON:v1.0";
mDelayON_PumpStatus : "TON:v1.0";
mHVP302_TON : "TON:v1.0";
mQTM306_Prep_TimeOut : "TON:v1.0";
END_VAR
VAR_TEMP
mDummy : Bool;
mAux1 : Real;
mAux2 : Real;
mTimeOutElapsed : Bool;
mStopPumpP2 : Bool;
mSyrMinLevel : Bool;
mPumpP2Running : Bool;
mWaterCountAcheaved : Bool;
mSyrupLineManualDrained : Bool;
mFuzzyNetOut : Bool;
Out_Time_DI : DInt;
Real_Time_S5 : S5Time;
mProcSlctd : Bool;
mFuzzyNetAdd1 : Real;
mFuzzyNetAdd2 : Real;
mFuzzyNetAdd3 : Real;
mSyrBrixAux : Real;
mSyrBrixAux_1 : Real;
Aux_Somma_Lt : Real;
END_VAR
#_1S : Bool; // Auto-generated temporary
#_4S : Bool; // Auto-generated temporary
#_4S_600MS : Bool; // Auto-generated temporary
#_5S : Bool; // Auto-generated temporary
#TON_INSTANCE_26_dup3 : TON; // Auto-generated temporary
#TON_INSTANCE_26_dup5 : TON; // Auto-generated temporary
#TON_INSTANCE_27_dup4 : TON; // Auto-generated temporary
#TON_INSTANCE_30_dup5 : TON; // Auto-generated temporary
#TP_INSTANCE_44 : TP; // Auto-generated temporary
BEGIN
// Network 1: (Original Language: LAD)
%DB960.DBX56.0 := ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Blender_Variables_Pers"."gWaterRecipe") OR ("gBlenderProdMode" AND "gBlenderSuppliesOk" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode");
// Network 2: SyrLineMFMPrepReq (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"Tag_69" := "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone"; // P_TRIG("HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone") - Mem: "Tag_69"
#TP_INSTANCE_44(IN := "System_RunOut_Variables"."FastChangeOverActivated" AND "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone" AND "HMI_Variables_Cmd"."GLOBAL_CMD"."_EnableNextRecipe" AND "System_RunOut_Variables"."NextRecipeOk" AND NOT %DB960.DBX56.6, PT := T#1S);
%DB960.DBX56.1 := ("mQTM306_PrepReqTP1ON" AND %DB960.DBX56.0) OR (%DB960.DBX56.0 AND "HMI_Variables_Cmd"."Commands_From_HMI"."CMD_FTP302Line_Prep" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "Tag_69" AND NOT "Procedure_Variables"."Syr_RunOut"."FastChangeOverRinseDone");
// Network 3: (Original Language: LAD)
// PBox SymPy processed, logic in consumer
"mSyrLineMFMPrepONS" := %DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated"; // P_TRIG(%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") - Mem: "mSyrLineMFMPrepONS"
%DB960.DBX56.2 := "gBlenderCIPMode" OR "Blender_Variables_Pers"."gWaterRecipe" OR ("gEmergencyPressed" AND %DB960.DBX56.3) OR ("Procedure_Variables"."SyrupLineRinse"."Latch" AND "System_RunOut_Variables"."FastChangeOverActivated") OR ("gBlenderRinseMode" AND NOT "System_RunOut_Variables"."FastChangeOverActivated") OR (%DB960.DBX56.1 AND %DB960.DBX56.6 AND NOT "Procedure_Variables"."Blender_Run"."Latch" AND NOT "System_RunOut_Variables"."FastChangeOverActivated" AND NOT "mSyrLineMFMPrepONS");
// Network 4: (Original Language: LAD)
IF ("Procedure_Variables"."Blender_Rinse"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("Procedure_Variables"."Syr_RunOut"."Latch" AND NOT "AUX MASTER VALIDATION") OR ("CIP_Program_Variables"."Status"."Started" AND NOT "AUX MASTER VALIDATION") THEN
%DB960.DBX57.0 := FALSE;
END_IF;
// Network 5: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mStepNum" := 0;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
%DB960.DBX56.6 := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := FALSE;
END_IF;
IF "Procedure_Variables"."FTP302Line_Preparation"."Reset" THEN
"mWaterCountAcheaved" := FALSE;
END_IF;
// Network 6: (Original Language: LAD)
%DB960.DBX56.5 := "HMI_Device"."PPP302"."Alarm" OR "HMI_Device"."SyrupRoom_SyrupPump"."Alarm" OR NOT "HMI_Digital"."PSM311"."Filtered";
// Network 7: (Original Language: LAD)
%DB960.DBX56.3 := (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6);
IF (%DB960.DBX56.1 AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) OR ("Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX Start CPU" AND NOT %DB960.DBX56.2 AND NOT %DB960.DBX56.6) THEN
"HMI_Variables_Status"."Procedures"."BlenderStateNum" := 3;
END_IF;
// Network 8: (Original Language: LAD)
%DB960.DBX56.4 := %DB960.DBX56.3 AND NOT %DB960.DBX56.5;
// Network 9: MIX - (Original Language: LAD)
"mAux1" := "Blender_Variables"."gMinProduction" / 6.0;
mAux1 := SEL_R(G := Ne("mAux1", 0.0), IN0 := 1.0, IN1 := "mAux1");
"mAux2" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" * 1.5;
"mAux1" := "mAux2" / "mAux1";
"Out_Time_DI" := CEIL("mAux1");
"mDummy" := TRUE;
// Network 10: (Original Language: STL)
// #Out_Time_DI (DINT) converted in #Real_Time_S5 (S5Time)
// Use L#1000 IF #Out_Time_DI is in ms
// --- BEGIN STL Network 10 ---
```stl
L "Out_Time_DI"
L 1000
MUL_D
T "Real_Time"
```
// --- END STL Network 10 ---
// Network 11: SyrLineMFMPrep_TimeOut (Original Language: LAD)
#TON_INSTANCE_26_dup3(IN := %DBX56.3, PT := "Real_Time");
"mTimeOutElapsed" := "mQTM306_Prep_TimeOutON";
// Network 12: DelayON_StopPump (Original Language: LAD)
#TON_INSTANCE_27_dup4(IN := NOT "gIN_SyrTank_MinLvl", PT := T#4S_600MS);
"mStopPumpP2" := "mDelayON_StopPumpON";
// Network 13: DelayON_SyrupMin (Original Language: LAD)
"mSyrMinLevel" := "gIN_SyrTank_MinLvl";
// Network 14: DelayON_PumpStatus (Original Language: LAD)
#TON_INSTANCE_26_dup5(IN := "HMI_Device"."PPP302"."Out", PT := T#4S);
"mPumpP2Running" := "mDelayON_PumpStatusON";
// Network 15: SYRUP LINE MANUAL DRAIN (Original Language: LAD)
// THIS PROCEDURE HAS TO BE DONE BEFORE TO SELECT THE SYRUP LINE STARTUP.
#TON_INSTANCE_30_dup5(IN := "gIN_HVP301_Aux", PT := T#5S);
// Network 16: MIX - HMI Variables Cmd (Original Language: LAD)
"mSyrupLineManualDrained" := %DB960.DBX56.3 AND "mSyrupLineManualDrainSR" AND NOT "gIN_HVP301_Aux";
// Network 17: (Original Language: LAD)
IF NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" THEN
"Blender_Variables_Pers"."gSyrLinePrepCountInit" := "Profibus_Variables"."gFTP302_Tot";
END_IF;
// Network 18: BRIX PRODUCT STARTUP THRESHOLD (Original Language: LAD)
"mSyrBrixAux" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupBrix" * "HMI_Blender_Parameters"."ProcessSetup"."_PercSyrupBrixSyrStarUp";
"mSyrBrixAux_1" := "mSyrBrixAux" / 100.0;
"Blender_Constants"."gSugaredSyrupBrixThrsd" := "mSyrBrixAux_1";
// Network 19: Fuzzy Net (Original Language: LAD)
mFuzzyNetAdd1 := SEL_R(G := "M_validat_27_01_25" AND "gPV_SyrDensOk" AND "HMI_Device"."PPP302"."Out" AND NOT "Blender_Variables_Pers"."gSugarBeverage", IN0 := 0.0, IN1 := 101.0);
IF "Blender_Variables_Pers"."gSugarBeverage" THEN
"mAux1" := "Profibus_Variables"."gFTP302_Brix" * "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_SyrupFactor";
END_IF;
mFuzzyNetAdd2 := SEL_R(G := "gIN_SyrTank_MinLvl" AND "Blender_Variables_Pers"."gSugarBeverage" AND ("mAux1" > "Blender_Constants"."gSugaredSyrupBrixThrsd"), IN0 := 0.0, IN1 := 101.0);
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"Aux_Somma_Lt" := "HMI_Blender_Parameters"."ProcessSetup"."_SyrupRunOutLiters" + %DBD784;
END_IF;
IF NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" THEN
"HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" := "Profibus_Variables"."gFTP302_Tot" - "Blender_Variables_Pers"."gSyrLinePrepCountInit";
END_IF;
"mWaterCountAcheaved" := NOT "mSyrupLineManualDrainSR" AND NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt");
mFuzzyNetAdd3 := SEL_R(G := "HMI_Device"."PPP302"."Out" AND NOT "mSyrupLineManualDrainSR" AND NOT "M_validat_27_01_25" AND NOT "Blender_Variables_Pers"."gSugarBeverage" AND ("HMI_Variables_Status"."Analog_Values"."TP301SyrupPrimingCount" >= "Aux_Somma_Lt"), IN0 := 0.0, IN1 := 101.0);
"mDummy" := TRUE;
// Network 20: Fuzzy Net (Original Language: LAD)
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd2";
"mFuzzyNetAdd1" := "mFuzzyNetAdd1" + "mFuzzyNetAdd3";
"mFuzzyNetOut" := "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND ("mFuzzyNetAdd1" > 100.0);
IF "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "AUX MASTER VALIDATION" AND ("mFuzzyNetAdd1" > 100.0) THEN
"Procedure_Variables"."FTP302Line_Preparation"."LinePrepared" := TRUE;
END_IF;
// Network 21: Opeartor Run Syrup Prep (Original Language: LAD)
_HMI_Alarms___gH_Message__8_ := "gBlenderProdMode" AND "Procedure_Variables"."FTP302Line_Preparation"."Qualifier" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Latch" AND NOT "Blender_Variables_Pers"."gWaterRecipe" AND NOT "gBlenderRinseMode" AND NOT "Procedure_Variables"."FTP302_StartUp"."Latch" AND NOT "Procedure_Variables"."FTP302Line_Preparation"."Done" AND NOT "System_RunOut_Variables"."FastChangeOverActivated";
// Network 22: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
"HMI_Variables_Status"."Procedures"."TP301PrepRun" := "Procedure_Variables"."FTP302Line_Preparation"."Latch";
// Network 23: Syrup Tank Prep Running (Original Language: LAD)
// Syrup Tank Prep Running Message
_HMI_Alarms___gH_Status__3_ := "Procedure_Variables"."FTP302Line_Preparation"."Latch" OR "Procedure_Variables"."FTP302_StartUp"."Latch";
// Network 24: (Original Language: LAD)
IF "Procedure_Variables"."FTP302Line_Preparation"."Running" THEN
Syrup_Line_MFM_Prep_Seq(FuzzyNetOut := "mFuzzyNetOut", SyrupLineManualDrained := "mSyrupLineManualDrained", WaterCountAcheaved := "mWaterCountAcheaved", mStep := "mStepNum", mStopPumpP2 := "mStopPumpP2", mSyrMinLevel := "mDelayON_SyrupMinON", mTimer := "mTimeStep", mTransition := "mTransition");
END_IF;
// Network 25: (Original Language: LAD)
"HMI_Variables_Status"."System_Run_Out"."TP301PrepDone" := "Procedure_Variables"."FTP302Line_Preparation"."Done";
END_FUNCTION_BLOCK

52160
data/log.txt

File diff suppressed because it is too large Load Diff