Creado nuevo grupo IO_adaptation con flujo de trabajo desde x1 a x5

This commit is contained in:
Miguel 2025-05-15 12:16:01 +02:00
parent 6e36186012
commit f6ae6f4f82
26 changed files with 1620 additions and 903 deletions

View File

@ -0,0 +1,4 @@
{
"Input_level_1": "Inputs",
"Input_level_2": "IO Not in Hardware\\\\InputsMaster"
}

View File

@ -1,6 +1,6 @@
{
"name": "Exportador de objetos de Tia Portal y procesador de CAx",
"description": "Este conjunto de scripts exporta desde Tia Portal los objetos en fomarto XML y los objetos CAx. Luego se puede generar documentacion desde estos CAx de la periferia IO del PLC exportado.",
"name": "Scripts para adaptar IO de Hardware S7 a IO Master en Tia Portal",
"description": "Este conjunto de scripts está diseñado para ayudar a los usuarios a adaptar el IO de Hardware S7 a un IO Master en Tia Portal. Incluye scripts para la creación de un nuevo proyecto, la importación de un proyecto existente y la adaptación del IO de Hardware S7 a un IO Master.",
"version": "1.0",
"author": "Miguel"
}

View File

@ -0,0 +1,17 @@
{
"type": "object",
"properties": {
"Input_level_1": {
"type": "string",
"title": "Inputs",
"description": "Inputs",
"default": "Inputs"
},
"Input_level_2": {
"type": "string",
"title": "Inputs Nivel 2",
"description": "Inputs Nivel 2",
"default": "IO Not in Hardware\\\\InputsMaster"
}
}
}

View File

@ -0,0 +1,4 @@
{
"type": "object",
"properties": {}
}

View File

@ -0,0 +1,29 @@
{
"paths": [
{
"path": "Inputs",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "Outputs",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "OutputsFesto",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "IO Not in Hardware\\InputsMaster",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "IO Not in Hardware\\OutputsMaster",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
}
]
}

View File

@ -0,0 +1,19 @@
--- Log de Ejecución: x1_excel_to_md.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 10:12:46
Fin: 2025-05-15 10:12:48
Duración: 0:00:01.326570
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
Usando directorio de trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Archivo de configuración creado: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\io_paths_config.json
Usando archivo Excel predeterminado: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx
Procesando archivo Excel: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx...
Paths configurados para procesar: ['Inputs', 'Outputs', 'OutputsFesto', 'IO Not in Hardware\\InputsMaster', 'IO Not in Hardware\\OutputsMaster']
¡Éxito! Archivo Excel convertido a Markdown en: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\IO Tags consolidated.md
--- ERRORES (STDERR) ---
Ninguno
--- FIN DEL LOG ---

View File

@ -0,0 +1,38 @@
--- Log de Ejecución: x1_export_CAx.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 10:41:11
Fin: 2025-05-15 10:43:18
Duración: 0:02:07.367695
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
--- TIA Portal Project CAx Exporter and Analyzer ---
Selected Project: C:/Trabajo/SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/InLavoro/PLC/_NEW/SAE196_c0.2/SAE196_c0.2.ap18
Using Output Directory (Working Directory): C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Will export CAx data to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.aml
Will generate summary to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Summary.md
Export log file: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.log
Connecting to TIA Portal V18.0...
2025-05-15 10:41:33,504 [1] INFO Siemens.TiaPortal.OpennessApi18.Implementations.Global OpenPortal - Start TIA Portal, please acknowledge the security dialog.
2025-05-15 10:41:33,524 [1] INFO Siemens.TiaPortal.OpennessApi18.Implementations.Global OpenPortal - With user interface
Connected.
Opening project: SAE196_c0.2.ap18...
2025-05-15 10:42:05,513 [1] INFO Siemens.TiaPortal.OpennessApi18.Implementations.Portal OpenProject - Open project... C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\InLavoro\PLC\_NEW\SAE196_c0.2\SAE196_c0.2.ap18
Project opened.
Exporting CAx data for the project to C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.aml...
CAx data exported successfully.
Closing TIA Portal...
2025-05-15 10:43:15,299 [1] INFO Siemens.TiaPortal.OpennessApi18.Implementations.Portal ClosePortal - Close TIA Portal
TIA Portal closed.
Parsing AML file: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.aml
Markdown summary written to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Summary.md
Script finished.
--- ERRORES (STDERR) ---
Ninguno
--- FIN DEL LOG ---

View File

@ -0,0 +1,501 @@
--- Log de Ejecución: x2_md_to_excel.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 09:17:12
Fin: 2025-05-15 09:19:23
Duración: 0:02:11.597272
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
Seleccione el archivo Excel exportado de TIA Portal:
Seleccione el archivo Markdown con la adaptación IO:
Iniciando proceso de actualización
Archivo Excel de entrada: C:/Trabajo/SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Reporte/TAGsIO/v2/PLCTags.xlsx
Archivo Markdown de entrada: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/IO/IO Adapted.md
Archivo Excel de salida: C:/Trabajo/SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Reporte/TAGsIO/v2\PLCTags_Updated.xlsx
--------------------------------------------------------------------------------
Encabezados detectados: ['IO', 'Master Tag', 'PLC Description', 'Master Description', 'Certeza', 'Alternative']
Columna IO: IO
Columna Master Tag: Master Tag
Tags mapeados en el archivo Markdown: 101
Archivo Excel cargado: C:/Trabajo/SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Reporte/TAGsIO/v2/PLCTags.xlsx
Hojas disponibles: ['PLC Tags', 'TagTable Properties']
Asignación memoria: AI_CIP_CIP_Total_Time | Viejo valor: %MW3116 | Nuevo valor: %MW3600 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: AI_CIP_SetPoint_Temeperature | Viejo valor: %MB3087 | Nuevo valor: %MW3602 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: AI_SYRUP_Cip_Phase | Viejo valor: %MB3090 | Nuevo valor: %MW3604 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: AI_SYRUP_Cip_RemaningTime | Viejo valor: %MB3089 | Nuevo valor: %MW3606 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: AI_SYRUP_Cip_TotalTime | Viejo valor: %MB3088 | Nuevo valor: %MW3608 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_Air_InletPress_OK | Viejo valor: %E7.1 | Nuevo valor: %E7.1 | Path: Inputs
Actualizado: DI_AlarmReset | Viejo valor: %E0.2 | Nuevo valor: %E0.2 | Path: Inputs
Asignación memoria: DI_Ammonia_High_Lev_Prod | Viejo valor: %M3003.7 | Nuevo valor: %M3610.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_AmmoniaHighLev_Water | Viejo valor: %M3003.1 | Nuevo valor: %M3610.1 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_AuxVoltage_On | Viejo valor: %E0.0 | Nuevo valor: %E0.0 | Path: Inputs
Asignación memoria: DI_AVM362_Close | Viejo valor: %E112.3 | Nuevo valor: %M3610.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_AVM362_Open | Viejo valor: %E102.3 | Nuevo valor: %M3610.3 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_ChemicalProd | Viejo valor: %M3001.5 | Nuevo valor: %M3610.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_CleaningCompleted | Viejo valor: %E60.3 | Nuevo valor: %M3610.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_CleaningFault | Viejo valor: %M3002.5 | Nuevo valor: %M3610.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_FreeSodaTank | Viejo valor: %M3001.7 | Nuevo valor: %M3610.7 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_HotWaterSending | Viejo valor: %M3001.6 | Nuevo valor: %M3611.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_TankFilling | Viejo valor: %M3001.4 | Nuevo valor: %M3611.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CO2_InletPress_OK | Viejo valor: %M3004.0 | Nuevo valor: %M3611.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_DeairVacuumOk | Viejo valor: %M3004.2 | Nuevo valor: %M3611.3 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_Emergency_Pilz_On | Viejo valor: %M3605.1 | Nuevo valor: %E0.5 | Path: Inputs
Asignación memoria: DI_Emergency_Pressed | Viejo valor: %E4.3 | Nuevo valor: %M3611.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_CIP_CleaningAlarm | Viejo valor: %M3002.7 | Nuevo valor: %M3611.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr1_CIP_DrainComplete | Viejo valor: %M3605.5 | Nuevo valor: %M3611.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_CIP_FloodingEnd | Viejo valor: %M3002.0 | Nuevo valor: %M3611.7 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr1_CIP/RinseFiller | Viejo valor: %M3605.4 | Nuevo valor: %M3612.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_CIP_RecoverReq | Viejo valor: %M3002.2 | Nuevo valor: %M3612.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_CIP_RinseMode | Viejo valor: %M3002.1 | Nuevo valor: %M3612.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_EndProdLastBottleFilled | Viejo valor: %M3000.2 | Nuevo valor: %M3612.3 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_OpenAVM369 | Viejo valor: %M3000.3 | Nuevo valor: %M3612.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr1_PROD_Request | Viejo valor: %M3605.3 | Nuevo valor: %M3612.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_Drain | Viejo valor: %E60.2 | Nuevo valor: %M3612.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_CIP_Rinse | Viejo valor: %E60.1 | Nuevo valor: %M3612.7 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_CIP_CIP_Enable | Viejo valor: %E60.0 | Nuevo valor: %E4.3 | Path: Inputs
Asignación memoria: DI_SYR_TANK_LEVEL | Viejo valor: %MW3206 | Nuevo valor: %MW3613 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_FSS301 | Viejo valor: %E7.3 | Nuevo valor: %E7.3 | Path: Inputs
Asignación memoria: DI_HVM302_Sensor | Viejo valor: %M3000.7 | Nuevo valor: %M3615.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Log_Sidel | Viejo valor: %E3660.0 | Nuevo valor: %M3615.1 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_LSM302L | Viejo valor: %E1.0 | Nuevo valor: %E1.0 | Path: Inputs
Actualizado: DI_LSN301L | Viejo valor: %E0.6 | Nuevo valor: %E0.6 | Path: Inputs
Actualizado: DI_MaxTempAlarm | Viejo valor: %M3625.0 | Nuevo valor: %E4.4 | Path: Inputs
Asignación memoria: DI_Min_Deair2_Level | Viejo valor: %M3001.0 | Nuevo valor: %M3615.2 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_Min_Syrup_Level | Viejo valor: %E0.7 | Nuevo valor: %E0.7 | Path: Inputs
Actualizado: DI_PB_Machine_Start | Viejo valor: %E0.4 | Nuevo valor: %E0.4 | Path: Inputs
Actualizado: DI_PB_Machine_Stop | Viejo valor: %E0.3 | Nuevo valor: %E0.3 | Path: Inputs
Actualizado: DI_PPM303_Ovrld | Viejo valor: %E2.4 | Nuevo valor: %E2.4 | Path: Inputs
Asignación memoria: DI_PPN301_Contactor | Viejo valor: %E11.0 | Nuevo valor: %M3615.3 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_PPN301_Ovrld | Viejo valor: %E2.0 | Nuevo valor: %E2.0 | Path: Inputs
Asignación memoria: DI_PPN301_SoftStOvr | Viejo valor: %E2.1 | Nuevo valor: %M3615.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_PPN304_Contactor | Viejo valor: %M3003.2 | Nuevo valor: %M3615.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_PPM305_Ovrld | Viejo valor: %M3005.0 | Nuevo valor: %M3615.6 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_PPP302_Contactor | Viejo valor: %E2.3 | Nuevo valor: %E2.3 | Path: Inputs
Actualizado: DI_PPP302_Ovrld | Viejo valor: %E2.2 | Nuevo valor: %E2.2 | Path: Inputs
Asignación memoria: DI_Product_Analyzer_Prod_NO_OK | Viejo valor: %M3003.4 | Nuevo valor: %M3615.7 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_RMM301_Closed | Viejo valor: %E1.5 | Nuevo valor: %E1.5 | Path: Inputs
Actualizado: DI_RMM303_Closed | Viejo valor: %E1.7 | Nuevo valor: %E1.7 | Path: Inputs
Asignación memoria: DI_RMM304_Closed | Viejo valor: %M3004.5 | Nuevo valor: %M3616.0 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_RMP302_Closed | Viejo valor: %E1.6 | Nuevo valor: %E1.6 | Path: Inputs
Asignación memoria: DI_SyrRoom_Cip_Mode | Viejo valor: %M3002.3 | Nuevo valor: %M3616.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_SyrRoom_Pump_Ready | Viejo valor: %M3606.5 | Nuevo valor: %M3616.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_SyrRoom_WatPumpReady | Viejo valor: %E68.1 | Nuevo valor: %M3616.3 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_UPSBatteryReady | Viejo valor: %E3.7 | Nuevo valor: %E3.7 | Path: Inputs
Asignación memoria: DI_UV_Lamp_Ready | Viejo valor: %M3004.7 | Nuevo valor: %M3616.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Water_Pump2_Contactor | Viejo valor: %M3004.4 | Nuevo valor: %M3616.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Water_Pump2_Ovrld | Viejo valor: %M3001.1 | Nuevo valor: %M3616.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_WaterPipeCIP_Sensor | Viejo valor: %M3000.5 | Nuevo valor: %M3616.7 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_Aux24DC | Viejo valor: %M3500.1 | Nuevo valor: %M3800.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM312_Deair_Reflux | Viejo valor: %M3507.6 | Nuevo valor: %M3800.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM317_1 | Viejo valor: %A17.3 | Nuevo valor: %M3800.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM327 | Viejo valor: %M3510.4 | Nuevo valor: %M3800.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM328 | Viejo valor: %M3506.1 | Nuevo valor: %M3800.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM329 | Viejo valor: %M3510.5 | Nuevo valor: %M3800.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM330 | Viejo valor: %M3510.6 | Nuevo valor: %M3800.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM396 | Viejo valor: %A17.1 | Nuevo valor: %M3800.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVN325 | Viejo valor: %A17.7 | Nuevo valor: %M3801.0 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVN329 | Viejo valor: %A17.6 | Nuevo valor: %A16.6 | Path: Outputs
Actualizado: DO_AVN348 | Viejo valor: %A16.1 | Nuevo valor: %A16.0 | Path: Outputs
Asignación memoria: DO_AVN349 | Viejo valor: %A16.7 | Nuevo valor: %M3801.1 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVN373 | Viejo valor: %A16.3 | Nuevo valor: %A16.3 | Path: Outputs
Actualizado: DO_AVN374 | Viejo valor: %A19.3 | Nuevo valor: %A16.4 | Path: Outputs
Actualizado: DO_AVN377 | Viejo valor: %M3510.3 | Nuevo valor: %A17.6 | Path: Outputs
Asignación memoria: DO_AVN378 | Viejo valor: %M3510.2 | Nuevo valor: %M3801.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVN390 | Viejo valor: %M3505.5 | Nuevo valor: %M3801.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVN347 | Viejo valor: %A20.1 | Nuevo valor: %A20.0 | Path: Outputs
Actualizado: DO_AVP363 | Viejo valor: %A16.5 | Nuevo valor: %A17.2 | Path: Outputs
Asignación memoria: DO_AVP391 | Viejo valor: %M3505.6 | Nuevo valor: %M3801.4 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVS331 | Viejo valor: %A18.0 | Nuevo valor: %A18.0 | Path: Outputs
Actualizado: DO_AVS332 | Viejo valor: %A18.1 | Nuevo valor: %A18.1 | Path: Outputs
Actualizado: DO_AVS333 | Viejo valor: %A18.2 | Nuevo valor: %A18.2 | Path: Outputs
Actualizado: DO_AVS334 | Viejo valor: %A18.3 | Nuevo valor: %A18.3 | Path: Outputs
Actualizado: DO_AVS335 | Viejo valor: %A18.4 | Nuevo valor: %A18.4 | Path: Outputs
Actualizado: DO_AVS336 | Viejo valor: %A18.5 | Nuevo valor: %A18.5 | Path: Outputs
Actualizado: DO_AVS337 | Viejo valor: %A18.6 | Nuevo valor: %A18.6 | Path: Outputs
Actualizado: DO_AVS338 | Viejo valor: %A18.7 | Nuevo valor: %A18.7 | Path: Outputs
Asignación memoria: DO_CIP_CleaningFault | Viejo valor: %M3501.7 | Nuevo valor: %M3801.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyrupRoom_Aux1 | Viejo valor: %M3602.2 | Nuevo valor: %M3801.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_DrainCompleted | Viejo valor: %A60.1 | Nuevo valor: %M3801.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_HotWaterReq | Viejo valor: %M3502.4 | Nuevo valor: %M3802.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_RecoverCompleted | Viejo valor: %M3502.1 | Nuevo valor: %M3802.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_SendSodaReq | Viejo valor: %M3502.2 | Nuevo valor: %M3802.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_SolutionReturn | Viejo valor: %M3502.0 | Nuevo valor: %M3802.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_WaterPipe_Ready | Viejo valor: %M3502.3 | Nuevo valor: %M3802.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CO2_Counter_Pulse | Viejo valor: %M3500.4 | Nuevo valor: %M3802.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CtrlCircuitRun | Viejo valor: %A5.1 | Nuevo valor: %M3802.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyRm_SyrupReques | Viejo valor: %A1.0 | Nuevo valor: %M3802.7 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_EV03_SyrupLvlCtrl | Viejo valor: %A20.2 | Nuevo valor: %A20.2 | Path: Outputs
Actualizado: DO_EV04_SyrupFillUp | Viejo valor: %A20.3 | Nuevo valor: %A20.3 | Path: Outputs
Asignación memoria: DO_EV66_FillerRinseWater | Viejo valor: %M3509.4 | Nuevo valor: %M3803.0 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_EV67_SyrupLineDrain | Viejo valor: %A19.2 | Nuevo valor: %A16.5 | Path: Outputs
Asignación memoria: DO_EV68_FillerRinseWater | Viejo valor: %M3508.2 | Nuevo valor: %M3803.1 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_EV71_FillerPrPipeDrai | Viejo valor: %M3508.3 | Nuevo valor: %A19.2 | Path: Outputs
Actualizado: DO_EV71_FiRinseSprayBall | Viejo valor: %M3508.4 | Nuevo valor: %A19.1 | Path: Outputs
Actualizado: DO_EV72_FlrRinseTankDrai | Viejo valor: %M3508.5 | Nuevo valor: %A19.3 | Path: Outputs
Actualizado: DO_FillerNextRecipe | Viejo valor: %MB3504 | Nuevo valor: %AW15096 | Path: Outputs
Asignación memoria: DO_Flr_BottleStop | Viejo valor: %M3503.3 | Nuevo valor: %M3803.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_CIP_CleaningEnd | Viejo valor: %M3660.1 | Nuevo valor: %M3803.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_CleaningFault | Viejo valor: %M3502.5 | Nuevo valor: %M3803.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_CIP_DrainRequest | Viejo valor: %M3660.0 | Nuevo valor: %M3803.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_ProdSending | Viejo valor: %M3502.6 | Nuevo valor: %M3803.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_RecoverReq | Viejo valor: %M3502.7 | Nuevo valor: %M3803.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_RinseMode | Viejo valor: %M3603.5 | Nuevo valor: %M3804.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_RinseSending | Viejo valor: %M3503.2 | Nuevo valor: %M3804.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_Running | Viejo valor: %M3503.0 | Nuevo valor: %M3804.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_CIP_TankFilling | Viejo valor: %M3503.1 | Nuevo valor: %M3804.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_FastRinseRequest | Viejo valor: %M3503.6 | Nuevo valor: %M3804.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_CIP/Rinse | Viejo valor: %M3511.5 | Nuevo valor: %M3804.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_PROD_Available | Viejo valor: %M3603.4 | Nuevo valor: %M3804.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_OpenBottleblock | Viejo valor: %M3603.6 | Nuevo valor: %M3804.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_PROD_Run_Out | Viejo valor: %M3503.4 | Nuevo valor: %M3805.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_ProductCompleted | Viejo valor: %M3503.5 | Nuevo valor: %M3805.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_WaterRinseReady | Viejo valor: %M3503.7 | Nuevo valor: %M3805.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Green_Lamp | Viejo valor: %M3500.5 | Nuevo valor: %M3805.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_Horn | Viejo valor: %A7.0 | Nuevo valor: %A7.0 | Path: Outputs
Asignación memoria: DO_MES_CIP | Viejo valor: %M3500.7 | Nuevo valor: %M3805.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_MES_FAULT | Viejo valor: %M3501.2 | Nuevo valor: %M3805.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_MES_PRODUCTION | Viejo valor: %M3501.0 | Nuevo valor: %M3805.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_MES_Running | Viejo valor: %M3501.1 | Nuevo valor: %M3805.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_Mode_En | Viejo valor: %A60.0 | Nuevo valor: %M3806.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_MIXER _CIP_Temperature_Return | Viejo valor: %MW3514 | Nuevo valor: %MW3806 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CoolingON | Viejo valor: %M3511.0 | Nuevo valor: %M3808.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_MIXER _Rinse_mode | Viejo valor: %M3512.2 | Nuevo valor: %M3808.2 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_PB_Green_Lamp | Viejo valor: %A7.1 | Nuevo valor: %A7.1 | Path: Outputs
Asignación memoria: DO_PCM306En | Viejo valor: %M3501.6 | Nuevo valor: %M3808.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_PPM303_Run | Viejo valor: %A7.6 | Nuevo valor: %A7.6 | Path: Outputs
Asignación memoria: DO_PPN301_1053K1 | Viejo valor: %M3501.5 | Nuevo valor: %M3808.4 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_PPN301_Run | Viejo valor: %A7.4 | Nuevo valor: %A7.4 | Path: Outputs
Asignación memoria: DO_PPN304_Run | Viejo valor: %M3501.4 | Nuevo valor: %M3808.5 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_PPP302_Run | Viejo valor: %A7.5 | Nuevo valor: %A7.5 | Path: Outputs
Actualizado: DO_Red_Lamp | Viejo valor: %A7.2 | Nuevo valor: %A7.2 | Path: Outputs
Actualizado: DO_RVN301_Level | Viejo valor: %A20.0 | Nuevo valor: %A16.7 | Path: Outputs
Actualizado: DO_SyrRoom_SyrupRequest | Viejo valor: %A68.0 | Nuevo valor: %A1.0 | Path: Outputs
Asignación memoria: DO_Syrup_Counter_Pulse | Viejo valor: %M3500.0 | Nuevo valor: %M3808.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyrupRoomPump_Run | Viejo valor: %M3505.0 | Nuevo valor: %M3808.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyrupRoomWaterReq | Viejo valor: %A1.1 | Nuevo valor: %M3809.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Water_Counter_Pulse | Viejo valor: %M3500.2 | Nuevo valor: %M3809.1 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_Yellow_Lamp | Viejo valor: %A7.3 | Nuevo valor: %A7.3 | Path: Outputs
Asignación memoria: MaselliSpare | Viejo valor: %M3511.3 | Nuevo valor: %M3809.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: MaselliHold | Viejo valor: %M3511.2 | Nuevo valor: %M3809.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AI_TTM306 | Viejo valor: %EW108 | Nuevo valor: %EW108 | Path: Inputs
Actualizado: P_AI_LTM302 | Viejo valor: %EW100 | Nuevo valor: %EW100 | Path: Inputs
Asignación memoria: P_AI_LTP303 | Viejo valor: %EW808 | Nuevo valor: %MW3617 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_PCM306 | Viejo valor: %EW106 | Nuevo valor: %MW3619 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_ProductCO2 | Viejo valor: %EW826 | Nuevo valor: %MW3621 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_AI_PTF203 | Viejo valor: %EW810 | Nuevo valor: %EW104 | Path: Inputs
Actualizado: P_AI_PTM304 | Viejo valor: %EW102 | Nuevo valor: %EW102 | Path: Inputs
Asignación memoria: P_AI_PTP338 | Viejo valor: %EW816 | Nuevo valor: %MW3623 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_RVM301 | Viejo valor: %EW114 | Nuevo valor: %MW3625 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_AI_RVN304 | Viejo valor: %EW104 | Nuevo valor: %EW114 | Path: Inputs
Actualizado: P_AI_TTN321 | Viejo valor: %EW112 | Nuevo valor: %EW112 | Path: Inputs
Asignación memoria: P_AO_CIPCausticCond | Viejo valor: %MW3532 | Nuevo valor: %MW3809 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_AO_CIPReturnTemperature | Viejo valor: %MW3534 | Nuevo valor: %MW3811 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_AO_CIPWaterCond | Viejo valor: %MW3530 | Nuevo valor: %MW3813 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_PCM306 | Viejo valor: %AW122 | Nuevo valor: %AW108 | Path: Outputs
Asignación memoria: P_AO_ProductRunOutAmount | Viejo valor: %MW3526 | Nuevo valor: %MW3815 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_RMM301 | Viejo valor: %AW100 | Nuevo valor: %AW100 | Path: Outputs
Actualizado: P_AO_RMM303 | Viejo valor: %AW104 | Nuevo valor: %AW104 | Path: Outputs
Asignación memoria: P_AO_RMM304 | Viejo valor: %MW3536 | Nuevo valor: %MW3817 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_RMP302 | Viejo valor: %AW102 | Nuevo valor: %AW102 | Path: Outputs
Actualizado: P_AO_RVM301 | Viejo valor: %AW114 | Nuevo valor: %AW122 | Path: Outputs
Asignación memoria: P_AO_RVM302 | Viejo valor: %MW3538 | Nuevo valor: %MW3819 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_RVM319 | Viejo valor: %AW110 | Nuevo valor: %AW110 | Path: Outputs
Asignación memoria: P_AO_RVN302 | Viejo valor: %MW3522 | Nuevo valor: %MW3821 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_RVN304 | Viejo valor: %AW108 | Nuevo valor: %AW114 | Path: Outputs
Asignación memoria: P_AO_RVP303 | Viejo valor: %AW806 | Nuevo valor: %MW3823 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_AO_RVS318 | Viejo valor: %AW112 | Nuevo valor: %AW112 | Path: Outputs
Asignación memoria: P_AO_ToFillerEqPress | Viejo valor: %MW3524 | Nuevo valor: %MW3825 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_CTS301_Conductiv_State | Viejo valor: %MB3085 | Nuevo valor: %MW3627 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS301_Conductivity | Viejo valor: %MD3180 | Nuevo valor: %MW3629 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS301_Temperat_State | Viejo valor: %MB3084 | Nuevo valor: %MW3631 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS301_Temperature | Viejo valor: %MD3184 | Nuevo valor: %MW3633 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS302_Conductiv_State | Viejo valor: %MB3083 | Nuevo valor: %MW3635 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS302_Conductivity | Viejo valor: %MD3188 | Nuevo valor: %MW3637 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS302_Temperat_State | Viejo valor: %MB3082 | Nuevo valor: %MW3639 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_CTS302_Temperature | Viejo valor: %MD3196 | Nuevo valor: %MW3641 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTM303_Tot_Ctrl | Viejo valor: %AB3240 | Nuevo valor: %AW3240 | Path: Outputs
Actualizado: P_FTM303_Density | Viejo valor: %ED3215 | Nuevo valor: %EW3215 | Path: Inputs
Asignación memoria: P_FTM303_Density_State | Viejo valor: %EB3219 | Nuevo valor: %MW3643 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_FTM303_EPD | Viejo valor: %MB3305 | Nuevo valor: %MW3645 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTM303_Flow | Viejo valor: %ED3200 | Nuevo valor: %EW3200 | Path: Inputs
Asignación memoria: P_FTM303_Flow_State | Viejo valor: %EB3204 | Nuevo valor: %MW3647 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_FTM303_Temperature_State | Viejo valor: %EB3229 | Nuevo valor: %MW3649 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTM303_Temperature | Viejo valor: %ED3225 | Nuevo valor: %EW3225 | Path: Inputs
Actualizado: P_FTM303_Totalizer | Viejo valor: %ED3240 | Nuevo valor: %EW3240 | Path: Inputs
Asignación memoria: P_FTM303_Totalizer_State | Viejo valor: %EB3244 | Nuevo valor: %MW3651 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTN301_Flow | Viejo valor: %ED3080 | Nuevo valor: %EW3080 | Path: Inputs
Asignación memoria: P_FTN301_Flow_State | Viejo valor: %EB3084 | Nuevo valor: %MW3653 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTN301_Tot_Ctrl | Viejo valor: %AB3100 | Nuevo valor: %AW3100 | Path: Outputs
Asignación memoria: P_FTN301_Totaliz_State | Viejo valor: %EB3104 | Nuevo valor: %MW3655 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTN301_Totalizer | Viejo valor: %ED3100 | Nuevo valor: %EW3100 | Path: Inputs
Actualizado: P_FTP302_Brix | Viejo valor: %ED2050 | Nuevo valor: %EW2050 | Path: Inputs
Asignación memoria: P_FTP302_Brix_State | Viejo valor: %EB2054 | Nuevo valor: %MW3657 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTP302_Tot_Ctrl | Viejo valor: %AB2070 | Nuevo valor: %AW2070 | Path: Outputs
Actualizado: P_FTP302_Density | Viejo valor: %ED2045 | Nuevo valor: %EW2045 | Path: Inputs
Asignación memoria: P_FTP302_Density_State | Viejo valor: %EB2049 | Nuevo valor: %MW3659 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTP302_Flow | Viejo valor: %ED2030 | Nuevo valor: %EW2030 | Path: Inputs
Asignación memoria: P_FTP302_Flow_State | Viejo valor: %EB2034 | Nuevo valor: %MW3661 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTP302_Temp | Viejo valor: %ED2055 | Nuevo valor: %EW2055 | Path: Inputs
Asignación memoria: P_FTP302_Temp_State | Viejo valor: %EB2059 | Nuevo valor: %MW3663 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_FTP302_Totaliz_State | Viejo valor: %EB2074 | Nuevo valor: %MW3665 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_FTP302_Totalizer | Viejo valor: %ED2070 | Nuevo valor: %EW2070 | Path: Inputs
Asignación memoria: P_gMaselli_AlcoholVolume | Viejo valor: %MD3200 | Nuevo valor: %MW3827 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProdPerStandard | Viejo valor: %MD3160 | Nuevo valor: %MW3829 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProductBrix | Viejo valor: %MD3168 | Nuevo valor: %MW3831 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProductCO2 | Viejo valor: %MD3156 | Nuevo valor: %MW3833 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProductNumber | Viejo valor: %MB3050 | Nuevo valor: %MW3835 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProductTemp | Viejo valor: %MD3164 | Nuevo valor: %MW3837 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_ProfibusStatus | Viejo valor: %MB3051 | Nuevo valor: %MW3839 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_RecipeSetNum | Viejo valor: %MB3569 | Nuevo valor: %MW3841 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gMaselli_RecipeSetNumStr | Viejo valor: %MB3570 | Nuevo valor: %MW3843 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_0 | Viejo valor: %MB3081 | Nuevo valor: %MW3845 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_1 | Viejo valor: %MB3080 | Nuevo valor: %MW3847 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_10 | Viejo valor: %MB3091 | Nuevo valor: %MW3849 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_11 | Viejo valor: %MB3092 | Nuevo valor: %MW3851 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_12 | Viejo valor: %MB3095 | Nuevo valor: %MW3853 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_13 | Viejo valor: %MB3094 | Nuevo valor: %MW3855 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_14 | Viejo valor: %MB3107 | Nuevo valor: %MW3857 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_15 | Viejo valor: %MB3108 | Nuevo valor: %MW3859 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_16 | Viejo valor: %MB3109 | Nuevo valor: %MW3861 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_17 | Viejo valor: %MB3111 | Nuevo valor: %MW3863 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_18 | Viejo valor: %MB3113 | Nuevo valor: %MW3865 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_19 | Viejo valor: %MB3112 | Nuevo valor: %MW3867 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_2 | Viejo valor: %MB3079 | Nuevo valor: %MW3869 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_20 | Viejo valor: %MB3110 | Nuevo valor: %MW3871 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_21 | Viejo valor: %MB3106 | Nuevo valor: %MW3873 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_22 | Viejo valor: %MB3105 | Nuevo valor: %MW3875 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_23 | Viejo valor: %MB3114 | Nuevo valor: %MW3877 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_24 | Viejo valor: %MB3103 | Nuevo valor: %MW3879 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_25 | Viejo valor: %MB3102 | Nuevo valor: %MW3881 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_26 | Viejo valor: %MB3070 | Nuevo valor: %MW3883 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_27 | Viejo valor: %MB3101 | Nuevo valor: %MW3885 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_28 | Viejo valor: %MB3100 | Nuevo valor: %MW3887 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_29 | Viejo valor: %MB3099 | Nuevo valor: %MW3889 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_3 | Viejo valor: %MB3078 | Nuevo valor: %MW3891 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_4 | Viejo valor: %MB3077 | Nuevo valor: %MW3893 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_5 | Viejo valor: %MB3076 | Nuevo valor: %MW3895 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_6 | Viejo valor: %MB3075 | Nuevo valor: %MW3897 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_7 | Viejo valor: %MB3074 | Nuevo valor: %MW3899 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_8 | Viejo valor: %MB3073 | Nuevo valor: %MW3901 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock01_9 | Viejo valor: %MB3072 | Nuevo valor: %MW3903 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_30 | Viejo valor: %MB3097 | Nuevo valor: %MW3905 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_31 | Viejo valor: %MB3096 | Nuevo valor: %MW3907 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_32 | Viejo valor: %MB3104 | Nuevo valor: %MW3909 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_33 | Viejo valor: %MB3098 | Nuevo valor: %MW3911 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_34 | Viejo valor: %MB3071 | Nuevo valor: %MW3913 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_35 | Viejo valor: %MB3086 | Nuevo valor: %MW3915 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_36 | Viejo valor: %MB3069 | Nuevo valor: %MW3917 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_37 | Viejo valor: %MB3058 | Nuevo valor: %MW3919 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_38 | Viejo valor: %MB3017 | Nuevo valor: %MW3921 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_39 | Viejo valor: %MB3018 | Nuevo valor: %MW3923 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_40 | Viejo valor: %MB3019 | Nuevo valor: %MW3925 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_41 | Viejo valor: %MB3020 | Nuevo valor: %MW3927 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_42 | Viejo valor: %MB3021 | Nuevo valor: %MW3929 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_43 | Viejo valor: %MB3022 | Nuevo valor: %MW3931 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_44 | Viejo valor: %MB3023 | Nuevo valor: %MW3933 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_45 | Viejo valor: %MB3024 | Nuevo valor: %MW3935 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_46 | Viejo valor: %MB3026 | Nuevo valor: %MW3937 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_47 | Viejo valor: %MB3035 | Nuevo valor: %MW3939 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_48 | Viejo valor: %MB3027 | Nuevo valor: %MW3941 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_49 | Viejo valor: %MB3028 | Nuevo valor: %MW3943 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_50 | Viejo valor: %MB3029 | Nuevo valor: %MW3945 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_51 | Viejo valor: %MB3030 | Nuevo valor: %MW3947 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_52 | Viejo valor: %MB3031 | Nuevo valor: %MW3949 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_53 | Viejo valor: %MB3015 | Nuevo valor: %MW3951 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_54 | Viejo valor: %MB3033 | Nuevo valor: %MW3953 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_55 | Viejo valor: %MB3034 | Nuevo valor: %MW3955 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_56 | Viejo valor: %MB3016 | Nuevo valor: %MW3957 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_57 | Viejo valor: %MB3025 | Nuevo valor: %MW3959 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_58 | Viejo valor: %MB3013 | Nuevo valor: %MW3961 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_59 | Viejo valor: %MB3006 | Nuevo valor: %MW3963 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_60 | Viejo valor: %MB3007 | Nuevo valor: %MW3965 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock02_61 | Viejo valor: %MB3008 | Nuevo valor: %MW3967 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_62 | Viejo valor: %MB3009 | Nuevo valor: %MW3969 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_63 | Viejo valor: %MB3010 | Nuevo valor: %MW3971 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_64 | Viejo valor: %MB3011 | Nuevo valor: %MW3973 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_65 | Viejo valor: %MB3012 | Nuevo valor: %MW3975 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_66 | Viejo valor: %MB3032 | Nuevo valor: %MW3977 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_67 | Viejo valor: %MB3036 | Nuevo valor: %MW3979 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_68 | Viejo valor: %MB3068 | Nuevo valor: %MW3981 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_69 | Viejo valor: %MB3038 | Nuevo valor: %MW3983 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_70 | Viejo valor: %MB3067 | Nuevo valor: %MW3985 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_71 | Viejo valor: %MB3066 | Nuevo valor: %MW3987 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_72 | Viejo valor: %MB3065 | Nuevo valor: %MW3989 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_73 | Viejo valor: %MB3064 | Nuevo valor: %MW3991 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_74 | Viejo valor: %MB3063 | Nuevo valor: %MW3993 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_75 | Viejo valor: %MB3062 | Nuevo valor: %MW3995 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_76 | Viejo valor: %MB3061 | Nuevo valor: %MW3997 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_77 | Viejo valor: %MB3060 | Nuevo valor: %MW3999 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_78 | Viejo valor: %MB3037 | Nuevo valor: %MW4001 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_79 | Viejo valor: %MB3059 | Nuevo valor: %MW4003 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_80 | Viejo valor: %MB3057 | Nuevo valor: %MW4005 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_81 | Viejo valor: %MB3056 | Nuevo valor: %MW4007 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_82 | Viejo valor: %MB3300 | Nuevo valor: %MW4009 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_83 | Viejo valor: %MB3054 | Nuevo valor: %MW4011 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_84 | Viejo valor: %MB3053 | Nuevo valor: %MW4013 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_INBlock03_85 | Viejo valor: %MB3052 | Nuevo valor: %MW4015 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_0 | Viejo valor: %MB3541 | Nuevo valor: %MW4017 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_1 | Viejo valor: %MB3542 | Nuevo valor: %MW4019 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_10 | Viejo valor: %MB3551 | Nuevo valor: %MW4021 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_11 | Viejo valor: %MB3552 | Nuevo valor: %MW4023 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_12 | Viejo valor: %MB3553 | Nuevo valor: %MW4025 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_13 | Viejo valor: %MB3554 | Nuevo valor: %MW4027 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_14 | Viejo valor: %MB3555 | Nuevo valor: %MW4029 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_15 | Viejo valor: %MB3556 | Nuevo valor: %MW4031 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_16 | Viejo valor: %MB3557 | Nuevo valor: %MW4033 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_17 | Viejo valor: %MB3558 | Nuevo valor: %MW4035 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_18 | Viejo valor: %MB3559 | Nuevo valor: %MW4037 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_19 | Viejo valor: %MB3560 | Nuevo valor: %MW4039 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_2 | Viejo valor: %MB3543 | Nuevo valor: %MW4041 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_20 | Viejo valor: %MB3561 | Nuevo valor: %MW4043 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_21 | Viejo valor: %MB3562 | Nuevo valor: %MW4045 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_22 | Viejo valor: %MB3563 | Nuevo valor: %MW4047 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_23 | Viejo valor: %MB3564 | Nuevo valor: %MW4049 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_24 | Viejo valor: %MB3565 | Nuevo valor: %MW4051 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_25 | Viejo valor: %MB3566 | Nuevo valor: %MW4053 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_26 | Viejo valor: %MB3567 | Nuevo valor: %MW4055 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_27 | Viejo valor: %MB3568 | Nuevo valor: %MW4057 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_3 | Viejo valor: %MB3544 | Nuevo valor: %MW4059 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_4 | Viejo valor: %MB3545 | Nuevo valor: %MW4061 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_5 | Viejo valor: %MB3546 | Nuevo valor: %MW4063 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_6 | Viejo valor: %MB3547 | Nuevo valor: %MW4065 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_7 | Viejo valor: %MB3548 | Nuevo valor: %MW4067 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_8 | Viejo valor: %MB3549 | Nuevo valor: %MW4069 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPAmPDS_OUTBlock01_9 | Viejo valor: %MB3550 | Nuevo valor: %MW4071 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM303_VFC_ActualValue | Viejo valor: %EW1642 | Nuevo valor: %MW4073 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM303_VFC_ControlWord | Viejo valor: %AW1640 | Nuevo valor: %MW4075 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM303_VFC_Refvalue | Viejo valor: %AW1642 | Nuevo valor: %MW4077 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM303_VFC_StatusWord | Viejo valor: %EW1640 | Nuevo valor: %MW4079 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM307_VFC_ActualVaule | Viejo valor: %MW3118 | Nuevo valor: %MW4081 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM307_VFC_ControlWord | Viejo valor: %MW3584 | Nuevo valor: %MW4083 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM307_VFC_Refvalue | Viejo valor: %MW3586 | Nuevo valor: %MW4085 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM307_VFC_StatusWord | Viejo valor: %MW3240 | Nuevo valor: %MW4087 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPN301_VFC_ActualValue | Viejo valor: %MW3232 | Nuevo valor: %MW4089 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPN301_VFC_ControlWord | Viejo valor: %MW3572 | Nuevo valor: %MW4091 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPN301_VFC_Refvalue | Viejo valor: %MW3574 | Nuevo valor: %MW4093 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPN301_VFC_StatusWord | Viejo valor: %MW3212 | Nuevo valor: %MW4095 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPP302_VFC_ActualValue | Viejo valor: %MW3234 | Nuevo valor: %MW4097 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPP302_VFC_ControlWord | Viejo valor: %MW3576 | Nuevo valor: %MW4099 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPP302_VFC_Refvalue | Viejo valor: %MW3578 | Nuevo valor: %MW4101 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPP302_VFC_StatusWord | Viejo valor: %MW3248 | Nuevo valor: %MW4103 | Path: IO Not in Hardware\OutputsMaster
Actualizado: PPN301_SoftStart_Averia | Viejo valor: %M3003.3 | Nuevo valor: %E2.1 | Path: Inputs
Asignación memoria: Tag_24 | Viejo valor: %MD3144 | Nuevo valor: %MW3667 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_UPSsupply | Viejo valor: %E3.6 | Nuevo valor: %E3.6 | Path: Inputs
Actualizado: DI_PB_HornReset | Viejo valor: %E0.1 | Nuevo valor: %E0.1 | Path: Inputs
Asignación memoria: DO_PB_HornReset | Viejo valor: %M3500.3 | Nuevo valor: %M4105.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DI_Flr1_PROD_ok | Viejo valor: %M3605.2 | Nuevo valor: %M3669.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr_RinseMode | Viejo valor: %M3000.4 | Nuevo valor: %M3669.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_FlrProdMode | Viejo valor: %M3516.4 | Nuevo valor: %M4105.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_Productionmode | Viejo valor: %M3603.3 | Nuevo valor: %M4105.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr1_CIPMode | Viejo valor: %M3607.5 | Nuevo valor: %M4105.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_ Flr_CIPRinseSending | Viejo valor: %M3516.5 | Nuevo valor: %M4106.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_RinseMode | Viejo valor: %M3516.6 | Nuevo valor: %M4106.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyRm_Fault | Viejo valor: %M3512.0 | Nuevo valor: %M4106.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyRm_ProdMode | Viejo valor: %M3512.1 | Nuevo valor: %M4106.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_SyRm_WaterRequest | Viejo valor: %A68.1 | Nuevo valor: %A1.1 | Path: Outputs
Asignación memoria: DO_CIP_Fault | Viejo valor: %M3516.0 | Nuevo valor: %M4106.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_Empty | Viejo valor: %M3516.1 | Nuevo valor: %M4106.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_RdyChmcl | Viejo valor: %M3516.2 | Nuevo valor: %M4106.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_Flpflp | Viejo valor: %M3516.3 | Nuevo valor: %M4106.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DI_CIP_Fault | Viejo valor: %M3002.6 | Nuevo valor: %M3669.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_End | Viejo valor: %M3660.3 | Nuevo valor: %M3669.3 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_FlpflpEn | Viejo valor: %M3001.2 | Nuevo valor: %M3669.4 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_CIP_FirstRinsedone | Viejo valor: %M3000.1 | Nuevo valor: %M3669.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_SYR_COUNTER_LT | Viejo valor: %MW3210 | Nuevo valor: %MW3669 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_SyrRoom_SyrPump_Running | Viejo valor: %E5.0 | Nuevo valor: %E5.0 | Path: Inputs
Asignación memoria: DI_SYRUP_Runout | Viejo valor: %M3003.5 | Nuevo valor: %M3671.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_Flr1_Fault | Viejo valor: %M3511.4 | Nuevo valor: %M4107.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr_ProdAvailable | Viejo valor: %MW3518 | Nuevo valor: %MW4107 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DI_Flr2_PROD_Request | Viejo valor: %M3607.4 | Nuevo valor: %M3671.7 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr2_CIP/RinseFiller | Viejo valor: %M3606.0 | Nuevo valor: %M3672.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_Flr2_CIP/Rinse | Viejo valor: %M3511.7 | Nuevo valor: %M4109.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Flr2_Fault | Viejo valor: %M3511.6 | Nuevo valor: %M4109.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM305_VFC_StatusWord | Viejo valor: %MW3242 | Nuevo valor: %MW4109 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM305_VFC_ActualValue | Viejo valor: %MW3244 | Nuevo valor: %MW4111 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM305_VFC_ControlWord | Viejo valor: %MW3588 | Nuevo valor: %MW4113 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_gPPM305_VFC_Refvalue | Viejo valor: %MW3590 | Nuevo valor: %MW4115 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM363 | Viejo valor: %M3505.4 | Nuevo valor: %M4117.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_RVM301 | Viejo valor: %A16.0 | Nuevo valor: %M4117.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM369 | Viejo valor: %M3601.3 | Nuevo valor: %M4117.5 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVP317_1 | Viejo valor: %A19.1 | Nuevo valor: %A17.0 | Path: Outputs
Asignación memoria: DO_AVM353 | Viejo valor: %M3506.0 | Nuevo valor: %M4117.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Blu_Lamp | Viejo valor: %M3500.6 | Nuevo valor: %M4117.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: P_AO_RVN305 | Viejo valor: %MW3520 | Nuevo valor: %MW4118 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DI_PPN301_SoftStart_Ovrld | Viejo valor: %E10.0 | Nuevo valor: %M3672.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_PPM306_Contactor | Viejo valor: %E11.3 | Nuevo valor: %M3672.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Ammonia_CompressorReady | Viejo valor: %M3606.7 | Nuevo valor: %M3672.3 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_Flr2_CIP_DrainComplete | Viejo valor: %M3606.1 | Nuevo valor: %M3672.4 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_PPM306_Ovrld | Viejo valor: %E10.3 | Nuevo valor: %E2.5 | Path: Inputs
Asignación memoria: DI_Flr1_WaterRequest | Viejo valor: %M3605.7 | Nuevo valor: %M3672.5 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_Flr1_Spare0 | Viejo valor: %M3601.7 | Nuevo valor: %M4120.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_CIP_Spare | Viejo valor: %M3601.4 | Nuevo valor: %M4120.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyrupValve_Enable | Viejo valor: %A11.6 | Nuevo valor: %M4120.2 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVM382 | Viejo valor: %A16.2 | Nuevo valor: %A16.2 | Path: Outputs
Asignación memoria: DO_AVP355 | Viejo valor: %M3505.3 | Nuevo valor: %M4120.3 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVN350 | Viejo valor: %M3540.0 | Nuevo valor: %A16.1 | Path: Outputs
Asignación memoria: P_AI_CIPHeaterTemperature | Viejo valor: %MW3250 | Nuevo valor: %MW3672 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_FTM305 | Viejo valor: %MW3252 | Nuevo valor: %MW3674 | Path: IO Not in Hardware\InputsMaster
Actualizado: P_AI_PTM308 | Viejo valor: %MW3254 | Nuevo valor: %EW106 | Path: Inputs
Asignación memoria: P_AI_CTS302 | Viejo valor: %MW3256 | Nuevo valor: %MW3676 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_CTS301 | Viejo valor: %MW3258 | Nuevo valor: %MW3678 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_CIPReturnTemperature | Viejo valor: %MW3260 | Nuevo valor: %MW3680 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_FillerLevel | Viejo valor: %MW3262 | Nuevo valor: %MW3682 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_CTM304 | Viejo valor: %MW3264 | Nuevo valor: %MW3684 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_PTN313 | Viejo valor: %MW3266 | Nuevo valor: %MW3686 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_RVN305 | Viejo valor: %MW3268 | Nuevo valor: %MW3688 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: P_AI_ProductO2 | Viejo valor: %MW3270 | Nuevo valor: %MW3690 | Path: IO Not in Hardware\InputsMaster
Actualizado: DO_HMIPowerSupply | Viejo valor: %A0.0 | Nuevo valor: %A0.0 | Path: Outputs
Asignación memoria: DO_PPM306_Run | Viejo valor: %A11.3 | Nuevo valor: %M4120.4 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DI_HVP301_Sensor | Viejo valor: %E7.2 | Nuevo valor: %E7.2 | Path: Inputs
Asignación memoria: DI_AVM346_Close | Viejo valor: %E112.2 | Nuevo valor: %M3692.6 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_AVM346_Open | Viejo valor: %E102.2 | Nuevo valor: %M3692.7 | Path: IO Not in Hardware\InputsMaster
Actualizado: DI_UPSAlarm | Viejo valor: %E3.5 | Nuevo valor: %E3.5 | Path: Inputs
Asignación memoria: DO_RVM301_Discharge | Viejo valor: %M3602.0 | Nuevo valor: %M4120.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_SyrupRoom_Aux2 | Viejo valor: %M3602.3 | Nuevo valor: %M4120.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Glycol_LineEnabled | Viejo valor: %M3604.0 | Nuevo valor: %M4120.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Glycol_ColdRequest | Viejo valor: %M3607.3 | Nuevo valor: %M4121.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_Glycol_LineCIP | Viejo valor: %M3607.2 | Nuevo valor: %M4121.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV1_SubCarb | Viejo valor: %M3607.1 | Nuevo valor: %M4121.2 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV2_SubCarb | Viejo valor: %M3607.0 | Nuevo valor: %M4121.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV3_SubCarb | Viejo valor: %M3606.4 | Nuevo valor: %M4121.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV4_SubCarb | Viejo valor: %M3606.3 | Nuevo valor: %M4121.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_BoosterPump_SubCarb | Viejo valor: %M3606.2 | Nuevo valor: %M4121.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_200V26 | Viejo valor: %M3600.3 | Nuevo valor: %M4121.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV100_WaterInlet | Viejo valor: %M3601.6 | Nuevo valor: %M4122.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_200V28 | Viejo valor: %M3603.7 | Nuevo valor: %M4122.1 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVM340 | Viejo valor: %M3600.2 | Nuevo valor: %A20.1 | Path: Outputs
Asignación memoria: DO_AVM339 | Viejo valor: %M3605.6 | Nuevo valor: %M4122.2 | Path: IO Not in Hardware\OutputsMaster
Actualizado: DO_AVM341 | Viejo valor: %A17.5 | Nuevo valor: %A17.5 | Path: Outputs
Asignación memoria: DO_AVM342 | Viejo valor: %M3600.4 | Nuevo valor: %M4122.3 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM346 | Viejo valor: %M3600.1 | Nuevo valor: %M4122.4 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_AVM380 | Viejo valor: %M3600.6 | Nuevo valor: %M4122.5 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV102_Syrup And CIP Inlet | Viejo valor: %M3601.2 | Nuevo valor: %M4122.6 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV103_WaterInterception | Viejo valor: %M3601.1 | Nuevo valor: %M4122.7 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_WaterBypass1 | Viejo valor: %M3601.0 | Nuevo valor: %M4123.0 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: DO_EV105_WaterBypass | Viejo valor: %M3600.7 | Nuevo valor: %M4123.1 | Path: IO Not in Hardware\OutputsMaster
Asignación memoria: CARLOS_TESTE | Viejo valor: %M2.2 | Nuevo valor: %M3693.0 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_PPM303_Contactor | Viejo valor: %E2.5 | Nuevo valor: %M3693.1 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DI_SyrRoom_Alarm_Reset | Viejo valor: %M3605.0 | Nuevo valor: %M3693.2 | Path: IO Not in Hardware\InputsMaster
Asignación memoria: DO_Analayzer_Enable | Viejo valor: %M3602.1 | Nuevo valor: %M4123.2 | Path: IO Not in Hardware\OutputsMaster
Actualizado: P_PDS_Recipe_Number | Viejo valor: %AB15001 | Nuevo valor: %AW15000 | Path: Outputs
Actualizado: P_PDS_Freeze_To_PDS | Viejo valor: %A15002.0 | Nuevo valor: %AW15032 | Path: Outputs
Actualizado: P_PDS_Stop_to_PDS | Viejo valor: %A15002.1 | Nuevo valor: %AW15064 | Path: Outputs
Actualizado: P_PDS_CO2 | Viejo valor: %ED15060 | Nuevo valor: %EW15000 | Path: Inputs
Actualizado: P_PDS_Product_Brix | Viejo valor: %ED15084 | Nuevo valor: %EW15032 | Path: Inputs
Actualizado: P_PDS_Temperature | Viejo valor: %ED15104 | Nuevo valor: %EW15064 | Path: Inputs
Actualizado: P_PDS_Density | Viejo valor: %ED15112 | Nuevo valor: %EW15096 | Path: Inputs
Archivo Excel guardado: C:/Trabajo/SIDEL/06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)/Reporte/TAGsIO/v2\PLCTags_Updated.xlsx
============================== RESUMEN ==============================
Total de tags procesados: 465
Tags actualizados desde el Markdown: 101
Tags relocalizados a Inputs: 49
Tags relocalizados a Outputs: 52
Tags relocalizados a InputsMaster: 102
Tags relocalizados a OutputsMaster: 262
Tags con direcciones de memoria asignadas: 364
--- ERRORES (STDERR) ---
Ninguno
--- FIN DEL LOG ---

View File

@ -0,0 +1,51 @@
--- Log de Ejecución: x2_process_CAx.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 11:01:47
Fin: 2025-05-15 11:01:52
Duración: 0:00:04.917359
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
--- AML (CAx Export) to Hierarchical JSON and Obsidian MD Converter (v31.1 - Corrected IO Summary Table Initialization) ---
Using Working Directory for Output: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Input AML: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.aml
Output Directory: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Output JSON: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.hierarchical.json
Output IO Debug Tree MD: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export_IO_Upward_Debug.md
Processing AML file: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.aml
Pass 1: Found 203 InternalElement(s). Populating device dictionary...
Pass 2: Identifying PLCs and Networks (Refined v2)...
Identified Network: PROFIBUS_1 (442e4d1d-7d42-4d59-bd77-ec619f883907) Type: Profibus
Identified Network: ETHERNET_1 (26504433-7319-4b53-8f42-0ae24c9e88a2) Type: Ethernet/Profinet
Identified PLC: PLC (a48e038f-0bcc-4b48-8373-033da316c62b) - Type: CPU 1516F-3 PN/DP OrderNo: 6ES7 516-3FP03-0AB0
Pass 3: Processing InternalLinks (Robust Network Mapping & IO)...
Found 115 InternalLink(s).
Mapping Device/Node 'E1' (NodeID:60d02ba8-54ea-4508-8a3a-986826e276c6, Addr:10.1.33.11) to Network 'ETHERNET_1'
--> Associating Network 'ETHERNET_1' with PLC 'PLC' (via Node 'E1' Addr: 10.1.33.11)
Mapping Device/Node 'P1' (NodeID:8cf403ec-810d-43de-826a-aa447f887ee3, Addr:1) to Network 'PROFIBUS_1'
--> Associating Network 'PROFIBUS_1' with PLC 'PLC' (via Node 'P1' Addr: 1)
Mapping Device/Node 'PB1' (NodeID:b618b2b1-9ea8-41c1-a87e-fb0a3627a51d, Addr:12) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:4e5d84a4-eb22-4d1f-8143-fc4d770eb2e7, Addr:20) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:e6f362b4-398b-4854-b15b-7435745e4650, Addr:21) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:1a5422d6-c2bf-4a1c-8cf9-7b89fbaf4090, Addr:22) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:6b3de492-236f-4894-9bcf-3ee6c851c230, Addr:10) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:bf8c18a3-aa60-4106-b779-afff78cdac47, Addr:8) to Network 'PROFIBUS_1'
Mapping Device/Node 'PB1' (NodeID:5e2810b0-4018-4747-bba9-19b8f9b14994, Addr:40) to Network 'PROFIBUS_1'
Data extraction and structuring complete.
Generating JSON output: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export.hierarchical.json
JSON data written successfully.
IO upward debug tree written to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\SAE196_c0.2_CAx_Export_IO_Upward_Debug.md
Found 1 PLC(s). Generating individual hardware trees...
Generating Hardware Tree for PLC 'PLC' (ID: a48e038f-0bcc-4b48-8373-033da316c62b) at: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLC\Documentation\SAE196_c0.2_CAx_Export_Hardware_Tree.md
Markdown tree summary written to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLC\Documentation\SAE196_c0.2_CAx_Export_Hardware_Tree.md
IO summary table written to: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\Hardware.md
IO summary table generated in separate file: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\Hardware.md
Script finished.
--- ERRORES (STDERR) ---
Ninguno
--- FIN DEL LOG ---

View File

@ -0,0 +1,19 @@
--- Log de Ejecución: x3_excel_to_md.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 11:58:03
Fin: 2025-05-15 11:58:05
Duración: 0:00:01.664065
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
Usando directorio de trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Configuración de paths cargada desde: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\io_paths_config.json
Usando archivo Excel predeterminado: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx
Procesando archivo Excel: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx...
Paths configurados para procesar: ['Inputs', 'Outputs', 'OutputsFesto', 'IO Not in Hardware\\InputsMaster', 'IO Not in Hardware\\OutputsMaster']
¡Éxito! Archivo Excel convertido a Markdown en: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\Master IO Tags.md
--- ERRORES (STDERR) ---
Ninguno
--- FIN DEL LOG ---

View File

@ -0,0 +1,19 @@
--- Log de Ejecución: x4_prompt_generator.py ---
Grupo: IO_adaptation
Directorio de Trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
Inicio: 2025-05-15 12:09:38
Fin: 2025-05-15 12:09:38
Duración: 0:00:00.084182
Estado: ERROR (Código de Salida: 1)
--- SALIDA ESTÁNDAR (STDOUT) ---
--- ERRORES (STDERR) ---
Traceback (most recent call last):
File "D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\x4_prompt_generator.py", line 11, in <module>
import pyperclip # Para copiar al portapapeles
^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'pyperclip'
--- FIN DEL LOG ---

View File

@ -0,0 +1,12 @@
{
"level1": {
"api_key": "your-api-key-here",
"model": "gpt-3.5-turbo"
},
"level2": {
"Input_level_1": "Inputs",
"Input_level_2": "IO Not in Hardware\\\\InputsMaster"
},
"level3": {},
"working_directory": "C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\TAGsIO\\v2"
}

View File

@ -1,8 +1,38 @@
{
"x1_agregatetags_to_md.py": {
"display_name": "Convertir Excel Tags a Markdown",
"x1_export_CAx.py": {
"display_name": "1: Exportar CAx desde TIA",
"short_description": "Exporta datos CAx de un proyecto TIA Portal y genera un resumen en Markdown.",
"long_description": "Este script utiliza TIA Portal Openness para exportar datos CAx de un proyecto de TIA Portal y generar un resumen en formato Markdown.\n***\n**Lógica Principal:**\n\n1. **Configuración:** Carga parámetros desde `ParamManagerScripts` (directorio de trabajo, versión de TIA Portal).\n2. **Selección de Proyecto:** Abre un cuadro de diálogo para seleccionar el archivo del proyecto de TIA Portal.\n3. **Conexión a TIA Portal:** Utiliza la API de TIA Openness para conectarse al portal y abrir el proyecto seleccionado.\n4. **Exportación CAx:** Exporta los datos CAx en formato AML y genera un archivo de resumen en Markdown con la jerarquía del proyecto y los dispositivos encontrados.\n5. **Cierre:** Cierra la conexión con TIA Portal al finalizar.",
"hidden": false
},
"x2_process_CAx.py": {
"display_name": "2: Procesar la exportación AML y generar documentación de IOs",
"short_description": "Extrae IOs de un archivo AML exportado del TIA Portal y genera un archivo Markdown.",
"long_description": "Este script procesa un archivo AML exportado desde TIA Portal para extraer información de los IOs y generar un archivo Markdown con un resumen detallado.\n***\n**Lógica Principal:**\n\n1. **Selección de Archivo AML:** Abre un cuadro de diálogo para seleccionar el archivo AML exportado desde TIA Portal.\n2. **Procesamiento de Datos:**\n * Extrae información de dispositivos, redes y conexiones desde el archivo AML.\n * Identifica PLCs, redes y módulos IO.\n * Genera una estructura jerárquica de los dispositivos y sus conexiones.\n3. **Generación de Markdown:**\n * Crea un archivo Markdown con un resumen jerárquico de hardware y conexiones IO.\n * Incluye un árbol de conexiones IO hacia arriba para depuración.\n4. **Salida:** Guarda los resultados en archivos Markdown y JSON en el directorio configurado.",
"hidden": false
},
"x3_excel_to_md.py": {
"display_name": "3:Convertir Excel Tags a Markdown",
"short_description": "This script converts Excel files containing tags into Markdown tables",
"long_description": "Tener en cuenta que el nombre de los archivo excel determina si en la tabla se asignan los tag a las entradas o las salidas.",
"long_description": "",
"hidden": false
},
"x4_prompt_generator.py": {
"display_name": "4:Generar Prompt",
"short_description": "Generador de prompt para adaptación de IO - Este script genera un prompt para ayudar con la",
"long_description": "",
"hidden": false
},
"x5_md_to_excel.py": {
"display_name": "5:Convertir Markdown a Excel para TIA Portal",
"short_description": "Convert Markdown tables from adapted I/O to Excel for import into TIA Portal.",
"long_description": "# Script de Adaptación IO para PLCTags\n\n## Descripción\n\nEste script automatiza la adaptación de tags PLC entre hardware físico Siemens TIA Portal y software master, actualizando las direcciones lógicas según un archivo de mapeo en formato Markdown.\n\n## Funcionamiento\n\n### Entradas\n- **Archivo Excel**: Exportación de tags desde TIA Portal\n- **Archivo Markdown**: Tabla de adaptación IO con mapeo entre hardware y master tags\n\n### Proceso\n1. **Análisis inicial**:\n - Lee la tabla Markdown de adaptación IO\n - Identifica las columnas de IO y Master Tag\n - Crea un diccionario de mapeo entre tags y direcciones IO\n\n2. **Procesamiento de tags**:\n - Filtra tags en los paths \"Inputs\", \"Outputs\", \"IO Not in Hardware\\InputsMaster\" y \"IO Not in Hardware\\OutputsMaster\"\n - Actualiza las direcciones lógicas de los tags encontrados en el mapeo\n - Reasigna paths según el tipo de señal (%E -> \"Inputs\", %A -> \"Outputs\")\n\n3. **Gestión de tags sin hardware**:\n - Asigna direcciones de memoria (%Mxxxx.x) para tags sin correspondencia\n - Tags de entrada: Asignados a \"IO Not in Hardware\\InputsMaster\" desde %M3600.0\n - Tags de salida: Asignados a \"IO Not in Hardware\\OutputsMaster\" desde %M3800.0\n\n4. **Manejo de direcciones**:\n - Convierte formatos (I0.0 → %E0.0, PEW100 → %EW100, etc.)\n - Gestiona bits incrementalmente (0.0, 0.1, ..., 0.7, luego 1.0)\n - Alinea words cada 2 bytes (%MW3600, %MW3602, etc.)\n\n### Salidas\n- **Archivo Excel actualizado**: Con las nuevas direcciones lógicas y paths\n- **Archivo de log**: Registro detallado del proceso con estadísticas\n\n## Uso\n1. Ejecute el script\n2. Seleccione el archivo Excel exportado de TIA Portal\n3. Seleccione el archivo Markdown con la tabla de adaptación\n4. El script generará automáticamente el archivo Excel actualizado\n\n## Detección de tipos\n- **Entradas**: Identificadas por prefijos (DI_, P_AI_, etc.)\n- **Salidas**: Identificadas por prefijos (DO_, P_AO_, etc.)\n- **Bits vs Words**: Determinados por el tipo de dato (Bool vs Word/Int)",
"hidden": false
},
"x0_documentation.py": {
"display_name": "0:Documentación",
"short_description": "Descripción del flujo de trabajo",
"long_description": "### Flujo de trabajo:\n***\n1. Se usa [x1] para exportar los datos de configuración desde el proyecto de Tia Portal, incluidos los IO configurados en el hardware. Esto genera un archivo AML.\n2. Con [x2] se procesa el archivo AML y se convierte en markdown. Si hay un solo PLC se genera el archivo [Hardware.md]\n3. Se deben procesar los IO **desde el esquema eléctrico y agregarlos** a [Hardware.md]\n4. Se debe exportar todos los tags como un archivo excel desde el Tia Portal.\n5. Con [x3] se convierte y se filtran los tags según los path definidos en [io_paths_config] y se genera un archivo Master IO Tags.md\n6. [x4] Genera el prompt a usar con Claude usando MCP para que pueda acceder a los archivos originales y evitar tener que hacer uploads.\n7. Una vez que se genera el archivo procesado por el LLM se puede usar [x5] que convierte las adaptaciones a un archivo que luego se puede importar en Tia Portal\n8. Importar en Tia Portal el archivo [PLCTags_Updated.xlsx]",
"hidden": false
}
}

View File

@ -0,0 +1,6 @@
{
"path": "C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\TAGsIO\\v2",
"history": [
"C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\TAGsIO\\v2"
]
}

View File

@ -1,472 +0,0 @@
import pandas as pd
import re
import os
import shutil
import openpyxl
import sys
from datetime import datetime
def read_markdown_table(file_path):
"""Leer tabla en formato Markdown de Obsidian y convertirla a DataFrame."""
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
# Dividir el contenido en líneas
lines = content.strip().split('\n')
# Encontrar el inicio de la tabla (la primera línea que comienza con '|')
table_start = None
for i, line in enumerate(lines):
if line.strip().startswith('|'):
table_start = i
break
if table_start is None:
print("No se encontró ninguna tabla en el archivo")
return pd.DataFrame()
# Encontrar todas las líneas de la tabla
table_lines = []
for i in range(table_start, len(lines)):
line = lines[i].strip()
if line.startswith('|'):
table_lines.append(line)
elif not line: # Línea vacía podría indicar el final de la tabla
# Si la siguiente línea no comienza con '|', consideramos que es el final de la tabla
if i + 1 < len(lines) and not lines[i + 1].strip().startswith('|'):
break
else:
break # Si no comienza con '|' y no está vacía, es el final de la tabla
if len(table_lines) < 3: # Necesitamos al menos encabezado, separador y una fila de datos
print("La tabla no tiene suficientes filas")
return pd.DataFrame()
# Procesar encabezados
header_line = table_lines[0]
separator_line = table_lines[1]
# Verificar que la segunda línea sea realmente un separador
is_separator = all(cell.strip().startswith(':') or cell.strip().startswith('-')
for cell in separator_line.split('|')[1:-1] if cell.strip())
if not is_separator:
print("Advertencia: La segunda línea no parece ser un separador. Se asume que es parte de los datos.")
separator_idx = None
else:
separator_idx = 1
# Extraer encabezados
header_cells = header_line.split('|')
# Eliminar elementos vacíos al principio y al final
if not header_cells[0].strip():
header_cells = header_cells[1:]
if not header_cells[-1].strip():
header_cells = header_cells[:-1]
headers = [h.strip() for h in header_cells]
print(f"Encabezados detectados: {headers}")
# Procesar filas de datos
data_start_idx = 2 if separator_idx == 1 else 1
data = []
for line in table_lines[data_start_idx:]:
# Dividir la línea por el carácter pipe
cells = line.split('|')
# Eliminar elementos vacíos al principio y al final
if not cells[0].strip():
cells = cells[1:]
if not cells[-1].strip():
cells = cells[:-1]
# Limpiar valores
row_values = [cell.strip() for cell in cells]
# Asegurar que la fila tenga el mismo número de columnas que los encabezados
if len(row_values) != len(headers):
print(f"Advertencia: Fila con {len(row_values)} valores, pero se esperaban {len(headers)}. Ajustando...")
# Intentar ajustar la fila para que coincida con el número de columnas
if len(row_values) < len(headers):
row_values.extend([''] * (len(headers) - len(row_values)))
else:
row_values = row_values[:len(headers)]
data.append(row_values)
# Convertir a DataFrame
df = pd.DataFrame(data, columns=headers)
return df
def create_log_file(log_path):
"""Crear un archivo de log con timestamp."""
log_dir = os.path.dirname(log_path)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir)
with open(log_path, 'w', encoding='utf-8') as log_file:
log_file.write(f"Log de actualización de PLCTags - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
log_file.write("=" * 80 + "\n\n")
return log_path
def log_message(log_path, message):
"""Añadir mensaje al log."""
with open(log_path, 'a', encoding='utf-8') as log_file:
log_file.write(message + "\n")
print(message)
def transform_io_address(address):
"""
Transform IO addresses according to the required format:
- Ixx.x %Exx.x
- Exx.x %Exx.x
- Qxx.x %Axx.x
- Axx.x %Axx.x
- PEWxx %EWxx
- PAWxx %AWxx
"""
if not address or not isinstance(address, str):
return address
address = address.strip()
# Patterns for boolean addresses
if re.match(r'^I(\d+)\.(\d+)$', address):
return re.sub(r'^I(\d+)\.(\d+)$', r'%E\1.\2', address)
elif re.match(r'^E(\d+)\.(\d+)$', address):
return re.sub(r'^E(\d+)\.(\d+)$', r'%E\1.\2', address)
elif re.match(r'^Q(\d+)\.(\d+)$', address):
return re.sub(r'^Q(\d+)\.(\d+)$', r'%A\1.\2', address)
elif re.match(r'^A(\d+)\.(\d+)$', address):
return re.sub(r'^A(\d+)\.(\d+)$', r'%A\1.\2', address)
# Patterns for word addresses
elif re.match(r'^PEW(\d+)$', address):
return re.sub(r'^PEW(\d+)$', r'%EW\1', address)
elif re.match(r'^PAW(\d+)$', address):
return re.sub(r'^PAW(\d+)$', r'%AW\1', address)
# If already in correct format or unknown format, return as is
return address
def update_excel_with_adaptation(excel_path, adaptation_path, output_path=None, log_path=None):
"""
Actualiza el archivo Excel con la información de adaptación.
- Modifica la columna "Logical Address" según las reglas:
1. Si el tag se encuentra en la tabla de adaptación, convierte el formato de IO.
2. Si no se encuentra y tiene formato %E, %A, %EW, %AW, asigna una dirección %M.
Args:
excel_path: Ruta al archivo Excel de tags PLC
adaptation_path: Ruta al archivo de adaptación en Markdown
output_path: Ruta para guardar el Excel actualizado (si es None, sobrescribe el original)
log_path: Ruta para el archivo de log
"""
# Si no se especifica ruta de salida, sobrescribir el archivo original
if output_path is None:
output_path = excel_path
# Si no se especifica ruta de log, crear una por defecto
if log_path is None:
log_dir = os.path.dirname(output_path)
log_filename = f"update_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
log_path = os.path.join(log_dir, log_filename)
# Crear archivo de log
create_log_file(log_path)
log_message(log_path, f"Archivo Excel de entrada: {excel_path}")
log_message(log_path, f"Archivo de adaptación: {adaptation_path}")
log_message(log_path, f"Archivo Excel de salida: {output_path}")
log_message(log_path, "-" * 80)
# Leer el archivo de adaptación
adaptation_df = read_markdown_table(adaptation_path)
# Identificar automáticamente la columna Master TAG
master_tag_col = None
for col in adaptation_df.columns:
# Buscar columnas con "master" y "tag" en el nombre (insensible a mayúsculas)
if "master" in col.lower() and "tag" in col.lower():
master_tag_col = col
break
# Si no encontramos la columna por nombre exacto, intentar con coincidencias parciales
if not master_tag_col:
for col in adaptation_df.columns:
if any(keyword in col.lower() for keyword in ["master", "tag", "name"]):
master_tag_col = col
break
# Si aún no hemos encontrado, verificar el contenido de las columnas
if not master_tag_col and not adaptation_df.empty:
# Buscar columnas que contengan valores que parezcan tags (con formato DI_xxx, DO_xxx, etc.)
for col in adaptation_df.columns:
# Tomar algunas muestras
samples = adaptation_df[col].dropna().astype(str).head(5).tolist()
# Comprobar si alguna muestra coincide con el patrón de Master TAG
tag_pattern = r'^[A-Z]{2,3}_[A-Za-z0-9_]+$'
if any(re.match(tag_pattern, s) for s in samples):
master_tag_col = col
break
if not master_tag_col:
error_msg = "Error: No se encontró la columna 'Master Tag' o similar en el archivo de adaptación"
log_message(log_path, error_msg)
log_message(log_path, f"Columnas disponibles: {adaptation_df.columns.tolist()}")
return False
log_message(log_path, f"Usando columna '{master_tag_col}' para el mapeo de tags")
# Aseguramos que no tenemos filas completamente vacías o solo con Master TAG vacío
adaptation_df = adaptation_df[adaptation_df[master_tag_col].notna() &
(adaptation_df[master_tag_col] != '')]
# Identificar automáticamente la columna IO
io_col = None
for col in adaptation_df.columns:
# Buscar coincidencias exactas
if col.lower() == "io":
io_col = col
break
# Buscar coincidencias parciales
if any(keyword in col.lower() for keyword in ["io", "i/o", "address", "logical"]):
io_col = col
break
# Si aún no encontramos, verificar el contenido de las columnas
if not io_col and not adaptation_df.empty:
# Buscar columnas que contengan valores que parezcan direcciones IO (I0.0, Q1.2, etc.)
for col in adaptation_df.columns:
# Tomar algunas muestras
samples = adaptation_df[col].dropna().astype(str).head(5).tolist()
# Definir patrones para direcciones IO
io_patterns = [
r'^[IQM][0-9]+\.[0-9]+$', # Ejemplo: I0.0, Q1.2
r'^PE[WBD][0-9]+$', # Ejemplo: PEW100
r'^PA[WBD][0-9]+$' # Ejemplo: PAW100
]
# Verificar si alguna muestra coincide con algún patrón
matches = False
for pattern in io_patterns:
if any(re.match(pattern, s) for s in samples):
matches = True
break
if matches:
io_col = col
break
if not io_col:
error_msg = "Error: No se encontró la columna 'IO' o similar en el archivo de adaptación"
log_message(log_path, error_msg)
log_message(log_path, f"Columnas disponibles: {adaptation_df.columns.tolist()}")
return False
log_message(log_path, f"Usando columna '{io_col}' para los valores de IO")
# Eliminar el archivo de salida si ya existe
if os.path.exists(output_path):
try:
os.remove(output_path)
log_message(log_path, f"Archivo de salida existente eliminado: {output_path}")
except Exception as e:
log_message(log_path, f"Error al eliminar archivo existente: {e}")
return False
# Crear una copia exacta del archivo Excel original
try:
shutil.copy2(excel_path, output_path)
log_message(log_path, f"Archivo Excel copiado: {excel_path} -> {output_path}")
except Exception as e:
log_message(log_path, f"Error al copiar el archivo Excel: {e}")
return False
# Abrir el archivo Excel copiado usando openpyxl para preservar estructura
try:
workbook = openpyxl.load_workbook(output_path)
log_message(log_path, f"Archivo Excel abierto correctamente: {output_path}")
log_message(log_path, f"Hojas disponibles: {workbook.sheetnames}")
except Exception as e:
log_message(log_path, f"Error al abrir el archivo Excel: {e}")
return False
# Crear un diccionario de actualización desde el archivo de adaptación
update_dict = {}
unmatched_count = 0
for idx, row in adaptation_df.iterrows():
master_tag = row[master_tag_col]
io_value = row[io_col]
# Convertir a string y limpiar espacios
master_tag_str = str(master_tag).strip() if not pd.isna(master_tag) else ""
io_value_str = str(io_value).strip() if not pd.isna(io_value) else ""
if master_tag_str and io_value_str:
update_dict[master_tag_str] = transform_io_address(io_value_str)
else:
unmatched_count += 1
if unmatched_count > 0:
log_message(log_path, f"Advertencia: {unmatched_count} filas en el archivo de adaptación tenían valores vacíos de Master TAG o IO")
log_message(log_path, f"Tags encontrados en el archivo de adaptación: {len(update_dict)}")
# Inicializar contador para direcciones %M
memory_byte_counter = 3600
memory_bit_counter = 0
# Contador de coincidencias
matched_tags = []
unmatched_adaptation_tags = set(update_dict.keys())
converted_to_memory = []
# Procesar cada hoja
for sheet_name in workbook.sheetnames:
sheet = workbook[sheet_name]
log_message(log_path, f"\nProcesando hoja: {sheet_name}")
# Encontrar la columna "Name" y "Logical Address"
name_col_idx = None
logical_addr_col_idx = None
data_type_col_idx = None
for col_idx, cell in enumerate(sheet[1], 1): # Asumiendo que la primera fila contiene encabezados
cell_value = str(cell.value).lower() if cell.value else ""
if "name" in cell_value:
name_col_idx = col_idx
log_message(log_path, f"Columna 'Name' encontrada en posición {col_idx}")
if "logical address" in cell_value:
logical_addr_col_idx = col_idx
log_message(log_path, f"Columna 'Logical Address' encontrada en posición {col_idx}")
if "data type" in cell_value:
data_type_col_idx = col_idx
log_message(log_path, f"Columna 'Data Type' encontrada en posición {col_idx}")
if name_col_idx is None or logical_addr_col_idx is None:
log_message(log_path, f"No se encontraron las columnas necesarias en la hoja {sheet_name}, omitiendo...")
continue
# Actualizar los valores de "Logical Address"
updates_in_sheet = 0
memory_address_conversions = 0
for row_idx, row in enumerate(sheet.iter_rows(min_row=2), 2): # Comenzando desde la fila 2
name_cell = row[name_col_idx - 1] # Ajuste para índice base 0
logical_addr_cell = row[logical_addr_col_idx - 1] # Ajuste para índice base 0
data_type_cell = row[data_type_col_idx - 1] if data_type_col_idx else None # Puede ser None
tag_name = str(name_cell.value).strip() if name_cell.value else ""
current_address = str(logical_addr_cell.value).strip() if logical_addr_cell.value else ""
data_type = str(data_type_cell.value).strip().lower() if data_type_cell and data_type_cell.value else ""
if not tag_name or not current_address:
continue
# Caso 1: Tag encontrado en el diccionario de adaptación
if tag_name in update_dict:
old_value = logical_addr_cell.value
new_value = update_dict[tag_name]
logical_addr_cell.value = new_value
updates_in_sheet += 1
matched_tags.append(tag_name)
if tag_name in unmatched_adaptation_tags:
unmatched_adaptation_tags.remove(tag_name)
log_message(log_path, f" Actualizado: {tag_name} | Viejo valor: {old_value} | Nuevo valor: {new_value}")
# Caso 2: Tag no encontrado en adaptación pero con formato %E, %A, %EW, %AW
elif (current_address.startswith('%E') or
current_address.startswith('%A') or
current_address.startswith('%EW') or
current_address.startswith('%AW')):
old_value = logical_addr_cell.value
# Determinar si es booleano o word
is_boolean = ('bool' in data_type) or ('.') in current_address
if is_boolean:
# Para boolean, usamos formato %M byte.bit
new_value = f"%M{memory_byte_counter}.{memory_bit_counter}"
memory_bit_counter += 1
# Si llegamos a bit 8, pasamos al siguiente byte
if memory_bit_counter > 7:
memory_bit_counter = 0
memory_byte_counter += 1
else:
# Para word, usamos %MW y aumentamos en incrementos de 2
new_value = f"%MW{memory_byte_counter}"
memory_byte_counter += 2
logical_addr_cell.value = new_value
memory_address_conversions += 1
converted_to_memory.append(tag_name)
log_message(log_path, f" Convertido a memoria: {tag_name} | Viejo valor: {old_value} | Nuevo valor: {new_value}")
log_message(log_path, f"Total de actualizaciones en la hoja {sheet_name}: {updates_in_sheet}")
log_message(log_path, f"Total de conversiones a memoria en la hoja {sheet_name}: {memory_address_conversions}")
# Guardar cambios
try:
workbook.save(output_path)
log_message(log_path, f"\nArchivo Excel actualizado guardado: {output_path}")
except Exception as e:
log_message(log_path, f"Error al guardar el archivo Excel: {e}")
return False
# Mostrar resumen
unique_matched_tags = set(matched_tags)
log_message(log_path, "\n" + "=" * 30 + " RESUMEN " + "=" * 30)
log_message(log_path, f"Total de tags en archivo de adaptación: {len(update_dict)}")
log_message(log_path, f"Total de tags actualizados (coincidencias): {len(unique_matched_tags)}")
log_message(log_path, f"Total de tags convertidos a memoria: {len(converted_to_memory)}")
# Mostrar tags del archivo de adaptación sin coincidencias
if unmatched_adaptation_tags:
log_message(log_path, f"\nTags sin coincidencias ({len(unmatched_adaptation_tags)}):")
for tag in sorted(unmatched_adaptation_tags):
log_message(log_path, f" - {tag} -> {update_dict[tag]}")
return True
if __name__ == "__main__":
# Rutas de archivos predeterminadas
adaptation_table = r"C:\Users\migue\OneDrive\Miguel\Obsidean\Trabajo\VM\04-SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\SAE196 - IO Adapted.md"
tag_from_master_table = r"C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\PLCTags.xlsx"
output_table = r"C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\PLCTags_Updated.xlsx" # Crear un nuevo archivo para no sobrescribir el original
log_path = r"update_log.txt" # Ruta para el archivo de log
# Permitir pasar rutas como argumentos desde la línea de comandos
if len(sys.argv) > 1:
tag_from_master_table = sys.argv[1]
if len(sys.argv) > 2:
adaptation_table = sys.argv[2]
if len(sys.argv) > 3:
output_table = sys.argv[3]
if len(sys.argv) > 4:
log_path = sys.argv[4]
# Ejecutar la actualización
result = update_excel_with_adaptation(tag_from_master_table, adaptation_table, output_table, log_path)
if result:
print("\nProceso completado exitosamente.")
print(f"Se ha generado un archivo log en: {log_path}")
else:
print("\nHubo errores durante el proceso.")
print(f"Consulte el archivo log para más detalles: {log_path}")

View File

@ -1,193 +0,0 @@
"""
convert Excel Tags to md : This script converts Excel files containing tags into Markdown tables.
"""
# Standard library imports
import os
import sys
import glob
# Third-party imports
try:
import pandas as pd
except ImportError:
print(
"Error: La librería 'pandas' no está instalada. Por favor, instálala con 'pip install pandas openpyxl'."
)
sys.exit(1)
# Determine script_root and add to sys.path for custom module import
# This structure assumes x1_agregatetags_to_md.py is located at:
# d:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\ObtainIOFromProjectTia\x1_agregatetags_to_md.py
# leading to script_root = d:\Proyectos\Scripts\ParamManagerScripts
try:
current_script_path = os.path.abspath(__file__)
script_root = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.dirname(current_script_path)))
)
if script_root not in sys.path:
sys.path.append(script_root)
from backend.script_utils import load_configuration
except ImportError:
print(
"Error: No se pudo importar 'load_configuration' desde 'backend.script_utils'."
)
sys.exit(1)
except NameError: # __file__ is not defined
print(
"Error: __file__ no está definido. Este script podría no estar ejecutándose en un entorno Python estándar."
)
sys.exit(1)
def convert_excel_to_markdown_tables():
"""
Busca archivos Excel en el working_directory, los convierte a tablas Markdown
y los consolida en un único archivo .md.
"""
try:
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
print("Error: 'working_directory' no se encontró en la configuración.")
return
if not os.path.isdir(working_directory):
print(
f"Error: El directorio de trabajo '{working_directory}' no existe o no es un directorio."
)
return
except Exception as e:
print(f"Error al cargar la configuración: {e}")
return
working_directory_abs = os.path.abspath(working_directory)
print(f"Usando directorio de trabajo: {working_directory_abs}")
excel_files = glob.glob(os.path.join(working_directory_abs, "*.xlsx"))
if not excel_files:
print(f"No se encontraron archivos Excel (.xlsx) en {working_directory_abs}.")
return
output_md_filename = "IO Tags consolidated.md"
output_md_filepath_abs = os.path.join(working_directory_abs, output_md_filename)
markdown_content = []
# Definición de las columnas y sus anchos para el formato Markdown (basado en el ejemplo)
# Nombres de las columnas en la tabla Markdown
md_header_names = ["Master Tag", "Type", "Data Type", "Description"]
# Anchos de las celdas de contenido (espacio disponible para el texto)
col_widths = {"Master Tag": 32, "Type": 6, "Data Type": 9, "Description": 71}
# Crear el encabezado y separador Markdown una vez, ya que se repite para cada tabla
header_parts = [f" {name:<{col_widths[name]}} " for name in md_header_names]
markdown_table_header = f"|{'|'.join(header_parts)}|"
separator_parts = [f" {'-'*col_widths[name]} " for name in md_header_names]
markdown_table_separator = f"|{'|'.join(separator_parts)}|"
for excel_file_path in excel_files:
excel_filename = os.path.basename(excel_file_path)
print(f"Procesando archivo Excel: {excel_filename}...")
# Determinar si el nombre del archivo sugiere un tipo específico ("Input" o "Output")
filename_suggested_type = None
if "input" in excel_filename.lower():
filename_suggested_type = "Input"
elif (
"output" in excel_filename.lower()
): # elif para dar precedencia a "input" si ambos estuvieran
filename_suggested_type = "Output"
try:
table_title = os.path.splitext(excel_filename)[0]
markdown_content.append(f"## {table_title}\n")
markdown_content.append(markdown_table_header)
markdown_content.append(markdown_table_separator)
df = pd.read_excel(excel_file_path, sheet_name=0)
# Columnas esperadas en el archivo Excel
excel_col_master_tag = "Name"
excel_col_original_type = "Path" # Columna del Excel que originalmente contiene el tipo (ej. "Inputs")
excel_col_data_type = "Data Type"
excel_col_comment = "Comment" # Columna para la descripción
excel_required_cols = [
excel_col_master_tag,
excel_col_original_type, # Requerida como fuente base o fallback para el tipo
excel_col_data_type,
excel_col_comment,
]
missing_cols = [col for col in excel_required_cols if col not in df.columns]
if missing_cols:
msg = f"*Archivo '{excel_filename}' omitido debido a columnas faltantes: {', '.join(missing_cols)}*\n"
print(f"Advertencia: {msg.strip()}")
markdown_content.append(msg)
continue
for _, row in df.iterrows():
master_tag = str(row.get(excel_col_master_tag, ""))
# Determinar el valor final para la columna 'Type' en Markdown
# Por defecto, tomar de la columna 'Path' (excel_col_original_type) del Excel
tag_type_for_md = str(row.get(excel_col_original_type, "N/A"))
# Si el nombre del archivo sugiere un tipo ("Input" o "Output"), este tiene precedencia
if filename_suggested_type:
tag_type_for_md = filename_suggested_type
data_type = str(row.get(excel_col_data_type, ""))
comment_text = str(row.get(excel_col_comment, ""))
description = (
f'"{comment_text}"' # Descripción tomada de la columna "Comment"
)
master_tag_cell = f"{master_tag:<{col_widths['Master Tag']}.{col_widths['Master Tag']}}"
type_cell = (
f"{tag_type_for_md:<{col_widths['Type']}.{col_widths['Type']}}"
)
data_type_cell = (
f"{data_type:<{col_widths['Data Type']}.{col_widths['Data Type']}}"
)
description_cell = f"{description:<{col_widths['Description']}.{col_widths['Description']}}"
md_row = f"| {master_tag_cell} | {type_cell} | {data_type_cell} | {description_cell} |"
markdown_content.append(md_row)
markdown_content.append("\n") # Espacio después de cada tabla
except FileNotFoundError:
msg = f"*Error procesando '{excel_filename}': Archivo no encontrado.*\n"
print(f"Error: {msg.strip()}")
markdown_content.append(msg)
except pd.errors.EmptyDataError:
msg = f"*Archivo '{excel_filename}' omitido por estar vacío.*\n"
print(f"Advertencia: {msg.strip()}")
markdown_content.append(msg)
except Exception as e:
msg = f"*Error procesando '{excel_filename}': {e}*\n"
print(f"Error: {msg.strip()}")
markdown_content.append(msg)
if markdown_content:
try:
with open(output_md_filepath_abs, "w", encoding="utf-8") as f:
f.write("\n".join(markdown_content))
print(
f"¡Éxito! Archivos Excel convertidos a Markdown en: {output_md_filepath_abs}"
)
except IOError as e:
print(
f"Error al escribir el archivo Markdown '{output_md_filepath_abs}': {e}"
)
else:
print("No se generó contenido para el archivo Markdown.")
if __name__ == "__main__":
convert_excel_to_markdown_tables()

View File

@ -432,9 +432,74 @@ def find_io_recursively(device_id, project_data, module_context):
return io_list
# --- generate_markdown_tree function (v26 - Final Cleaned Version) ---
def generate_markdown_tree(project_data, md_file_path, target_plc_id):
"""(v29 Mod) Generates hierarchical Markdown for a specific PLC."""
# --- generate_io_summary_file function (Updated) ---
def generate_io_summary_file(all_plc_io_for_table, md_file_path, plc_name, project_data, output_root_path):
"""
Generates a Hardware.md file with the IO summary table.
If there's only one PLC, creates it in the root directory, otherwise creates PLC-specific named files.
"""
# Determine if this is the only PLC in the project
plcs_count = len(project_data.get("plcs", {}))
is_single_plc = plcs_count == 1
if is_single_plc:
# For single PLC: create Hardware.md in the root directory
hardware_file_path = os.path.join(output_root_path, "Hardware.md")
file_title = f"# IO Summary Table for PLC: {plc_name}"
else:
# For multiple PLCs: create [PLC_Name]_Hardware.md in PLC's directory
hardware_file_path = os.path.join(os.path.dirname(md_file_path), f"{sanitize_filename(plc_name)}_Hardware.md")
file_title = f"# IO Summary Table for PLC: {plc_name}"
markdown_lines = [file_title, ""]
if all_plc_io_for_table:
# Define table headers
headers = [
"Network", "Type", "Address", "Device Name", "Sub-Device",
"OrderNo", "Type", "IO Type", "IO Address", "Number of Bits"
]
markdown_lines.append("| " + " | ".join(headers) + " |")
markdown_lines.append("|-" + "-|-".join(["---"] * len(headers)) + "-|")
# Sort the collected data
sorted_table_data = sorted(all_plc_io_for_table, key=lambda x: x["SortKey"])
# Add rows to the table
for row_data in sorted_table_data:
row = [
row_data.get("Network", "N/A"),
row_data.get("Network Type", "N/A"),
row_data.get("Device Address", "N/A"),
row_data.get("Device Name", "N/A"),
row_data.get("Sub-Device", "N/A"),
row_data.get("Sub-Device OrderNo", "N/A"),
row_data.get("Sub-Device Type", "N/A"),
row_data.get("IO Type", "N/A"),
f"`{row_data.get('IO Address', 'N/A')}`", # Format IO Address as code
row_data.get("Number of Bits", "N/A"),
]
# Escape pipe characters within cell content if necessary
row = [str(cell).replace('|', '\\|') for cell in row]
markdown_lines.append("| " + " | ".join(row) + " |")
else:
markdown_lines.append("*No IO data found for this PLC.*")
try:
with open(hardware_file_path, "w", encoding="utf-8") as f:
f.write("\n".join(markdown_lines))
print(f"IO summary table written to: {hardware_file_path}")
except Exception as e:
print(f"ERROR writing Hardware.md file {hardware_file_path}: {e}")
traceback.print_exc()
return hardware_file_path
# --- generate_markdown_tree function ---
def generate_markdown_tree(project_data, md_file_path, target_plc_id, output_root_path):
"""(Modified) Generates hierarchical Markdown for a specific PLC."""
plc_info = project_data.get("plcs", {}).get(target_plc_id)
plc_name_for_title = "Unknown PLC"
@ -851,47 +916,22 @@ def generate_markdown_tree(project_data, md_file_path, target_plc_id):
markdown_lines.append("") # Spacing
# --- *** END Display Logic *** ---
# --- Add IO Summary Table --- # v31: New section
if all_plc_io_for_table:
markdown_lines.append("\n## IO Summary Table")
markdown_lines.append("")
# Define table headers
headers = [
"Network", "Type", "Address", "Device Name", "Sub-Device",
"OrderNo", "Type", "IO Type", "IO Address", "Number of Bits"
]
markdown_lines.append("| " + " | ".join(headers) + " |")
markdown_lines.append("|-" + "-|-".join(["---"] * len(headers)) + "-|")
# Sort the collected data
sorted_table_data = sorted(all_plc_io_for_table, key=lambda x: x["SortKey"])
# Add rows to the table
for row_data in sorted_table_data:
row = [
row_data.get("Network", "N/A"),
row_data.get("Network Type", "N/A"),
row_data.get("Device Address", "N/A"),
row_data.get("Device Name", "N/A"),
row_data.get("Sub-Device", "N/A"),
row_data.get("Sub-Device OrderNo", "N/A"),
row_data.get("Sub-Device Type", "N/A"),
row_data.get("IO Type", "N/A"),
f"`{row_data.get('IO Address', 'N/A')}`", # Format IO Address as code
row_data.get("Number of Bits", "N/A"),
]
# Escape pipe characters within cell content if necessary (though unlikely for these fields)
row = [str(cell).replace('|', '\\|') for cell in row]
markdown_lines.append("| " + " | ".join(row) + " |")
# --- End Add IO Summary Table ---
try:
# Re-open the file in write mode to include the table at the end
# Re-open the file in write mode to include the tree structure (without the table)
with open(md_file_path, "w", encoding="utf-8") as f:
f.write("\n".join(markdown_lines))
print(f"Markdown summary (including table) written to: {md_file_path}")
print(f"Markdown tree summary written to: {md_file_path}")
# Generate the separate Hardware.md with the IO summary table
if all_plc_io_for_table:
hardware_file_path = generate_io_summary_file(
all_plc_io_for_table,
md_file_path,
plc_name_for_title,
project_data,
output_root_path
)
print(f"IO summary table generated in separate file: {hardware_file_path}")
except Exception as e:
print(f"ERROR writing Markdown file {md_file_path}: {e}")
@ -1185,7 +1225,8 @@ if __name__ == "__main__":
output_plc_md_file = plc_doc_dir / hardware_tree_md_filename
print(f" Generating Hardware Tree for PLC '{plc_name_original}' (ID: {plc_id}) at: {output_plc_md_file.resolve()}")
generate_markdown_tree(project_data, str(output_plc_md_file), plc_id)
# Pass output_path as the root directory for Hardware.md placement
generate_markdown_tree(project_data, str(output_plc_md_file), plc_id, str(output_path))
else:
print("\nFailed to process AML data. Halting before generating PLC-specific trees.")

View File

@ -0,0 +1,278 @@
"""
convert Excel Tags to md : This script converts Excel files containing tags into Markdown tables.
Updated to work with a single Excel file and filter based on paths defined in a JSON config.
"""
# Standard library imports
import os
import sys
import json
import tkinter as tk
from tkinter import filedialog
# Third-party imports
try:
import pandas as pd
except ImportError:
print(
"Error: La librería 'pandas' no está instalada. Por favor, instálala con 'pip install pandas openpyxl'."
)
sys.exit(1)
# Determine script_root and add to sys.path for custom module import
try:
current_script_path = os.path.abspath(__file__)
script_root = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.dirname(current_script_path)))
)
if script_root not in sys.path:
sys.path.append(script_root)
from backend.script_utils import load_configuration
except ImportError:
print(
"Error: No se pudo importar 'load_configuration' desde 'backend.script_utils'."
)
sys.exit(1)
except NameError: # __file__ is not defined
print(
"Error: __file__ no está definido. Este script podría no estar ejecutándose en un entorno Python estándar."
)
sys.exit(1)
def load_path_config():
"""
Carga la configuración de paths desde un archivo JSON
Si no existe, crea uno con valores predeterminados en el working_directory
"""
# Obtener la configuración global
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
print("Error: 'working_directory' no se encontró en la configuración.")
return None
if not os.path.isdir(working_directory):
print(
f"Error: El directorio de trabajo '{working_directory}' no existe o no es un directorio."
)
return None
# Path para el archivo JSON de configuración
json_config_path = os.path.join(working_directory, "io_paths_config.json")
# Si el archivo existe, cargarlo
if os.path.exists(json_config_path):
try:
with open(json_config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
print(f"Configuración de paths cargada desde: {json_config_path}")
return config
except Exception as e:
print(f"Error al cargar el archivo de configuración JSON: {e}")
return None
# Si no existe, crear uno con valores predeterminados
default_config = {
"paths": [
{
"path": "Inputs",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "Outputs",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "OutputsFesto",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "IO Not in Hardware\\InputsMaster",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "IO Not in Hardware\\OutputsMaster",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
}
]
}
try:
with open(json_config_path, 'w', encoding='utf-8') as f:
json.dump(default_config, f, indent=2)
print(f"Archivo de configuración creado: {json_config_path}")
return default_config
except Exception as e:
print(f"Error al crear el archivo de configuración JSON: {e}")
return None
def convert_excel_to_markdown_tables():
"""
Busca un archivo Excel en el working_directory o solicita al usuario seleccionarlo,
filtra las entradas según los paths configurados en JSON,
y genera un archivo Markdown con tablas.
"""
try:
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
print("Error: 'working_directory' no se encontró en la configuración.")
return
if not os.path.isdir(working_directory):
print(
f"Error: El directorio de trabajo '{working_directory}' no existe o no es un directorio."
)
return
except Exception as e:
print(f"Error al cargar la configuración: {e}")
return
working_directory_abs = os.path.abspath(working_directory)
print(f"Usando directorio de trabajo: {working_directory_abs}")
# Cargar la configuración de paths
path_config = load_path_config()
if not path_config:
print("Error: No se pudo cargar la configuración de paths.")
return
# Verificar si existe el archivo PLCTags.xlsx en el directorio de trabajo
default_excel_path = os.path.join(working_directory_abs, "PLCTags.xlsx")
if os.path.exists(default_excel_path):
excel_file_path = default_excel_path
print(f"Usando archivo Excel predeterminado: {excel_file_path}")
else:
# Solicitar al usuario que seleccione el archivo Excel
root = tk.Tk()
root.withdraw() # Ocultar ventana principal
print("Archivo PLCTags.xlsx no encontrado. Seleccione el archivo Excel exportado de TIA Portal:")
excel_file_path = filedialog.askopenfilename(
title="Seleccione el archivo Excel exportado de TIA Portal",
filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")],
initialdir=working_directory_abs
)
if not excel_file_path:
print("No se seleccionó ningún archivo Excel. Saliendo...")
return
print(f"Procesando archivo Excel: {excel_file_path}...")
output_md_filename = "Master IO Tags.md"
output_md_filepath_abs = os.path.join(working_directory_abs, output_md_filename)
markdown_content = []
# Definición de las columnas y sus anchos para el formato Markdown
md_header_names = ["Master Tag", "Type", "Data Type", "Description"]
col_widths = {"Master Tag": 32, "Type": 6, "Data Type": 9, "Description": 71}
# Crear el encabezado y separador Markdown
header_parts = [f" {name:<{col_widths[name]}} " for name in md_header_names]
markdown_table_header = f"|{'|'.join(header_parts)}|"
separator_parts = [f" {'-'*col_widths[name]} " for name in md_header_names]
markdown_table_separator = f"|{'|'.join(separator_parts)}|"
# Obtener la lista de paths a procesar
valid_paths = [path_entry["path"] for path_entry in path_config["paths"]]
print(f"Paths configurados para procesar: {valid_paths}")
try:
# Leer el Excel exportado de TIA Portal
excel_data = pd.read_excel(excel_file_path, sheet_name=0)
# Verificar columnas requeridas
excel_col_name = "Name"
excel_col_path = "Path"
excel_col_data_type = "Data Type"
excel_col_comment = "Comment"
excel_required_cols = [
excel_col_name,
excel_col_path,
excel_col_data_type,
excel_col_comment,
]
missing_cols = [col for col in excel_required_cols if col not in excel_data.columns]
if missing_cols:
print(f"Error: Columnas faltantes en el archivo Excel: {', '.join(missing_cols)}")
return
# Organizar entradas por path y crear tablas para cada tipo
for path_entry in path_config["paths"]:
path_name = path_entry["path"]
io_type = path_entry["type"] # Input u Output
# Filtrar datos por el path actual
path_data = excel_data[excel_data[excel_col_path] == path_name]
if path_data.empty:
print(f"No se encontraron entradas para el path: {path_name}")
continue
# Agregar encabezado para este path
markdown_content.append(f"## {path_name} ({io_type}s)\n")
markdown_content.append(markdown_table_header)
markdown_content.append(markdown_table_separator)
# Procesar cada entrada en este path
for _, row in path_data.iterrows():
master_tag = str(row.get(excel_col_name, ""))
data_type = str(row.get(excel_col_data_type, ""))
comment_text = str(row.get(excel_col_comment, ""))
description = f'"{comment_text}"'
# Usar el tipo del path desde la configuración
tag_type_for_md = io_type
master_tag_cell = f"{master_tag:<{col_widths['Master Tag']}.{col_widths['Master Tag']}}"
type_cell = f"{tag_type_for_md:<{col_widths['Type']}.{col_widths['Type']}}"
data_type_cell = f"{data_type:<{col_widths['Data Type']}.{col_widths['Data Type']}}"
description_cell = f"{description:<{col_widths['Description']}.{col_widths['Description']}}"
md_row = f"| {master_tag_cell} | {type_cell} | {data_type_cell} | {description_cell} |"
markdown_content.append(md_row)
markdown_content.append("\n") # Espacio después de cada tabla
except FileNotFoundError:
print(f"Error: El archivo '{excel_file_path}' no se encontró.")
return
except pd.errors.EmptyDataError:
print(f"Error: El archivo '{excel_file_path}' está vacío.")
return
except Exception as e:
print(f"Error al procesar el archivo Excel: {e}")
return
if markdown_content:
try:
with open(output_md_filepath_abs, "w", encoding="utf-8") as f:
f.write("\n".join(markdown_content))
print(
f"¡Éxito! Archivo Excel convertido a Markdown en: {output_md_filepath_abs}"
)
except IOError as e:
print(
f"Error al escribir el archivo Markdown '{output_md_filepath_abs}': {e}"
)
else:
print("No se generó contenido para el archivo Markdown.")
if __name__ == "__main__":
convert_excel_to_markdown_tables()

View File

@ -0,0 +1,277 @@
"""
Generador de prompt para adaptación de IO - Este script genera un prompt para ayudar con la
adaptación de IO entre hardware de PLC Siemens TIA Portal y software master.
"""
# Standard library imports
import os
import sys
import tkinter as tk
from tkinter import filedialog, messagebox
import pyperclip # Para copiar al portapapeles
# Determine script_root and add to sys.path for custom module import
try:
current_script_path = os.path.abspath(__file__)
script_root = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.dirname(current_script_path)))
)
if script_root not in sys.path:
sys.path.append(script_root)
from backend.script_utils import load_configuration
except ImportError:
print(
"Error: No se pudo importar 'load_configuration' desde 'backend.script_utils'."
)
sys.exit(1)
except NameError: # __file__ is not defined
print(
"Error: __file__ no está definido. Este script podría no estar ejecutándose en un entorno Python estándar."
)
sys.exit(1)
def verify_path(path, is_file=True):
"""Verifica si una ruta existe y es un archivo o directorio según corresponda."""
if is_file:
return os.path.isfile(path)
else:
return os.path.isdir(path)
def select_obsidian_folder():
"""Permite al usuario seleccionar la carpeta base de Obsidian."""
root = tk.Tk()
root.withdraw() # Ocultar ventana principal
folder_path = filedialog.askdirectory(
title="Seleccione la carpeta base de Obsidian",
mustexist=True
)
return folder_path if folder_path else None
def generate_prompt():
"""
Genera el prompt para la adaptación de IO y lo copia al portapapeles.
Verifica la existencia de archivos y directorios.
"""
# Cargar la configuración para obtener working_directory
try:
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
print("Error: 'working_directory' no se encontró en la configuración.")
return False
if not os.path.isdir(working_directory):
print(
f"Error: El directorio de trabajo '{working_directory}' no existe o no es un directorio."
)
return False
except Exception as e:
print(f"Error al cargar la configuración: {e}")
return False
working_directory_abs = os.path.abspath(working_directory)
print(f"Usando directorio de trabajo: {working_directory_abs}")
# Pedir al usuario que seleccione la carpeta base de Obsidian
print("Por favor, seleccione la carpeta base de Obsidian para los archivos de equivalencias...")
obsidian_base_folder = select_obsidian_folder()
if not obsidian_base_folder:
print("No se seleccionó ninguna carpeta. Saliendo...")
return False
print(f"Usando carpeta base de Obsidian: {obsidian_base_folder}")
# Definir las rutas a los archivos
master_table_path = os.path.join(working_directory_abs, "Master IO Tags.md")
hardware_table_path = os.path.join(working_directory_abs, "Hardware.md")
adaptation_table_path = os.path.join(working_directory_abs, "IO Adapted.md")
# Rutas a los archivos de datos semánticos
# Intentamos encontrar automáticamente la ruta correcta
mixer_io_path = os.path.join(obsidian_base_folder, "00 - MASTER", "MIXER", "IO")
# Si no existe esta ruta, permitimos seleccionar manualmente
if not verify_path(mixer_io_path, is_file=False):
print("Ruta a la carpeta IO no encontrada. Por favor, seleccione la carpeta IO:")
root = tk.Tk()
root.withdraw()
mixer_io_path = filedialog.askdirectory(
title="Seleccione la carpeta IO dentro de la estructura de Obsidian",
mustexist=True
)
if not mixer_io_path:
print("No se seleccionó ninguna carpeta IO. Saliendo...")
return False
equivalences_data_path = os.path.join(mixer_io_path, "SIDEL - Mixer - Equivalences.md")
default_io_data_path = os.path.join(mixer_io_path, "Default IO for Analog.md")
# Verificar que los archivos existan
files_to_check = [
{"path": master_table_path, "name": "Master IO Tags.md", "required": True},
{"path": hardware_table_path, "name": "Hardware.md", "required": True},
{"path": equivalences_data_path, "name": "SIDEL - Mixer - Equivalences.md", "required": False},
{"path": default_io_data_path, "name": "Default IO for Analog.md", "required": False}
]
missing_files = []
for file_info in files_to_check:
if not verify_path(file_info["path"]):
if file_info["required"]:
missing_files.append(f"[REQUERIDO] {file_info['name']}")
else:
missing_files.append(f"[OPCIONAL] {file_info['name']}")
if missing_files:
print("Los siguientes archivos no se encontraron:")
for missing_file in missing_files:
print(f" - {missing_file}")
# Si faltan archivos requeridos, preguntar si se quiere continuar
if any(f.startswith("[REQUERIDO]") for f in missing_files):
if not messagebox.askyesno("Archivos faltantes",
"Faltan archivos requeridos. ¿Desea continuar de todos modos?"):
print("Operación cancelada.")
return False
# Generar el texto del prompt
prompt_text = f"""
Estoy adaptando las entradas y salidas entre un hardware de PLC Siemens Tia Portal y un software master. Para lograr identificar que tags del software master se deben asignar a cada IO del hardware del PLC. Se debe asignar a cada IO del harware un Tag del software master.
Para que me ayudes con este proceso de busqueda he creado las tablas:
$Master_table: que contiene los tags del software master con las descripciones. Esta tabla se divide en 4 subtablas. La "Inputs PLCTags" son los inputs mas utilizados, luego estan los "InputsMaster PLCTags" que son inputs menos utilizados. Lo mismo sucede con "Outputs PLCTags" que son los mas utilizados y "OutputsMaster PLCTags" son los outputs menos utilizados.
$Hardware_table: que contiene todo el IO del hardware del PLC. Esta dibidido en diferentes dispositivos ya que algunos componentes se acceden mediante interfaces de comunicaciones como profibus. Pero desde el punto de vista del PLC son inputs o outputs definidos como PEW que significa: P:periferia, W:word , se sigue la nomenclatura alemana de siemens, A:output, E:input.
$Adaptation_table: es la tabla que deseo que crees con los IO adaptados. Seria la $Hardware_table con los tags de la $Master_table. Quisiera que se agrege una columna con el nivel de certeza y en caso que el nivel no sea el maximo quisiera que agregues 3 posibles opciones como tag1,tag2,tag3 en una columna nueva.
$Equivalences_data tiene información de ciertas equivalencias que pueden ser útiles para las búsquedas.
$DefaultIO_data tiene conexiones estandard en los casos mas comunes.
Para acceder a los archivos para leer o escribir puedes usar el MCP filesystem.
# Definiciones de rutas
$Working_Directory = "{working_directory_abs}"
$Obsidean_Base_Folder = "{obsidian_base_folder}"
# Archivos de entrada
$Master_table = $Working_Directory + "/Master IO Tags.md"
$Hardware_table = $Working_Directory + "/Hardware.md"
# Archivo de salida
$Adaptation_table = $Working_Directory + "/IO Adapted.md"
# Datos semánticos de apoyo
$Equivalences_data = "{equivalences_data_path}"
$DefaultIO_data = "{default_io_data_path}"
# CONTEXTO DEL PROYECTO
Estoy realizando un upgrade de software para equipos SIDEL que migran de un sistema antiguo a uno nuevo. Estos equipos de mezclado de bebidas (mixers) tienen hardware de PLC Siemens que debe ser adaptado al software master moderno. La correcta asignación de entradas/salidas es fundamental para que el sistema funcione adecuadamente.
# OBJETIVO
Crear una tabla de adaptación que asigne correctamente cada entrada/salida (I/O) del hardware de PLC Siemens TIA Portal a los tags correspondientes del software master moderno. Este mapeo permitirá la comunicación efectiva entre el hardware existente y el nuevo software de control.
# TECNOLOGÍA Y NOMENCLATURA
- Sistema de control: Siemens PLC con TIA Portal
- Nomenclatura Siemens (alemana):
* E: Entrada (Input) - Ejemplo: I0.1, EW100
* A: Salida (Output) - Ejemplo: Q0.1, AW100
* P: Periferia
* W: Word (16 bits)
* D: Double Word (32 bits)
- PEW: Entrada de Periferia Word (Peripheral Input Word)
- PAW: Salida de Periferia Word (Peripheral Output Word)
# DESCRIPCIÓN DE LOS ARCHIVOS
## Hardware_table ($Hardware_table)
- FUNCIÓN: Contiene la configuración completa del hardware del PLC y el detalle de todas las señales de I/O físicas.
- ESTRUCTURA:
* Primera sección: Tabla de configuración del PLC con red, direcciones y dispositivos
* Segunda sección: Tabla de I/O con dirección (ej. I0.1, PEW100), descripción en italiano/inglés y sensor asociado
- INFORMACIÓN CLAVE: Direcciones de hardware, descripciones físicas y conexiones de sensores/actuadores
## Master_table ($Master_table)
- FUNCIÓN: Define los tags estandarizados en el software master moderno que deben mapearse a las I/O físicas.
- ESTRUCTURA: Dividido en 4 secciones:
* "Inputs PLCTags": Entradas más utilizadas
* "InputsMaster PLCTags": Entradas secundarias
* "Outputs PLCTags": Salidas más utilizadas
* "OutputsMaster PLCTags": Salidas secundarias
- INFORMACIÓN CLAVE: Tags estandarizados, tipos de datos y descripciones en inglés
## Equivalences_data ($Equivalences_data)
- FUNCIÓN: Proporciona equivalencias semánticas entre terminologías antiguas/nuevas y abreviaturas.
- ESTRUCTURA: Listado de equivalencias como "301 : WATER PUMP = P1"
- INFORMACIÓN CLAVE: Traducciones entre nomenclaturas, equivalencias entre códigos y nombres descriptivos
## DefaultIO_data ($DefaultIO_data)
- FUNCIÓN: Contiene configuraciones predeterminadas para señales analógicas específicas.
- ESTRUCTURA: Tabla con tags, tipos de datos y direcciones de memoria para señales analógicas estándar
- INFORMACIÓN CLAVE: Mapeos predefinidos para señales analógicas comunes, especialmente para comunicación Profibus
## Adaptation_table (a crear en $Adaptation_table)
- FUNCIÓN: Tabla final que mapea cada I/O del hardware a su correspondiente tag del master.
- ESTRUCTURA: Formato requerido:
| IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |
- INFORMACIÓN CLAVE: Resultado del proceso de adaptación con nivel de confianza y alternativas
# PROCESO DE ADAPTACIÓN
Lee ambos archivos ($Hardware_table y $Master_table) y crea una tabla de adaptación que asigne a cada IO del hardware un Tag del software master.
El proceso de asignación debe:
1. Comparar semánticamente descripciones entre ambas tablas, teniendo en cuenta el idioma (italiano/inglés)
2. Verificar compatibilidad de tipo (input/output) y tamaño de datos
3. Utilizar las equivalencias en $Equivalences_data para mejorar la coincidencia semántica
4. Verificar configuraciones estándar en $DefaultIO_data para señales analógicas
5. Priorizar los tags de las tablas principales ("Inputs PLCTags"/"Outputs PLCTags") sobre las secundarias
# FORMATO DE SALIDA
Crea la tabla con esta estructura exacta:
| IO | Master Tag | PLC Description | Master Description | Certeza | Alternative |
# NIVELES DE CERTEZA
Asigna niveles de certeza según estos criterios:
- Alto (90%+): Coincidencia evidente en nombre y descripción
- Medio (70-90%): Similitud semántica notable pero no exacta
- Bajo (<70%): Similitud limitada, requiere revisión manual
Para entradas con nivel de certeza medio o bajo, añade hasta 3 tags alternativos en la columna "Alternative" separados por comas.
# EXCEPCIONES
Al final del documento, crea una sección titulada "## Excepciones y Problemas" con una tabla que liste las IO sin asignación clara y el problema detectado.
"""
# Copiar el texto al portapapeles
try:
pyperclip.copy(prompt_text)
print("¡Prompt generado y copiado al portapapeles con éxito!")
# Guardar el prompt en un archivo para referencia
prompt_file_path = os.path.join(working_directory_abs, "IO_Adaptation_Prompt.txt")
with open(prompt_file_path, "w", encoding="utf-8") as f:
f.write(prompt_text)
print(f"Prompt guardado en: {prompt_file_path}")
# Mostrar mensaje de éxito
messagebox.showinfo("Éxito",
f"Prompt generado y copiado al portapapeles.\n\n"
f"También se ha guardado en:\n{prompt_file_path}")
return True
except Exception as e:
print(f"Error al copiar al portapapeles: {e}")
messagebox.showerror("Error",
f"Error al copiar al portapapeles: {e}\n\n"
f"Por favor, instale pyperclip con 'pip install pyperclip'")
return False
if __name__ == "__main__":
print("Generador de prompt para adaptación de IO")
print("=========================================")
generate_prompt()

View File

@ -1,5 +1,6 @@
"""
convert Markdown tables from adapted IO to Excel for import into TIA Portal
Updated to work with paths defined in a shared JSON config file.
"""
import pandas as pd
@ -7,6 +8,7 @@ import openpyxl
import re
import os
import sys
import json
import tkinter as tk
from tkinter import filedialog, messagebox
from datetime import datetime
@ -33,6 +35,75 @@ except NameError: # __file__ is not defined
)
sys.exit(1)
def load_path_config(working_directory=None):
"""
Carga la configuración de paths desde un archivo JSON
Si no existe, crea uno con valores predeterminados
"""
# Si no se proporciona working_directory, usar el directorio actual
if not working_directory:
try:
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
print("Error: 'working_directory' no se encontró en la configuración.")
working_directory = os.getcwd()
except:
working_directory = os.getcwd()
# Path para el archivo JSON de configuración
json_config_path = os.path.join(working_directory, "io_paths_config.json")
# Si el archivo existe, cargarlo
if os.path.exists(json_config_path):
try:
with open(json_config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
print(f"Configuración de paths cargada desde: {json_config_path}")
return config
except Exception as e:
print(f"Error al cargar el archivo de configuración JSON: {e}")
return None
# Si no existe, crear uno con valores predeterminados
default_config = {
"paths": [
{
"path": "Inputs",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "Outputs",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "OutputsFesto",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
},
{
"path": "IO Not in Hardware\\InputsMaster",
"type": "Input",
"no_used_path": "IO Not in Hardware\\InputsMaster"
},
{
"path": "IO Not in Hardware\\OutputsMaster",
"type": "Output",
"no_used_path": "IO Not in Hardware\\OutputsMaster"
}
]
}
try:
with open(json_config_path, 'w', encoding='utf-8') as f:
json.dump(default_config, f, indent=2)
print(f"Archivo de configuración creado: {json_config_path}")
return default_config
except Exception as e:
print(f"Error al crear el archivo de configuración JSON: {e}")
return None
def read_markdown_table(file_path):
"""Leer tabla en formato Markdown y convertirla a DataFrame."""
@ -133,16 +204,33 @@ def create_log_file(output_dir):
log_filename = f"update_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
log_path = os.path.join(output_dir, log_filename)
with open(log_path, 'w', encoding='utf-8') as log_file:
log_file.write(f"Log de actualización de PLCTags - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
log_file.write("=" * 80 + "\n\n")
return log_path
try:
with open(log_path, 'w', encoding='utf-8') as log_file:
log_file.write(f"Log de actualización de PLCTags - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
log_file.write("=" * 80 + "\n\n")
return log_path
except Exception as e:
print(f"Error al crear el archivo de log: {e}")
# Si hay un error, intentar crear en el directorio actual
fallback_path = os.path.join(os.getcwd(), log_filename)
try:
with open(fallback_path, 'w', encoding='utf-8') as log_file:
log_file.write(f"Log de actualización de PLCTags - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
log_file.write("=" * 80 + "\n\n")
log_file.write(f"ADVERTENCIA: No se pudo crear el log en {output_dir}. Usando directorio alternativo.\n\n")
return fallback_path
except:
print("Error crítico: No se pudo crear ningún archivo de log.")
return None
def log_message(log_path, message):
"""Añadir mensaje al log."""
with open(log_path, 'a', encoding='utf-8') as log_file:
log_file.write(message + "\n")
if log_path:
try:
with open(log_path, 'a', encoding='utf-8') as log_file:
log_file.write(message + "\n")
except Exception as e:
print(f"Error al escribir en el log: {e}")
print(message)
def transform_io_address(address):
@ -235,6 +323,26 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
log_message(log_path, f"Archivo Excel de salida: {output_path}")
log_message(log_path, "-" * 80)
# Cargar configuración de paths
excel_dir = os.path.dirname(excel_path)
path_config = load_path_config(excel_dir)
if not path_config:
log_message(log_path, "ERROR: No se pudo cargar la configuración de paths")
return False
# Extraer información de paths desde la configuración
path_info = {}
for path_entry in path_config["paths"]:
path_info[path_entry["path"]] = {
"type": path_entry["type"],
"no_used_path": path_entry["no_used_path"]
}
log_message(log_path, f"Configuración de paths cargada:")
for path, info in path_info.items():
log_message(log_path, f" - {path}: tipo={info['type']}, no_used_path={info['no_used_path']}")
# Leer el archivo Markdown
md_df = read_markdown_table(md_path)
@ -286,12 +394,16 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
# Estadísticas
total_tags = 0
updated_tags = 0
relocated_to_inputs = 0
relocated_to_outputs = 0
relocated_to_not_in_hardware_inputs = 0
relocated_to_not_in_hardware_outputs = 0
relocated_tags = {}
assigned_memory_addresses = 0
# Inicializar el contador para cada tipo de relocalización
for path in path_info.keys():
relocated_tags[path] = 0
# Lista de paths válidos desde la configuración
valid_paths = list(path_info.keys())
# Procesamos la hoja principal (asumimos que es la primera)
if len(workbook.sheetnames) > 0:
sheet = workbook[workbook.sheetnames[0]]
@ -334,15 +446,8 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
path = str(path_cell.value).strip() if path_cell.value else ""
data_type = str(data_type_cell.value).strip() if data_type_cell.value else ""
# Verificar si el tag debe ser procesado (está en los paths relevantes)
relevant_paths = [
"Inputs",
"Outputs",
"IO Not in Hardware\\InputsMaster",
"IO Not in Hardware\\OutputsMaster"
]
if path in relevant_paths:
# Verificar si el path está en la configuración
if path in valid_paths:
total_tags += 1
# Verificar si el tag está en el mapeo de IO
@ -351,61 +456,50 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
new_address = io_mapping[tag_name]
logical_address_cell.value = new_address
# Actualizar el path según el tipo de señal
# Determinar el nuevo path basado en la dirección asignada
new_path = path # Por defecto, mantener el mismo path
# Determinar el nuevo path según la dirección IO asignada
if new_address.startswith("%E"):
path_cell.value = "Inputs"
relocated_to_inputs += 1
# Buscar el path configurado para entradas
for p, info in path_info.items():
if info.get("type") == "Input" and "Not in Hardware" not in p:
new_path = p
break
elif new_address.startswith("%A"):
path_cell.value = "Outputs"
relocated_to_outputs += 1
# Buscar el path configurado para salidas
for p, info in path_info.items():
if info.get("type") == "Output" and "Not in Hardware" not in p and p != "OutputsFesto":
new_path = p
break
# Actualizar el path si ha cambiado
if new_path != path:
path_cell.value = new_path
relocated_tags[new_path] = relocated_tags.get(new_path, 0) + 1
updated_tags += 1
log_message(log_path, f"Actualizado: {tag_name} | Viejo valor: {old_address} | Nuevo valor: {new_address} | Path: {path_cell.value}")
# Si no está en el mapeo, asignar dirección de memoria según el tipo
# Si no está en el mapeo, asignar dirección de memoria según configuración
else:
is_input = is_input_tag(tag_name)
is_output = is_output_tag(tag_name)
is_bit = is_bit_type(data_type)
current_path_info = path_info.get(path, {})
no_used_path = current_path_info.get("no_used_path", "")
path_type = current_path_info.get("type", "")
# Para entradas
if is_input and not is_output:
path_cell.value = "IO Not in Hardware\\InputsMaster"
relocated_to_not_in_hardware_inputs += 1
# Si tenemos información válida para este path
if no_used_path and path_type:
# Determinar automáticamente si es entrada o salida
is_input = is_input_tag(tag_name) or path_type == "Input"
is_output = is_output_tag(tag_name) or path_type == "Output"
if is_bit:
new_address = f"%M{input_mem_byte}.{input_mem_bit}"
input_mem_bit += 1
if input_mem_bit > 7:
input_mem_bit = 0
input_mem_byte += 1
else:
new_address = f"%MW{input_mem_byte}"
input_mem_byte += 2
# Para salidas
elif is_output:
path_cell.value = "IO Not in Hardware\\OutputsMaster"
relocated_to_not_in_hardware_outputs += 1
# Actualizar el path según configuración
path_cell.value = no_used_path
if is_bit:
new_address = f"%M{output_mem_byte}.{output_mem_bit}"
output_mem_bit += 1
if output_mem_bit > 7:
output_mem_bit = 0
output_mem_byte += 1
else:
new_address = f"%MW{output_mem_byte}"
output_mem_byte += 2
# Si no podemos determinar si es entrada o salida por el nombre
# Lo determinamos por el path actual
else:
if "Input" in path:
path_cell.value = "IO Not in Hardware\\InputsMaster"
relocated_to_not_in_hardware_inputs += 1
if is_bit:
# Asignar dirección de memoria según el tipo (Input/Output)
if path_type == "Input" or (is_input and not is_output):
# Asignar dirección de memoria para entradas
if is_bit_type(data_type):
new_address = f"%M{input_mem_byte}.{input_mem_bit}"
input_mem_bit += 1
if input_mem_bit > 7:
@ -414,11 +508,9 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
else:
new_address = f"%MW{input_mem_byte}"
input_mem_byte += 2
else:
path_cell.value = "IO Not in Hardware\\OutputsMaster"
relocated_to_not_in_hardware_outputs += 1
if is_bit:
else: # Tipo Output o no determinado
# Asignar dirección de memoria para salidas
if is_bit_type(data_type):
new_address = f"%M{output_mem_byte}.{output_mem_bit}"
output_mem_bit += 1
if output_mem_bit > 7:
@ -427,12 +519,13 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
else:
new_address = f"%MW{output_mem_byte}"
output_mem_byte += 2
old_address = logical_address_cell.value
logical_address_cell.value = new_address
assigned_memory_addresses += 1
log_message(log_path, f"Asignación memoria: {tag_name} | Viejo valor: {old_address} | Nuevo valor: {new_address} | Path: {path_cell.value}")
relocated_tags[no_used_path] = relocated_tags.get(no_used_path, 0) + 1
old_address = logical_address_cell.value
logical_address_cell.value = new_address
assigned_memory_addresses += 1
log_message(log_path, f"Asignación memoria: {tag_name} | Viejo valor: {old_address} | Nuevo valor: {new_address} | Path: {path_cell.value}")
# Guardar el archivo actualizado
try:
@ -446,38 +539,60 @@ def update_plc_tags(excel_path, md_path, output_path, log_path):
log_message(log_path, "\n" + "=" * 30 + " RESUMEN " + "=" * 30)
log_message(log_path, f"Total de tags procesados: {total_tags}")
log_message(log_path, f"Tags actualizados desde el Markdown: {updated_tags}")
log_message(log_path, f"Tags relocalizados a Inputs: {relocated_to_inputs}")
log_message(log_path, f"Tags relocalizados a Outputs: {relocated_to_outputs}")
log_message(log_path, f"Tags relocalizados a InputsMaster: {relocated_to_not_in_hardware_inputs}")
log_message(log_path, f"Tags relocalizados a OutputsMaster: {relocated_to_not_in_hardware_outputs}")
for path, count in relocated_tags.items():
if count > 0:
log_message(log_path, f"Tags relocalizados a {path}: {count}")
log_message(log_path, f"Tags con direcciones de memoria asignadas: {assigned_memory_addresses}")
return True
def main():
configs = load_configuration()
working_directory = configs.get("working_directory")
try:
# Intentar cargar la configuración para obtener working_directory
from backend.script_utils import load_configuration
configs = load_configuration()
working_directory = configs.get("working_directory")
if not working_directory:
working_directory = os.getcwd()
except:
working_directory = os.getcwd()
print(f"Usando directorio de trabajo: {working_directory}")
# Crear interfaz para seleccionar archivos
root = tk.Tk()
root.withdraw() # Ocultar ventana principal
# Verificar si existe el archivo PLCTags.xlsx predeterminado en working_directory
default_excel_path = os.path.join(working_directory, "PLCTags.xlsx")
default_md_path = os.path.join(working_directory, "IO Tags consolidated.md")
# Pedir al usuario que seleccione los archivos
print("Seleccione el archivo Excel exportado de TIA Portal:")
excel_path = filedialog.askopenfilename(
title="Seleccione el archivo Excel exportado de TIA Portal",
filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")]
)
if os.path.exists(default_excel_path):
excel_path = default_excel_path
print(f"Usando archivo Excel predeterminado: {excel_path}")
else:
print("Seleccione el archivo Excel exportado de TIA Portal:")
excel_path = filedialog.askopenfilename(
title="Seleccione el archivo Excel exportado de TIA Portal",
filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")],
initialdir=working_directory
)
if not excel_path:
print("No se seleccionó ningún archivo Excel. Saliendo...")
return
print("Seleccione el archivo Markdown con la adaptación IO:")
md_path = filedialog.askopenfilename(
title="Seleccione el archivo Markdown con la adaptación IO",
filetypes=[("Markdown files", "*.md"), ("All files", "*.*")]
)
if os.path.exists(default_md_path):
md_path = default_md_path
print(f"Usando archivo Markdown predeterminado: {md_path}")
else:
print("Seleccione el archivo Markdown con la adaptación IO:")
md_path = filedialog.askopenfilename(
title="Seleccione el archivo Markdown con la adaptación IO",
filetypes=[("Markdown files", "*.md"), ("All files", "*.*")],
initialdir=working_directory
)
if not md_path:
print("No se seleccionó ningún archivo Markdown. Saliendo...")
@ -489,10 +604,10 @@ def main():
excel_name, excel_ext = os.path.splitext(excel_filename)
output_filename = f"{excel_name}_Updated{excel_ext}"
output_path = os.path.join(excel_dir, output_filename)
output_path = os.path.join(working_directory, output_filename)
# Crear archivo de log
log_path = create_log_file(excel_dir)
log_path = create_log_file(working_directory)
# Ejecutar el proceso de actualización
success = update_plc_tags(excel_path, md_path, output_path, log_path)

View File

@ -1,76 +0,0 @@
Name;Path;Data Type;Logical Address;Comment;Hmi Visible;Hmi Accessible;Hmi Writeable;Typeobject ID;Version ID
DI_Emergency_Pilz_On;Inputs;Bool;%E0.5;Pilz Emergency;True;True;True;;
DI_LSN301L;Inputs;Bool;%E0.6;LSN301_L - Deaireator Tank Minimun Level;True;True;True;;
DI_LSM302L;Inputs;Bool;%E1.0;LSM302_L - Product Tank Minimun Level;True;True;True;;
DI_PPN301_SoftStart_Ovrld;Inputs;Bool;%E10.0;PPN301 - Water_Pump_SoftStart_Ovrld;True;True;True;;
DI_UPSBatteryReady;Inputs;Bool;%E3.7;UPS Battery ready;True;True;True;;
DI_RMM301_Closed;Inputs;Bool;%E1.5;RMM301 - Feedback OFF (VM1WATER);True;True;True;;
DI_RMP302_Closed;Inputs;Bool;%E1.6;RMP302 - Feedback OFF (VM2 SYRUP);True;True;True;;
DI_RMM303_Closed;Inputs;Bool;%E1.7;RMM303 - Feedback OFF (VM3 CO2);True;True;True;;
DI_PPN301_Contactor;Inputs;Bool;%E11.0;PPN301 - Deaireator Pump Feedback;True;True;True;;
DI_PPP302_Ovrld;Inputs;Bool;%E2.2;PPP302 - Syrup Pump Overload;True;True;True;;
DI_PPP302_Contactor;Inputs;Bool;%E2.3;PPP302 - Syrup Pump Feedback;True;True;True;;
DI_PPM303_Ovrld;Inputs;Bool;%E2.4;PPM303 - Product Pump Overload;True;True;True;;
DI_PPM306_Contactor;Inputs;Bool;%E11.3;PPM306 - Recirculating Pump Feedback;True;True;True;;
DI_SyrRoom_SyrPump_Running;Inputs;Bool;%E5.0;From Syrup Room - Syrup Pump Running;True;True;True;;
DI_SyrRoom_WatPumpReady;Inputs;Bool;%E68.1;From Syrup Room - Water Pump Ready;True;True;True;;
DI_CIP_CIP_Rinse;Inputs;Bool;%E60.1;From CIP Running ;True;True;True;;
DI_CIP_Drain;Inputs;Bool;%E60.2;From CIP Drain;True;True;True;;
DI_Air_InletPress_OK;Inputs;Bool;%E7.1;Air Pressure Switch;True;True;True;;
P_AI_LTM302;Inputs;Word;%EW100;LTM302 - Product Tank Level;True;True;True;;
P_AI_PTM304;Inputs;Word;%EW102;PTM304 - Product Tank Pressure;True;True;True;;
P_AI_LTP303;Inputs;Word;%EW808;LTP303 - Syrup Tank Level;True;True;True;;
P_AI_TTN321;Inputs;Word;%EW112;TTN321 - Deaireator Temperature;True;True;True;;
P_AI_PTF203;Inputs;Word;%EW810;PTF203 - Differential Pressure;True;True;True;;
DI_CIP_CIP_Enable;Inputs;Bool;%E60.0;From CIP Enable;True;True;True;;
DI_AVM362_Open;Inputs;Bool;%E102.3;AVM362 - Feedback ON;True;True;True;;
DI_AVM362_Close;Inputs;Bool;%E112.3;AVM362 - Feedback OFF;True;True;True;;
DI_AVM346_Open;Inputs;Bool;%E102.2;AVM346 - Feedback ON;True;True;True;;
DI_AVM346_Close;Inputs;Bool;%E112.2;AVM346 - Feedback OFF;True;True;True;;
DI_UPSAlarm;Inputs;Bool;%E3.5;UPS Alarm;True;True;True;;
DI_UPSsupply;Inputs;Bool;%E3.6;UPS supply OK;True;True;True;;
DI_Emergency_Pressed;Inputs;Bool;%E4.3;Electrical Panel Emergency Button;True;True;True;;
P_AI_PTP338;Inputs;Word;%EW816;PTP338 - Syrup Inlet Pressure;True;True;True;;
P_FTM303_Density;Inputs;Real;%ED3215;MIX - Profibus Variables;True;True;True;;
P_FTM303_Density_State;Inputs;Byte;%EB3219;MIX - Profibus Variables;True;True;True;;
P_FTM303_Flow;Inputs;Real;%ED3200;MIX - Profibus Variables;True;True;True;;
P_FTM303_Flow_State;Inputs;Byte;%EB3204;MIX - Profibus Variables;True;True;True;;
P_FTM303_Temperature;Inputs;Real;%ED3225;MIX - Profibus Variables;True;True;True;;
P_FTM303_Temperature_State;Inputs;Byte;%EB3229;MIX - Profibus Variables;True;True;True;;
P_FTM303_Totalizer;Inputs;Real;%ED3240;MIX - Profibus Variables;True;True;True;;
P_FTM303_Totalizer_State;Inputs;Byte;%EB3244;MIX - Profibus Variables;True;True;True;;
P_FTN301_Flow;Inputs;Real;%ED3080;MIX - Profibus Variables;True;True;True;;
P_FTN301_Flow_State;Inputs;Byte;%EB3084;MIX - Profibus Variables;True;True;True;;
P_FTN301_Totaliz_State;Inputs;Byte;%EB3104;MIX - Profibus Variables;True;True;True;;
P_FTN301_Totalizer;Inputs;Real;%ED3100;MIX - Profibus Variables;True;True;True;;
P_FTP302_Brix;Inputs;Real;%ED2050;MIX - Profibus Variables;True;True;True;;
P_FTP302_Brix_State;Inputs;Byte;%EB2054;MIX - Profibus Variables;True;True;True;;
P_FTP302_Density;Inputs;Real;%ED2045;MIX - Profibus Variables;True;True;True;;
P_FTP302_Density_State;Inputs;Byte;%EB2049;MIX - Profibus Variables;True;True;True;;
P_FTP302_Flow;Inputs;Real;%ED2030;MIX - Profibus Variables;True;True;True;;
P_FTP302_Flow_State;Inputs;Byte;%EB2034;MIX - Profibus Variables;True;True;True;;
P_FTP302_Temp;Inputs;Real;%ED2055;MIX - Profibus Variables;True;True;True;;
P_FTP302_Temp_State;Inputs;Byte;%EB2059;MIX - Profibus Variables;True;True;True;;
P_FTP302_Totaliz_State;Inputs;Byte;%EB2074;MIX - Profibus Variables;True;True;True;;
P_FTP302_Totalizer;Inputs;Real;%ED2070;MIX - Profibus Variables;True;True;True;;
DI_PPM306_Ovrld;Inputs;Bool;%E10.3;PPM306 - Recirculating Pump Overload;True;True;True;;
DI_CIP_CleaningCompleted;Inputs;Bool;%E60.3;CIP - Cip Cleaning Completed;True;True;True;;
P_AI_TTM306;Inputs;Word;%EW108;TTM306 - Chiller Temperature;True;True;True;;
P_AI_RVN304;Inputs;Word;%EW104;RVN304 - Deaireation Valve;True;True;True;;
P_AI_PCM306;Inputs;Word;%EW106;PCM306 - Gas Pressure Injection;True;True;True;;
P_AI_ProductCO2;Inputs;Word;%EW826;Product Analizer - Product CO2;True;True;True;;
P_gPPM303_VFC_StatusWord;Inputs;Word;%EW1640;MIX - Product Pump - Profibus Variables;True;True;True;;
P_PDS_CO2;Inputs;Real;%ED15060;;True;True;True;;
P_PDS_Product_Brix;Inputs;Real;%ED15084;;True;True;True;;
P_PDS_Temperature;Inputs;Real;%ED15104;;True;True;True;;
P_PDS_Density;Inputs;Real;%ED15112;;True;True;True;;
DI_HVP301_Sensor;Inputs;Bool;%E7.2;GCP301 - Manual Syrup Valve Closed (NO);True;True;True;;
DI_PB_HornReset;Inputs;Bool;%E0.1;PB Horn Reset;True;True;True;;
DI_PB_Machine_Start;Inputs;Bool;%E0.4;PB Machine Start;True;True;True;;
DI_PB_Machine_Stop;Inputs;Bool;%E0.3;PB Machine Stop;True;True;True;;
DI_PPN301_Ovrld;Inputs;Bool;%E2.0;PPN301 - Deaireator Pump Overload;True;True;True;;
DI_AuxVoltage_On;Inputs;Bool;%E0.0;Electrical Panel Restored;True;True;True;;
DI_AlarmReset;Inputs;Bool;%E0.2;PB Machine Reset;True;True;True;;
P_AI_RVM301;Inputs;Word;%EW114;RVM301 - Product Tank Pressure Valve;True;True;True;;
DI_Min_Syrup_Level;Inputs;Bool;%E0.7; - Syrup Tank Minimun Level;True;True;True;;
DI_FSS301;Inputs;Bool;%E7.3;FSS301 - Local Cip Return Flow Switch;True;True;True;;
1 Name Path Data Type Logical Address Comment Hmi Visible Hmi Accessible Hmi Writeable Typeobject ID Version ID
2 DI_Emergency_Pilz_On Inputs Bool %E0.5 Pilz Emergency True True True
3 DI_LSN301L Inputs Bool %E0.6 LSN301_L - Deaireator Tank Minimun Level True True True
4 DI_LSM302L Inputs Bool %E1.0 LSM302_L - Product Tank Minimun Level True True True
5 DI_PPN301_SoftStart_Ovrld Inputs Bool %E10.0 PPN301 - Water_Pump_SoftStart_Ovrld True True True
6 DI_UPSBatteryReady Inputs Bool %E3.7 UPS Battery ready True True True
7 DI_RMM301_Closed Inputs Bool %E1.5 RMM301 - Feedback OFF (VM1WATER) True True True
8 DI_RMP302_Closed Inputs Bool %E1.6 RMP302 - Feedback OFF (VM2 SYRUP) True True True
9 DI_RMM303_Closed Inputs Bool %E1.7 RMM303 - Feedback OFF (VM3 CO2) True True True
10 DI_PPN301_Contactor Inputs Bool %E11.0 PPN301 - Deaireator Pump Feedback True True True
11 DI_PPP302_Ovrld Inputs Bool %E2.2 PPP302 - Syrup Pump Overload True True True
12 DI_PPP302_Contactor Inputs Bool %E2.3 PPP302 - Syrup Pump Feedback True True True
13 DI_PPM303_Ovrld Inputs Bool %E2.4 PPM303 - Product Pump Overload True True True
14 DI_PPM306_Contactor Inputs Bool %E11.3 PPM306 - Recirculating Pump Feedback True True True
15 DI_SyrRoom_SyrPump_Running Inputs Bool %E5.0 From Syrup Room - Syrup Pump Running True True True
16 DI_SyrRoom_WatPumpReady Inputs Bool %E68.1 From Syrup Room - Water Pump Ready True True True
17 DI_CIP_CIP_Rinse Inputs Bool %E60.1 From CIP Running True True True
18 DI_CIP_Drain Inputs Bool %E60.2 From CIP Drain True True True
19 DI_Air_InletPress_OK Inputs Bool %E7.1 Air Pressure Switch True True True
20 P_AI_LTM302 Inputs Word %EW100 LTM302 - Product Tank Level True True True
21 P_AI_PTM304 Inputs Word %EW102 PTM304 - Product Tank Pressure True True True
22 P_AI_LTP303 Inputs Word %EW808 LTP303 - Syrup Tank Level True True True
23 P_AI_TTN321 Inputs Word %EW112 TTN321 - Deaireator Temperature True True True
24 P_AI_PTF203 Inputs Word %EW810 PTF203 - Differential Pressure True True True
25 DI_CIP_CIP_Enable Inputs Bool %E60.0 From CIP Enable True True True
26 DI_AVM362_Open Inputs Bool %E102.3 AVM362 - Feedback ON True True True
27 DI_AVM362_Close Inputs Bool %E112.3 AVM362 - Feedback OFF True True True
28 DI_AVM346_Open Inputs Bool %E102.2 AVM346 - Feedback ON True True True
29 DI_AVM346_Close Inputs Bool %E112.2 AVM346 - Feedback OFF True True True
30 DI_UPSAlarm Inputs Bool %E3.5 UPS Alarm True True True
31 DI_UPSsupply Inputs Bool %E3.6 UPS supply OK True True True
32 DI_Emergency_Pressed Inputs Bool %E4.3 Electrical Panel Emergency Button True True True
33 P_AI_PTP338 Inputs Word %EW816 PTP338 - Syrup Inlet Pressure True True True
34 P_FTM303_Density Inputs Real %ED3215 MIX - Profibus Variables True True True
35 P_FTM303_Density_State Inputs Byte %EB3219 MIX - Profibus Variables True True True
36 P_FTM303_Flow Inputs Real %ED3200 MIX - Profibus Variables True True True
37 P_FTM303_Flow_State Inputs Byte %EB3204 MIX - Profibus Variables True True True
38 P_FTM303_Temperature Inputs Real %ED3225 MIX - Profibus Variables True True True
39 P_FTM303_Temperature_State Inputs Byte %EB3229 MIX - Profibus Variables True True True
40 P_FTM303_Totalizer Inputs Real %ED3240 MIX - Profibus Variables True True True
41 P_FTM303_Totalizer_State Inputs Byte %EB3244 MIX - Profibus Variables True True True
42 P_FTN301_Flow Inputs Real %ED3080 MIX - Profibus Variables True True True
43 P_FTN301_Flow_State Inputs Byte %EB3084 MIX - Profibus Variables True True True
44 P_FTN301_Totaliz_State Inputs Byte %EB3104 MIX - Profibus Variables True True True
45 P_FTN301_Totalizer Inputs Real %ED3100 MIX - Profibus Variables True True True
46 P_FTP302_Brix Inputs Real %ED2050 MIX - Profibus Variables True True True
47 P_FTP302_Brix_State Inputs Byte %EB2054 MIX - Profibus Variables True True True
48 P_FTP302_Density Inputs Real %ED2045 MIX - Profibus Variables True True True
49 P_FTP302_Density_State Inputs Byte %EB2049 MIX - Profibus Variables True True True
50 P_FTP302_Flow Inputs Real %ED2030 MIX - Profibus Variables True True True
51 P_FTP302_Flow_State Inputs Byte %EB2034 MIX - Profibus Variables True True True
52 P_FTP302_Temp Inputs Real %ED2055 MIX - Profibus Variables True True True
53 P_FTP302_Temp_State Inputs Byte %EB2059 MIX - Profibus Variables True True True
54 P_FTP302_Totaliz_State Inputs Byte %EB2074 MIX - Profibus Variables True True True
55 P_FTP302_Totalizer Inputs Real %ED2070 MIX - Profibus Variables True True True
56 DI_PPM306_Ovrld Inputs Bool %E10.3 PPM306 - Recirculating Pump Overload True True True
57 DI_CIP_CleaningCompleted Inputs Bool %E60.3 CIP - Cip Cleaning Completed True True True
58 P_AI_TTM306 Inputs Word %EW108 TTM306 - Chiller Temperature True True True
59 P_AI_RVN304 Inputs Word %EW104 RVN304 - Deaireation Valve True True True
60 P_AI_PCM306 Inputs Word %EW106 PCM306 - Gas Pressure Injection True True True
61 P_AI_ProductCO2 Inputs Word %EW826 Product Analizer - Product CO2 True True True
62 P_gPPM303_VFC_StatusWord Inputs Word %EW1640 MIX - Product Pump - Profibus Variables True True True
63 P_PDS_CO2 Inputs Real %ED15060 True True True
64 P_PDS_Product_Brix Inputs Real %ED15084 True True True
65 P_PDS_Temperature Inputs Real %ED15104 True True True
66 P_PDS_Density Inputs Real %ED15112 True True True
67 DI_HVP301_Sensor Inputs Bool %E7.2 GCP301 - Manual Syrup Valve Closed (NO) True True True
68 DI_PB_HornReset Inputs Bool %E0.1 PB Horn Reset True True True
69 DI_PB_Machine_Start Inputs Bool %E0.4 PB Machine Start True True True
70 DI_PB_Machine_Stop Inputs Bool %E0.3 PB Machine Stop True True True
71 DI_PPN301_Ovrld Inputs Bool %E2.0 PPN301 - Deaireator Pump Overload True True True
72 DI_AuxVoltage_On Inputs Bool %E0.0 Electrical Panel Restored True True True
73 DI_AlarmReset Inputs Bool %E0.2 PB Machine Reset True True True
74 P_AI_RVM301 Inputs Word %EW114 RVM301 - Product Tank Pressure Valve True True True
75 DI_Min_Syrup_Level Inputs Bool %E0.7 - Syrup Tank Minimun Level True True True
76 DI_FSS301 Inputs Bool %E7.3 FSS301 - Local Cip Return Flow Switch True True True

View File

@ -5,18 +5,6 @@
"long_description": "Este script utiliza TIA Portal Openness para exportar la lógica de un PLC en formato XML y SCL. Permite seleccionar un proyecto de TIA Portal y genera los archivos de exportación en el directorio configurado.\n***\n**Lógica Principal:**\n\n1. **Configuración:** Carga parámetros desde `ParamManagerScripts` (directorio de trabajo, versión de TIA Portal).\n2. **Selección de Proyecto:** Abre un cuadro de diálogo para seleccionar el archivo del proyecto de TIA Portal.\n3. **Conexión a TIA Portal:** Utiliza la API de TIA Openness para conectarse al portal y abrir el proyecto seleccionado.\n4. **Exportación:** Exporta la lógica del PLC en archivos XML y SCL al directorio configurado.\n5. **Cierre:** Cierra la conexión con TIA Portal al finalizar.",
"hidden": false
},
"x2.py": {
"display_name": "2: Exportar CAx desde TIA",
"short_description": "Exporta datos CAx de un proyecto TIA Portal y genera un resumen en Markdown.",
"long_description": "Este script utiliza TIA Portal Openness para exportar datos CAx de un proyecto de TIA Portal y generar un resumen en formato Markdown.\n***\n**Lógica Principal:**\n\n1. **Configuración:** Carga parámetros desde `ParamManagerScripts` (directorio de trabajo, versión de TIA Portal).\n2. **Selección de Proyecto:** Abre un cuadro de diálogo para seleccionar el archivo del proyecto de TIA Portal.\n3. **Conexión a TIA Portal:** Utiliza la API de TIA Openness para conectarse al portal y abrir el proyecto seleccionado.\n4. **Exportación CAx:** Exporta los datos CAx en formato AML y genera un archivo de resumen en Markdown con la jerarquía del proyecto y los dispositivos encontrados.\n5. **Cierre:** Cierra la conexión con TIA Portal al finalizar.",
"hidden": false
},
"x3.py": {
"display_name": "3: Procesar la exportación AML y generar documentación de IOs",
"short_description": "Extrae IOs de un archivo AML exportado del TIA Portal y genera un archivo Markdown.",
"long_description": "Este script procesa un archivo AML exportado desde TIA Portal para extraer información de los IOs y generar un archivo Markdown con un resumen detallado.\n***\n**Lógica Principal:**\n\n1. **Selección de Archivo AML:** Abre un cuadro de diálogo para seleccionar el archivo AML exportado desde TIA Portal.\n2. **Procesamiento de Datos:**\n * Extrae información de dispositivos, redes y conexiones desde el archivo AML.\n * Identifica PLCs, redes y módulos IO.\n * Genera una estructura jerárquica de los dispositivos y sus conexiones.\n3. **Generación de Markdown:**\n * Crea un archivo Markdown con un resumen jerárquico de hardware y conexiones IO.\n * Incluye un árbol de conexiones IO hacia arriba para depuración.\n4. **Salida:** Guarda los resultados en archivos Markdown y JSON en el directorio configurado.",
"hidden": false
},
"x4.py": {
"display_name": "4: Exportar Referencias Cruzadas",
"short_description": "Script para exportar las referencias cruzadas",

View File

@ -1,9 +1,19 @@
[18:14:57] Iniciando ejecución de x5.py en C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport...
[18:14:57] Usando directorio de trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport
[18:14:57] Procesando archivo Excel: Inputs PLCTags.xlsx...
[18:14:58] Procesando archivo Excel: InputsMaster PLCTags.xlsx...
[18:14:58] Procesando archivo Excel: Outputs PLCTags.xlsx...
[18:14:58] Procesando archivo Excel: OutputsMaster PLCTags.xlsx...
[18:14:58] ¡Éxito! Archivos Excel convertidos a Markdown en: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\IOExport\consolidated_excel_tables.md
[18:14:58] Ejecución de x5.py finalizada (success). Duración: 0:00:00.948478.
[18:14:58] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\ObtainIOFromProjectTia\log_x5.txt
[11:58:03] Iniciando ejecución de x3_excel_to_md.py en C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2...
[11:58:04] Usando directorio de trabajo: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2
[11:58:04] Configuración de paths cargada desde: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\io_paths_config.json
[11:58:04] Usando archivo Excel predeterminado: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx
[11:58:04] Procesando archivo Excel: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\PLCTags.xlsx...
[11:58:04] Paths configurados para procesar: ['Inputs', 'Outputs', 'OutputsFesto', 'IO Not in Hardware\\InputsMaster', 'IO Not in Hardware\\OutputsMaster']
[11:58:05] ¡Éxito! Archivo Excel convertido a Markdown en: C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2\Master IO Tags.md
[11:58:05] Ejecución de x3_excel_to_md.py finalizada (success). Duración: 0:00:01.664065.
[11:58:05] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\log_x3_excel_to_md.txt
[12:09:38] Iniciando ejecución de x4_prompt_generator.py en C:\Trabajo\SIDEL\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\Reporte\TAGsIO\v2...
[12:09:38] --- ERRORES ---
[12:09:38] Traceback (most recent call last):
[12:09:38] File "D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\x4_prompt_generator.py", line 11, in <module>
[12:09:38] import pyperclip # Para copiar al portapapeles
[12:09:38] ^^^^^^^^^^^^^^^^
[12:09:38] ModuleNotFoundError: No module named 'pyperclip'
[12:09:38] --- FIN ERRORES ---
[12:09:38] Ejecución de x4_prompt_generator.py finalizada (error). Duración: 0:00:00.084182. Se detectaron errores (ver log).
[12:09:38] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\log_x4_prompt_generator.txt