Most stable state

This commit is contained in:
ilia gu 2025-08-26 21:29:02 +04:00
parent d8516dd302
commit e68f0d9980
144 changed files with 70866 additions and 11405 deletions

327
CNO8_generator_config.json Normal file
View File

@ -0,0 +1,327 @@
{
"files": {
"excel_file": "DESC_IP_MERGED.xlsx",
"output_dir": ".",
"zones_file": "CNO8_zones.json",
"safety_l5x": "SafetyProgram_Generated.L5X",
"main_l5x": "MainProgram_Generated.L5X",
"mapping_txt": "SafetyTagMapping.txt"
},
"filters": {
"global": {},
"per_routine": {}
},
"routine_plan": [
{
"name": "main_routine",
"plugin": "main_routine",
"enabled": true,
"program": "MainProgram",
"order": 10,
"params": {}
},
{
"name": "mcm",
"plugin": "mcm",
"enabled": true,
"program": "MainProgram",
"order": 22,
"params": {}
},
{
"name": "rack",
"plugin": "rack",
"enabled": true,
"program": "MainProgram",
"order": 25,
"params": {}
},
{
"name": "dpm",
"plugin": "dpm",
"enabled": true,
"program": "MainProgram",
"order": 40,
"params": {}
},
{
"name": "fiom",
"plugin": "fiom",
"enabled": false,
"program": "MainProgram",
"order": 50,
"params": {}
},
{
"name": "fioh",
"plugin": "fioh",
"enabled": false,
"program": "MainProgram",
"order": 60,
"params": {}
},
{
"name": "apf",
"plugin": "apf",
"enabled": true,
"program": "MainProgram",
"order": 70,
"params": {}
},
{
"name": "extendo",
"plugin": "extendo",
"enabled": false,
"program": "MainProgram",
"order": 80,
"params": {}
},
{
"name": "flow_ctrl",
"plugin": "flow_ctrl",
"enabled": false,
"program": "MainProgram",
"order": 90,
"params": {}
},
{
"name": "speed_ctrl",
"plugin": "speed_ctrl",
"enabled": false,
"program": "MainProgram",
"order": 100,
"params": {}
},
{
"name": "d2c_chute",
"plugin": "d2c_chute",
"enabled": false,
"program": "MainProgram",
"order": 110,
"params": {}
},
{
"name": "pb_chute",
"plugin": "pb_chute",
"enabled": false,
"program": "MainProgram",
"order": 120,
"params": {}
},
{
"name": "station_jr_chute",
"plugin": "station_jr_chute",
"enabled": false,
"program": "MainProgram",
"order": 130,
"params": {}
},
{
"name": "station_jr_pb",
"plugin": "station_jr_pb",
"enabled": false,
"program": "MainProgram",
"order": 140,
"params": {}
},
{
"name": "jpe",
"plugin": "jpe",
"enabled": false,
"program": "MainProgram",
"order": 150,
"params": {}
},
{
"name": "fpe",
"plugin": "fpe",
"enabled": false,
"program": "MainProgram",
"order": 160,
"params": {}
},
{
"name": "pmm",
"plugin": "pmm",
"enabled": false,
"program": "MainProgram",
"order": 170,
"params": {}
},
{
"name": "cb_monitor",
"plugin": "cb_monitor",
"enabled": false,
"program": "MainProgram",
"order": 180,
"params": {}
},
{
"name": "inputs",
"plugin": "inputs",
"enabled": true,
"program": "SafetyProgram",
"order": 10,
"params": {}
},
{
"name": "outputs",
"plugin": "outputs",
"enabled": true,
"program": "SafetyProgram",
"order": 11,
"params": {}
},
{
"name": "resets",
"plugin": "resets",
"enabled": true,
"program": "SafetyProgram",
"order": 12,
"params": {}
},
{
"name": "zones",
"plugin": "zones",
"enabled": true,
"program": "SafetyProgram",
"order": 13,
"params": {}
},
{
"name": "estops",
"plugin": "estops",
"enabled": true,
"program": "SafetyProgram",
"order": 20,
"params": {}
},
{
"name": "estop_check",
"plugin": "estop_check",
"enabled": true,
"program": "MainProgram",
"order": 120,
"params": {}
},
{
"name": "safety_tag_map",
"plugin": "safety_tag_map",
"enabled": true,
"program": "MainProgram",
"order": 130,
"params": {}
},
{
"name": "taching_belts",
"plugin": "taching_belts",
"enabled": true,
"program": "MainProgram",
"order": 200,
"params": {}
},
{
"name": "belt_tracking",
"plugin": "belt_tracking",
"enabled": true,
"program": "MainProgram",
"order": 210,
"params": {}
}
],
"xml": {
"schema_revision": "1.0",
"software_revision": "36.00",
"controller_name": "MTN6_MCM04_CHUTE_LOAD",
"target_class": "Standard",
"export_options": "References NoRawData L5KData DecoratedData Context Dependencies ForceProtectedEncoding AllProjDocTrans"
},
"routines": {
"safety_tag_prefix": "SFT_",
"mcm_input_address": "Local:5:I.Data.0",
"mcm_epb_status_inputs": ["Local:7:I.Pt02.Status", "Local:7:I.Pt03.Status"],
"mcm_epb_dcs_inputs": ["Local:7:I.Pt02.Data", "Local:7:I.Pt03.Data"],
"mcm_epb_dcs_tag_name": "MCM_EPB_DCS_CTRL",
"mcm_safety_tag": "MCM_S_PB",
"speed_ctrl_setpoint_tag": "Speed_350_FPM",
"speed_ctrl_setpoint_value": 350,
"no_horn_tag_name": "NO_Horn",
"mcm_base_tag": "MCM",
"mcm_ctrl_tag": "MCM.CTRL",
"rack_fault_tag": "Rack.AOI.Slot2_EN4TR_Faulted",
"mcm_epb_status_tag": "MCM_EPB_STATUS",
"top_level_estop_ok_tag": "EStop_MCM_OK",
"station_ctrl_tag": "Station.CTRL",
"apf_input_default": "In_0",
"mcm_aoi_input_args": [
"Local:5:I.Data.2",
"Local:5:I.Data.5",
"Local:5:I.Data.4",
"Local:5:I.Data.0",
"Local:5:I.Data.3",
"Local:7:I.Pt02.Data",
"Local:7:I.Pt03.Data",
"Local:5:I.Data.1",
"Local:7:I.Pt00.Data",
"Local:5:I.Data.7",
"Local:5:I.Data.8",
"Local:5:I.Data.6",
"Local:5:I.Data.9"
],
"mcm_aoi_output_args": [
"Local:6:O.Data.2",
"Local:6:O.Data.5",
"Local:6:O.Data.4",
"Local:6:O.Data.0",
"Local:6:O.Data.1",
"Local:6:O.Data.3"
]
},
"extraction": {
"rst_desc_contains": [ "START" ],
"rst_desc_excludes": [ "LIGHT" ],
"rst_desca_exclude_patterns": [ "GS1" ],
"rst_desca_patterns": [ "S1_PB", "S2_PB" ],
"rst_desca_endings": [ "SPB" ],
"dpm_partnumber_contains": [ "OS30-002404-2S" ],
"fiom_partnumber_contains": [ "5032-8IOLM12DR" ],
"fioh_partnumber_contains": [ "5032-8IOLM12DR" ],
"fioh_desca_contains": [ "FIOH" ],
"sto_tagname_patterns": [ "VFD" ],
"sto_desca_patterns": [ "STO" ],
"epc_desca_patterns": [ "EPC", "ESTOP" ],
"apf_partnumber_prefix": [ "35S" ],
"extendo_partnumber_exact": [ "CALJAN" ],
"pmm_partnumber_exact": [ "1420-V2-ENT" ],
"speed_ctrl_partnumber_prefix": [ "35S" ]
,
"cb_desca_include": [ "CB" ],
"cb_desca_exclude": [ "BCN" ],
"s0_prefix": "S0",
"d2c_gs1_pb_token": "GS1_PB",
"d2c_gs1_pb_lt_token": "GS1_PB_LT",
"d2c_bcn_token": "BCN",
"d2c_zmx_suffix": "_ZMX",
"pb_chute_components": [ "PE1", "PE2", "PR1", "SOL1" ],
"fioh_token": "FIOH",
"bcn_token": "BCN",
"beacon_stack_3_tokens": [ "3-STACK", "3 STACK" ],
"beacon_segment_a_pin4": "Connector_1_A_Pin_4",
"beacon_segment_b_pin2": "Connector_1_B_Pin_2",
"jr1_pb_token": "JR1_PB",
"jr1_pb_lt_token": "JR1_PB_LT",
"jr2_token": "JR2_PB",
"jr2_pb_lt_token": "JR2_PB_LT",
"jr1_exclude_tokens": [],
"vfd_prefix_regex": "",
"vfd_suffix_default": "_VFD1",
"jpe_include_tokens": [ "TPE" ],
"jpe_exclude_tokens": [ ],
"jpe_input_default": "",
"fpe_include_tokens": [ "FPE", "3CH_PE" ],
"flow_ctrl_vfd_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_VFD\\d+",
"flow_ctrl_extendo_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_EX\\d+",
"flow_ctrl_chain_order": "natural",
"flow_ctrl_enable_extendo_interlocks": true
}
}

10
CNO8_zones.json Normal file
View File

@ -0,0 +1,10 @@
{
"DEFAULT": [
{
"name": "MCM",
"start": "",
"stop": "",
"interlock": ""
}
]
}

Binary file not shown.

View File

@ -415,8 +415,31 @@ class EnhancedMCMGenerator:
if self.iolm_modules:
print(f"Found {len(self.iolm_modules)} IOLM modules")
if self.lpe_modules:
print(f"Found {len(self.lpe_modules)} LPE modules")
if self.beacon_modules:
print(f"Found {len(self.beacon_modules)} Beacon modules")
if self.solenoid_modules:
print(f"Found {len(self.solenoid_modules)} Solenoid modules")
if self.apf_modules:
print(f"Found {len(self.apf_modules)} APF modules")
if self.vfd_modules:
print(f"Found {len(self.vfd_modules)} VFD modules")
if self.dpm_modules:
print(f"Found {len(self.dpm_modules)} DPM modules")
if self.pmm_modules:
print(f"Found {len(self.pmm_modules)} PMM modules")
if self.unknown_modules:
print(f"WARNING: {len(self.unknown_modules)} unknown modules found")
for i, module in enumerate(self.unknown_modules, 1):
print(f" {i:2d}. {module['tagname']} - {module['part_number']} ({module['ip_address']})")
def generate_complete_project(self, split_mode: bool = False):
"""Generate the complete project L5X file(s) using the new ControllerBuilder.

View File

@ -13,6 +13,14 @@ from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass, field
from collections import defaultdict
def _is_hub_name_in_desc(desc: str) -> bool:
"""Check if description contains hub patterns like FIO1H1, FIO2H3, etc."""
if not desc:
return False
# Match patterns like FIO1H1, FIO2H3, etc. in description
hub_pattern = re.compile(r'FIO\d+H\d+', re.IGNORECASE)
return bool(hub_pattern.search(desc))
@dataclass
class IOPathMapping:
@ -248,19 +256,26 @@ class ExcelDataProcessor:
desc = str(row['DESC']) if pd.notna(row['DESC']) else ""
tagname = str(row['TAGNAME']) if pd.notna(row['TAGNAME']) else ""
# Check if TERM is IO4/IO12 AND DESC contains FIOH (channels restricted to 4 and 12)
# Check if TERM is IO4/IO12 AND DESC contains FIOH or hub patterns (channels restricted to 4 and 12)
# Temporarily also support IO6/IO14 for backward compatibility during transition
if term.upper() in ["IO4", "IO12", "IO6", "IO14"] and "FIOH" in desc.upper():
# Handle both IO4 and IO04 formats
if term.upper() in ["IO4", "IO04", "IO12", "IO6", "IO06", "IO14"] and ("FIOH" in desc.upper() or _is_hub_name_in_desc(desc)):
# Extract FIOH name from description
# Look for patterns like "FL1014_FIOH1" or similar in the description
# Look for patterns like "FL1014_FIOH1" or "S02_1_FIO1H1" in the description
fioh_match = re.search(r'([A-Z0-9_]+FIOH\d*)', desc.upper())
hub_match = re.search(r'([A-Z0-9_]+FIO\d+H\d+)', desc.upper())
if fioh_match:
fioh_name = fioh_match.group(1)
elif hub_match:
fioh_name = hub_match.group(1)
else:
continue # No valid hub pattern found
# The parent module is the TAGNAME where we found this FIOH reference
# Store both parent and terminal info
if fioh_name not in fioh_modules_to_create:
fioh_modules_to_create[fioh_name] = (tagname, term.upper())
# The parent module is the TAGNAME where we found this FIOH reference
# Store both parent and terminal info
if fioh_name not in fioh_modules_to_create:
fioh_modules_to_create[fioh_name] = (tagname, term.upper())
# Create FIOH modules based on findings
for fioh_name, (parent_module, terminal) in fioh_modules_to_create.items():

View File

@ -40,6 +40,9 @@ class M12DRModuleGenerator:
"PalletBuildMaster": "PalletBuildMaster_Module.L5X",
"D2CMaster": "D2CMaster_Module.L5X",
"PDP_FIO": "PDP_FIO_Module.L5X",
"Sorter": "Sorter_FIOM_Module.L5X",
"Sorter_Solenoid": "Sorter_Solenoid_FIO_Module.L5X",
"FIOM2_Master": "FIOM2_Master_Module.L5X",
#"UL_FIO": "PDP_FIO_Module.L5X", # Fallback to PDP_FIO if specific UL boilerplate not found
#"FIO_GENERIC": "PDP_FIO_Module.L5X" # Fallback to PDP_FIO for generic FIO modules
}
@ -229,6 +232,12 @@ class M12DRModuleGenerator:
module.set("ParentModule", self.config.parent_module)
module.set("ParentModPortId", self.config.parent_port_id)
def update_major_revision(self):
"""Update the Major revision to 1."""
module = self.root.find(".//Module[@Use='Target']")
if module is not None:
module.set("Major", "1")
def update_input_comments(self):
"""Update input tag comments."""
input_tag = self.root.find(".//Connection[@Name='Data']/InputTag")
@ -279,6 +288,7 @@ class M12DRModuleGenerator:
self.update_module_name()
self.update_ip_address()
self.update_parent_module()
self.update_major_revision()
self.update_input_comments()
self.update_output_comments()
self.update_export_date()
@ -431,12 +441,29 @@ def _determine_variant(module_data: "ModuleData") -> str:
"""Determine M12DR variant based on module name and FIOH patterns.
Logic:
1. If module name contains "PDP", use PDP_FIO variant
2. If FIOH is found in IO4 or IO12 descriptions, use PalletBuildMaster
3. Otherwise, use D2CMaster
1. If module name matches specific FIOM patterns (VS01A_FIOM*, VS01C_FIOM*), use FIOM2_Master variant
2. If module name starts with S0 and is FIO9-FIO19, use Sorter_Solenoid variant
3. If module name starts with S0, use Sorter variant
4. If module name contains "PDP", use PDP_FIO variant
5. If FIOH is found in IO4 or IO12 descriptions, use PalletBuildMaster
6. Otherwise, use D2CMaster
"""
module_name = module_data.tagname.upper()
# Check for specific FIOM pattern modules first
if _is_fiom_master_pattern(module_name):
return "FIOM2_Master"
# Check for Sorter FIO modules first (S0 prefix detection)
if module_name.startswith("S0") and "FIO" in module_name:
# Check if this is a solenoid FIO (FIO9-FIO19)
if _is_solenoid_fio_pattern(module_name):
return "Sorter_Solenoid"
else:
return "Sorter"
# Check if module name contains PDP
if "PDP" in module_data.tagname.upper():
if "PDP" in module_name:
return "PDP_FIO"
# Check for FIOH in IO4 or IO12 descriptions
@ -456,6 +483,41 @@ def _determine_variant(module_data: "ModuleData") -> str:
return "D2CMaster"
def _is_fiom_master_pattern(module_name: str) -> bool:
"""Check if module name matches specific FIOM patterns that should use FIOM2_Master boilerplate.
Matches modules like:
- VS01A_FIOM13, VS01A_FIOM21, VS01A_FIOM5
- VS01C_FIOM17, VS01C_FIOM18, VS01C_FIOM19
"""
# Specific module names that should use FIOM2_Master boilerplate
fiom_master_modules = {
"VS01A_FIOM13", "VS01A_FIOM21", "VS01A_FIOM5",
"VS01C_FIOM17", "VS01C_FIOM18", "VS01C_FIOM19"
}
return module_name in fiom_master_modules
def _is_master_pattern(module_name: str) -> bool:
"""Check if module name matches master patterns like FIO2M1, FIO3M, etc."""
import re
# Match patterns like FIO2M1, FIO3M, etc.
master_pattern = re.compile(r'^.*FIO\d+M\d*$')
return bool(master_pattern.match(module_name))
def _is_solenoid_fio_pattern(module_name: str) -> bool:
"""Check if module name matches solenoid FIO patterns (FIO9-FIO19)."""
import re
# Extract FIO number from patterns like S02_1_FIO9, S02_2_FIO19, etc.
fio_match = re.search(r'FIO(\d+)', module_name)
if fio_match:
fio_number = int(fio_match.group(1))
# Check if FIO number is between 9 and 19 (inclusive)
return 9 <= fio_number <= 19
return False
def _is_output_signal(signal: str, io_path: str) -> bool:
if not signal:
return False

View File

@ -65,7 +65,8 @@ class TurckHubModuleGenerator:
"Chute_Chute": "Chute_Chute_Hub_Module.L5X",
"Load_Chute": "Load_Chute_Hub_Module.L5X",
"PDP_FIOH": "PDP_FIOH_Module.L5X",
"FL_Hub": "FL_Hub_Module.L5X"
"FL_Hub": "FL_Hub_Module.L5X",
"Sorter": "Sorter_FIOH_Module.L5X"
}
# Default port addresses for each variant (FIOH must be on 6 or 14)
@ -74,7 +75,8 @@ class TurckHubModuleGenerator:
"Chute_Chute": "6", # Fixed: was "0", now proper FIOH address
"Load_Chute": "14", # Fixed: was "8", now proper FIOH address
"PDP_FIOH": "6", # PDP FIOH modules default to address 6
"FL_Hub": "6" # FL Hub modules default to address 6
"FL_Hub": "6", # FL Hub modules default to address 6
"Sorter": "4" # Sorter FIOH modules default to address 4
}
def __init__(self, config: TurckHubModuleConfig):
@ -600,8 +602,14 @@ def get_pdp_fioh_default_input_comments() -> Dict[str, str]:
def _determine_variant(module_data: "ModuleData") -> str:
"""Determine Turck hub variant based on module name and DESC patterns."""
# Check for PDP FIOH modules first (name-based detection)
module_name = module_data.tagname.upper()
# Check for Sorter FIOH modules first (S0 prefix detection)
# Handle patterns like S0_FIO1H2, S0_FIO2H3, etc.
if (module_name.startswith("S0") or module_name.startswith("VS")) and ("FIOH" in module_name or _is_hub_pattern(module_name)):
return "Sorter"
# Check for PDP FIOH modules (name-based detection)
if "PDP" in module_name and "FIOH" in module_name:
return "PDP_FIOH"
@ -629,8 +637,16 @@ def _determine_variant(module_data: "ModuleData") -> str:
# This might need additional logic - for now keeping as separate case
# You may need to specify the exact criteria for Load_Chute
# Default to Chute_Load for other cases
return "Chute_Load"
# Default to Chute_Chute as fallback for other cases
return "Chute_Chute"
def _is_hub_pattern(module_name: str) -> bool:
"""Check if module name matches hub patterns like FIO1H2, FIO2H3, FIOH1, etc."""
import re
# Match patterns like FIO1H2, FIO2H3, FIOH1, etc.
hub_pattern = re.compile(r'^.*FIO(\d+)?H\d*$')
return bool(hub_pattern.match(module_name))
def _extract_comments(module_data: "ModuleData") -> tuple[Dict[str, str], Dict[str, str]]:

View File

@ -82,12 +82,82 @@ class CompilationManager:
print(f"🧹 Cleanup complete: {files_removed} files, {dirs_removed} directories removed")
def copy_l5x_file(self, source_l5x: Path, project_name: str) -> Path:
def clean_old_project_files(self, current_project_name: str) -> None:
"""Clean old project files but keep current project files if they exist.
Args:
current_project_name: Name of the current project being compiled
"""
print("🧹 Cleaning old project files...")
# Files to always preserve
core_files = {
"l5x_to_acd.py",
"compilation_manager.py",
"setup_windows_sdk.bat",
"logix_designer_sdk-2.0.1-py3-none-any.whl"
}
# Directories to always preserve
core_dirs = {
"__pycache__"
}
# Current project files to potentially keep
current_l5x = f"{current_project_name}.L5X"
current_batch = f"compile_{current_project_name}.bat"
current_acd = f"{current_project_name}.ACD"
files_removed = 0
files_kept = 0
dirs_removed = 0
# Remove old project files, but keep current project files
for file_path in self.compilation_dir.glob("*"):
if file_path.is_file():
if file_path.name in core_files:
# Always keep core files
continue
elif file_path.name in [current_l5x, current_batch, current_acd]:
# Keep current project files
files_kept += 1
print(f" ⚪ Keeping current project file: {file_path.name}")
elif (file_path.name.endswith('.L5X') or
file_path.name.startswith('compile_') or
file_path.name.endswith('.ACD')):
# Remove old project files
try:
file_path.unlink()
files_removed += 1
print(f" ✓ Removed old project file: {file_path.name}")
except Exception as e:
print(f" ⚠️ Could not remove {file_path.name}: {e}")
else:
# Remove other non-core files
try:
file_path.unlink()
files_removed += 1
print(f" ✓ Removed file: {file_path.name}")
except Exception as e:
print(f" ⚠️ Could not remove {file_path.name}: {e}")
elif file_path.is_dir():
if file_path.name not in core_dirs:
try:
shutil.rmtree(file_path)
dirs_removed += 1
print(f" ✓ Removed directory: {file_path.name}")
except Exception as e:
print(f" ⚠️ Could not remove {file_path.name}: {e}")
print(f"🧹 Cleanup complete: {files_removed} files removed, {files_kept} current files kept, {dirs_removed} directories removed")
def copy_l5x_file(self, source_l5x: Path, project_name: str, force_overwrite: bool = False) -> Path:
"""Copy L5X file to compilation directory with project-specific naming.
Args:
source_l5x: Path to the source L5X file
project_name: Name of the project for file naming
force_overwrite: Whether to overwrite existing file even if identical
Returns:
Path to the copied L5X file in compilation directory
@ -99,24 +169,40 @@ class CompilationManager:
dest_filename = f"{project_name}.L5X"
dest_l5x = self.compilation_dir / dest_filename
print(f"📁 Copying L5X file: {source_l5x.name}{dest_filename}")
# Check if we need to copy
needs_copy = True
if dest_l5x.exists() and not force_overwrite:
# Compare file sizes and modification times
source_stat = source_l5x.stat()
dest_stat = dest_l5x.stat()
try:
shutil.copy2(source_l5x, dest_l5x)
file_size_mb = dest_l5x.stat().st_size / (1024 * 1024)
print(f" ✓ Copied successfully ({file_size_mb:.2f} MB)")
return dest_l5x
except Exception as e:
raise RuntimeError(f"Failed to copy L5X file: {e}")
if (source_stat.st_size == dest_stat.st_size and
source_stat.st_mtime <= dest_stat.st_mtime):
print(f"📁 L5X file up to date: {dest_filename}")
needs_copy = False
if needs_copy:
print(f"📁 Copying L5X file: {source_l5x.name}{dest_filename}")
try:
shutil.copy2(source_l5x, dest_l5x)
file_size_mb = dest_l5x.stat().st_size / (1024 * 1024)
print(f" ✓ Copied successfully ({file_size_mb:.2f} MB)")
except Exception as e:
raise RuntimeError(f"Failed to copy L5X file: {e}")
return dest_l5x
def generate_batch_file(self, project_name: str, l5x_filename: str,
compilation_options: Optional[Dict] = None) -> Path:
compilation_options: Optional[Dict] = None,
force_regenerate: bool = False) -> Path:
"""Generate project-specific batch file for compilation.
Args:
project_name: Name of the project
l5x_filename: Name of the L5X file to compile
compilation_options: Optional compilation settings
force_regenerate: Whether to regenerate batch file even if it exists
Returns:
Path to the generated batch file
@ -127,24 +213,32 @@ class CompilationManager:
batch_filename = f"compile_{project_name}.bat"
batch_path = self.compilation_dir / batch_filename
# Convert paths to Windows format for batch file
compilation_dir_win = str(self.compilation_dir).replace('/mnt/c/', 'C:\\').replace('/', '\\')
l5x_file_win = f"{compilation_dir_win}\\{l5x_filename}"
# Check if we need to regenerate
needs_generation = True
if batch_path.exists() and not force_regenerate:
print(f"🔧 Batch file exists: {batch_filename}")
needs_generation = False
# Create project-specific batch content
batch_content = self._create_batch_content(
project_name, l5x_file_win, compilation_dir_win, options
)
if needs_generation:
# Convert paths to Windows format for batch file
compilation_dir_win = str(self.compilation_dir).replace('/mnt/c/', 'C:\\').replace('/', '\\')
l5x_file_win = f"{compilation_dir_win}\\{l5x_filename}"
print(f"🔧 Generating batch file: {batch_filename}")
# Create project-specific batch content
batch_content = self._create_batch_content(
project_name, l5x_file_win, compilation_dir_win, options
)
try:
with open(batch_path, 'w', newline='\r\n') as f: # Windows line endings
f.write(batch_content)
print(f" ✓ Generated successfully")
return batch_path
except Exception as e:
raise RuntimeError(f"Failed to generate batch file: {e}")
print(f"🔧 Generating batch file: {batch_filename}")
try:
with open(batch_path, 'w', newline='\r\n') as f: # Windows line endings
f.write(batch_content)
print(f" ✓ Generated successfully")
except Exception as e:
raise RuntimeError(f"Failed to generate batch file: {e}")
return batch_path
def _create_batch_content(self, project_name: str, l5x_file_win: str,
compilation_dir_win: str, options: Dict) -> str:
@ -159,14 +253,10 @@ class CompilationManager:
Returns:
Batch file content as string
"""
# Determine project type for specialized handling
project_type = self._detect_project_type(project_name)
# Header
content = f"@echo off\n"
content += f"echo ====================================\n"
content += f"echo PLC Compilation: {project_name}\n"
content += f"echo Project Type: {project_type}\n"
content += f"echo ====================================\n"
content += f"echo.\n\n"
@ -236,15 +326,9 @@ class CompilationManager:
content += f"for %%F in (\"{l5x_file_win}\") do echo File size: %%~zF bytes\n"
content += f"echo.\n\n"
# Compilation command with project-specific options
# Compilation command
compilation_cmd = f"py -3.12 l5x_to_acd.py \"{l5x_file_win}\""
# Add project-specific options
if project_type == "MCM01" and options.get("enable_safety_validation", True):
content += f"echo Enabling MCM01 safety validation...\n"
elif project_type == "MCM04" and options.get("enable_feeder_optimization", True):
content += f"echo Enabling MCM04 feeder optimization...\n"
content += f"echo Starting compilation...\n"
content += f"echo Command: {compilation_cmd}\n"
content += f"echo.\n\n"
@ -276,36 +360,18 @@ class CompilationManager:
return content
def _detect_project_type(self, project_name: str) -> str:
"""Detect the project type from the project name.
Args:
project_name: Name of the project
Returns:
Project type (MCM01, MCM04, MCM05, or UNKNOWN)
"""
project_upper = project_name.upper()
if "MCM01" in project_upper:
return "MCM01"
elif "MCM04" in project_upper:
return "MCM04"
elif "MCM05" in project_upper:
return "MCM05"
else:
return "UNKNOWN"
def setup_compilation(self, source_l5x: Path, project_name: str,
compilation_options: Optional[Dict] = None,
wipe_existing: bool = True) -> Dict[str, Path]:
"""Complete compilation setup: wipe, copy, and generate batch file.
wipe_existing: bool = False,
replace_mode: bool = True) -> Dict[str, Path]:
"""Complete compilation setup: clean old files, copy, and generate batch file.
Args:
source_l5x: Path to the source L5X file
project_name: Name of the project
compilation_options: Optional compilation settings
wipe_existing: Whether to wipe existing files first
wipe_existing: Whether to wipe ALL existing files first (old behavior)
replace_mode: Whether to use smart replacement mode (new default behavior)
Returns:
Dictionary with paths to generated files
@ -313,20 +379,29 @@ class CompilationManager:
print(f"🚀 Setting up compilation for project: {project_name}")
print(f"📂 Compilation directory: {self.compilation_dir}")
print(f"📄 Source L5X: {source_l5x}")
print(f"🔧 Mode: wipe_existing={wipe_existing}, replace_mode={replace_mode}")
print()
# Step 1: Wipe existing files
# Step 1: Clean files (either wipe all or smart clean)
if wipe_existing:
print("🧹 Using WIPE mode - removing all files")
self.wipe_compilation_files(preserve_core=True)
print()
elif replace_mode:
print("🔄 Using SMART REPLACE mode - keeping current project files")
self.clean_old_project_files(project_name)
print()
else:
print("⚪ Using NO-CLEAN mode - keeping all existing files")
print()
# Step 2: Copy L5X file
copied_l5x = self.copy_l5x_file(source_l5x, project_name)
# Step 2: Copy L5X file (only if needed)
copied_l5x = self.copy_l5x_file(source_l5x, project_name, force_overwrite=wipe_existing)
print()
# Step 3: Generate batch file
# Step 3: Generate batch file (only if needed)
batch_file = self.generate_batch_file(
project_name, copied_l5x.name, compilation_options
project_name, copied_l5x.name, compilation_options, force_regenerate=wipe_existing
)
print()
@ -354,11 +429,11 @@ def main():
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Setup compilation for MCM01 project
# Setup compilation for MCM01 project (smart replace mode - default)
python compilation_manager.py --project MTN6_MCM01_UL1_UL3 --l5x-file "../IO Tree Configuration Generator/generated_projects/MTN6_MCM01_UL1_UL3.L5X"
# Setup compilation for MCM04 project
python compilation_manager.py --project MTN6_MCM04_CHUTE_LOAD --l5x-file "../IO Tree Configuration Generator/generated_projects/MTN6_MCM04_CHUTE_LOAD.L5X"
# Setup compilation with old wipe behavior
python compilation_manager.py --project MTN6_MCM04_CHUTE_LOAD --l5x-file "../IO Tree Configuration Generator/generated_projects/MTN6_MCM04_CHUTE_LOAD.L5X" --wipe
# Wipe only (no setup)
python compilation_manager.py --wipe-only
@ -374,12 +449,10 @@ Examples:
help='Compilation directory (default: current directory)')
parser.add_argument('--wipe-only', action='store_true',
help='Only wipe existing files, do not setup compilation')
parser.add_argument('--no-wipe', action='store_true',
help='Do not wipe existing files before setup')
parser.add_argument('--enable-safety-validation', action='store_true',
help='Enable safety validation for MCM01 projects')
parser.add_argument('--enable-feeder-optimization', action='store_true',
help='Enable feeder optimization for MCM04 projects')
parser.add_argument('--wipe', action='store_true',
help='Use old wipe behavior (remove all files before setup)')
parser.add_argument('--no-clean', action='store_true',
help='Do not clean any existing files before setup')
args = parser.parse_args()
@ -408,18 +481,16 @@ Examples:
return 1
# Setup compilation options
options = {
'enable_safety_validation': args.enable_safety_validation,
'enable_feeder_optimization': args.enable_feeder_optimization
}
options = {}
try:
# Setup compilation
# Setup compilation with new smart replace mode
result = manager.setup_compilation(
source_l5x=args.l5x_file,
project_name=args.project,
compilation_options=options,
wipe_existing=not args.no_wipe
wipe_existing=args.wipe,
replace_mode=not args.no_clean and not args.wipe
)
print("🎉 Ready for Windows compilation!")

View File

@ -1,7 +1,6 @@
@echo off
echo ====================================
echo PLC Compilation: MTN6_MCM02
echo Project Type: UNKNOWN
echo PLC Compilation: MTN6_MCM06
echo ====================================
echo.
@ -9,8 +8,8 @@ cd /d "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler"
echo Working directory: %CD%
echo.
if not exist "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X" (
echo ERROR: L5X file not found: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X
if not exist "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X" (
echo ERROR: L5X file not found: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X
pause
exit /b 1
)
@ -61,28 +60,28 @@ if errorlevel 1 (
echo ✓ Logix Designer SDK found
echo.
echo Input L5X file: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X
for %%F in ("C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X") do echo File size: %%~zF bytes
echo Input L5X file: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X
for %%F in ("C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X") do echo File size: %%~zF bytes
echo.
echo Starting compilation...
echo Command: py -3.12 l5x_to_acd.py "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X"
echo Command: py -3.12 l5x_to_acd.py "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X"
echo.
py -3.12 l5x_to_acd.py "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.L5X"
py -3.12 l5x_to_acd.py "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.L5X"
if exist "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.ACD" (
if exist "C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.ACD" (
echo.
echo ====================================
echo SUCCESS: Compilation completed!
echo Output: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.ACD
for %%F in ("C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.ACD") do echo ACD size: %%~zF bytes
echo Output: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.ACD
for %%F in ("C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.ACD") do echo ACD size: %%~zF bytes
echo ====================================
) else (
echo.
echo ====================================
echo ERROR: Compilation failed!
echo Expected output: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM02.ACD
echo Expected output: C:\Users\ilia.gurielidze\Projects\PLC Generation\L5X2ACD Compiler\MTN6_MCM06.ACD
echo ====================================
)

View File

@ -2,7 +2,7 @@
"files": {
"excel_file": "DESC_IP_MERGED.xlsx",
"output_dir": ".",
"zones_file": "zones.json",
"zones_file": "MTN6_zones.json",
"safety_l5x": "SafetyProgram_Generated.L5X",
"main_l5x": "MainProgram_Generated.L5X",
"mapping_txt": "SafetyTagMapping.txt"
@ -47,7 +47,7 @@
{
"name": "fiom",
"plugin": "fiom",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 50,
"params": {}
@ -79,7 +79,7 @@
{
"name": "flow_ctrl",
"plugin": "flow_ctrl",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 90,
"params": {}
@ -119,15 +119,39 @@
{
"name": "station_jr_pb",
"plugin": "station_jr_pb",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 140,
"params": {}
},
{
"name": "station_s_pb",
"plugin": "station_s_pb",
"enabled": true,
"program": "MainProgram",
"order": 141,
"params": {}
},
{
"name": "station_ss_pb",
"plugin": "station_ss_pb",
"enabled": true,
"program": "MainProgram",
"order": 142,
"params": {}
},
{
"name": "station_epc",
"plugin": "station_epc",
"enabled": true,
"program": "MainProgram",
"order": 143,
"params": {}
},
{
"name": "jpe",
"plugin": "jpe",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 150,
"params": {}
@ -143,7 +167,7 @@
{
"name": "pmm",
"plugin": "pmm",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 170,
"params": {}
@ -151,11 +175,19 @@
{
"name": "cb_monitor",
"plugin": "cb_monitor",
"enabled": false,
"enabled": true,
"program": "MainProgram",
"order": 180,
"params": {}
},
{
"name": "encoder",
"plugin": "encoder",
"enabled": true,
"program": "MainProgram",
"order": 125,
"params": {}
},
{
"name": "inputs",
"plugin": "inputs",
@ -211,6 +243,22 @@
"program": "MainProgram",
"order": 130,
"params": {}
},
{
"name": "taching_belts",
"plugin": "taching_belts",
"enabled": false,
"program": "MainProgram",
"order": 200,
"params": {}
},
{
"name": "belt_tracking",
"plugin": "belt_tracking",
"enabled": true,
"program": "MainProgram",
"order": 210,
"params": {}
}
],
"xml": {
@ -299,13 +347,51 @@
"jr1_exclude_tokens": [],
"vfd_prefix_regex": "",
"vfd_suffix_default": "_VFD1",
"jpe_include_tokens": [ "TPE" ],
"jpe_include_tokens": [ "TPE","JPE" ],
"jpe_exclude_tokens": [ ],
"jpe_input_default": "",
"jpe_lane_jr_mappings": {
"UL1": {
"start": "UL1_1",
"stop": "UL1_13",
"jr_station": "UL1_9_JR1_PB"
},
"UL2": {
"start": "UL2_1",
"stop": "UL2_10",
"jr_station": "UL1_9_JR1_PB"
},
"UL3": {
"start": "UL3_1",
"stop": "UL3_9",
"jr_station": "UL1_9_JR1_PB"
}
},
"jpe_lane_beacon_mappings": {
"UL1": {
"start": "UL1_1",
"stop": "UL1_13",
"beacon_output": "UL1_9_VFD1:O.IO_0"
},
"UL2": {
"start": "UL2_1",
"stop": "UL2_10",
"beacon_output": "UL1_9_VFD1:O.IO_0"
},
"UL3": {
"start": "UL3_1",
"stop": "UL3_9",
"beacon_output": "UL1_9_VFD1:O.IO_0"
}
},
"fpe_include_tokens": [ "FPE", "3CH_PE" ],
"flow_ctrl_vfd_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_VFD\\d+",
"flow_ctrl_extendo_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_EX\\d+",
"flow_ctrl_chain_order": "natural",
"flow_ctrl_enable_extendo_interlocks": true
"flow_ctrl_enable_extendo_interlocks": true,
"flow_ctrl_cross_lane_interlocks": {
"UL1_9_VFD1": ["UL2_10_VFD1", "UL3_9_VFD1"]
}
}
}

View File

@ -62,13 +62,13 @@ PS1_2_VFD1:I.In_0,PS1_2_VFD1_DISC DISCONNECT AUX,MCM01
PS1_2_VFD1:I.In_1,SPARE,MCM01
PS1_2_VFD1:I.In_2,PS1_2_TPE1 TRACKING PHOTOEYE,MCM01
PS1_2_VFD1:I.In_3,PS1_2_TPE2 TRACKING PHOTOEYE,MCM01
PS1_2_VFD1:O.IO_0,PS1_1_BCN1_R RED BEACON LIGHT,MCM01
PS1_2_VFD1:O.IO_1,PS1_1_BCN2_R RED BEACON LIGHT,MCM01
PS1_2_VFD1:O.IO_0,PS1_1_BCN2_R RED BEACON LIGHT,MCM01
PS1_2_VFD1:O.IO_1,PS1_1_BCN2_H ALARM HORN,MCM01
PS1_2_VFD1:SI.In00Data,SPARE,MCM01
PS1_2_VFD1:SI.In01Data,SPARE,MCM01
PS1_2_VFD1:SI.In02Data,SPARE,MCM01
PS1_2_VFD1:SI.In03Data,SPARE,MCM01
PS1_2_VFD1:SO.Out00Output,SPARE,MCM01
PS1_2_VFD1:SO.Out00Output,PS1_1_BCN1_R RED BEACON LIGHT,MCM01
PS1_3_VFD1:I.In_0,PS1_3_VFD1_DISC DISCONNECT AUX,MCM01
PS1_3_VFD1:I.In_1,SPARE,MCM01
PS1_3_VFD1:I.In_2,SPARE,MCM01
@ -173,12 +173,12 @@ UL10_3_VFD1:I.In_1,SPARE,MCM01
UL10_3_VFD1:I.In_2,UL10_3_TPE1 TRACKING PHOTOEYE,MCM01
UL10_3_VFD1:I.In_3,SPARE,MCM01
UL10_3_VFD1:O.IO_0,UL10_3_BCN1_R RED BEACON LIGHT,MCM01
UL10_3_VFD1:O.IO_1,UL10_3_BCN2_R RED BEACON LIGHT,MCM01
UL10_3_VFD1:O.IO_1,UL10_3_BCN1_H ALARM HORN,MCM01
UL10_3_VFD1:SI.In00Data,UL10_3_EPC1 E-STOP PULLCORD,MCM01
UL10_3_VFD1:SI.In01Data,UL10_3_EPC1_2 E-STOP PULLCORD,MCM01
UL10_3_VFD1:SI.In02Data,UL10_3_EPC2 E-STOP PULLCORD,MCM01
UL10_3_VFD1:SI.In03Data,UL10_3_EPC2_2 E-STOP PULLCORD,MCM01
UL10_3_VFD1:SO.Out00Output,SPARE,MCM01
UL10_3_VFD1:SO.Out00Output,UL10_3_BCN2_R RED BEACON LIGHT,MCM01
UL11_11_VFD1:I.In_0,UL11_11_VFD1_DISC DISCONNECT AUX,MCM01
UL11_11_VFD1:I.In_1,UL11_11_ENC1 ENCODER,MCM01
UL11_11_VFD1:I.In_2,UL11_11_TPE1 TRACKING PHOTOEYE,MCM01
@ -530,7 +530,7 @@ PS3_12_VFD1:SI.In00Data,PS3_12_EPC1 E-STOP PULLCORD,MCM01
PS3_12_VFD1:SI.In01Data,PS3_12_EPC1_2 E-STOP PULLCORD,MCM01
PS3_12_VFD1:SI.In02Data,PS3_12_EPC2 E-STOP PULLCORD,MCM01
PS3_12_VFD1:SI.In03Data,PS3_12_EPC2_2 E-STOP PULLCORD,MCM01
PS3_12_VFD1:SO.Out00Output,PS3_12_BCN1_R RED BEACON LIGHT,MCM01
PS3_12_VFD1:SO.Out00Output,SPARE,MCM01
PS3_2_VFD1:I.In_0,PS3_2_VFD1_DISC DISCONNECT AUX,MCM01
PS3_2_VFD1:I.In_1,SPARE,MCM01
PS3_2_VFD1:I.In_2,PS3_2_TPE1 TRACKING PHOTOEYE,MCM01
@ -544,15 +544,15 @@ PS3_2_VFD1:SI.In03Data,SPARE,MCM01
PS3_2_VFD1:SO.Out00Output,SPARE,MCM01
PS3_3_VFD1:I.In_0,PS3_3_VFD1_DISC DISCONNECT AUX,MCM01
PS3_3_VFD1:I.In_1,SPARE,MCM01
PS3_3_VFD1:I.In_2,PS3_3_TPE2 TRACKING PHOTOEYE,MCM01
PS3_3_VFD1:I.In_2,PS3_3_TPE1 TRACKING PHOTOEYE,MCM01
PS3_3_VFD1:I.In_3,SPARE,MCM01
PS3_3_VFD1:I.IO_0,PS3_1_S2_PB START PUSHBUTTON,MCM01
PS3_3_VFD1:O.IO_1,PS3_1_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
PS3_3_VFD1:SI.In00Data,PS3_3_BCN1_A AMBER BEACON LIGHT,MCM01
PS3_3_VFD1:SI.In00Data,SPARE,MCM01
PS3_3_VFD1:SI.In01Data,SPARE,MCM01
PS3_3_VFD1:SI.In02Data,SPARE,MCM01
PS3_3_VFD1:SI.In03Data,SPARE,MCM01
PS3_3_VFD1:SO.Out00Output,SPARE,MCM01
PS3_3_VFD1:SO.Out00Output,PS3_3_BCN1_A AMBER BEACON LIGHT,MCM01
PS3_8_VFD1:I.In_0,PS3_8_VFD1_DISC DISCONNECT AUX,MCM01
PS3_8_VFD1:I.In_1,SPARE,MCM01
PS3_8_VFD1:I.In_2,SPARE,MCM01
@ -607,7 +607,7 @@ PS4_2_VFD1:SI.In00Data,SPARE,MCM01
PS4_2_VFD1:SI.In01Data,SPARE,MCM01
PS4_2_VFD1:SI.In02Data,SPARE,MCM01
PS4_2_VFD1:SI.In03Data,SPARE,MCM01
PS4_2_VFD1:SO.Out00Output,PS4_2_BCN1_A AMBER BEACON LIGHT,MCM01
PS4_2_VFD1:SO.Out00Output,SPARE,MCM01
PS4_4_VFD1:I.In_0,PS4_4_VFD1_DISC DISCONNECT AUX,MCM01
PS4_4_VFD1:I.In_1,SPARE,MCM01
PS4_4_VFD1:I.In_2,PS4_4_TPE1 TRACKING PHOTOEYE,MCM01
@ -697,9 +697,9 @@ UL10_9_VFD1:SI.In02Data,SPARE,MCM01
UL10_9_VFD1:SI.In03Data,SPARE,MCM01
UL10_9_VFD1:SO.Out00Output,SPARE,MCM01
UL11_10A_VFD1:I.In_0,UL11_10A_VFD1_DISC DISCONNECT AUX,MCM01
UL11_10A_VFD1:I.In_1,UL11_9_TPE4 TRACKING PHOTOEYE,MCM01
UL11_10A_VFD1:I.In_2,UL11_9_TPE5 TRACKING PHOTOEYE,MCM01
UL11_10A_VFD1:I.In_3,SPARE,MCM01
UL11_10A_VFD1:I.In_1,SPARE,MCM01
UL11_10A_VFD1:I.In_2,UL11_9_TPE4 TRACKING PHOTOEYE,MCM01
UL11_10A_VFD1:I.In_3,UL11_9_TPE5 TRACKING PHOTOEYE,MCM01
UL11_10A_VFD1:I.IO_0,UL11_9_S1_PB START PUSHBUTTON,MCM01
UL11_10A_VFD1:O.IO_1,UL11_9_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL11_10A_VFD1:SI.In00Data,SPARE,MCM01
@ -1292,7 +1292,7 @@ PS1_5_VFD1:SI.In03Data,PS1_5_EPC2_2 E-STOP PULLCORD,MCM01
PS1_5_VFD1:SO.Out00Output,PS1_5_BCN1_R RED BEACON LIGHT,MCM01
PS2_3_VFD1:I.In_0,PS2_3_VFD1_DISC DISCONNECT AUX,MCM01
PS2_3_VFD1:I.In_1,SPARE,MCM01
PS2_3_VFD1:I.In_2,PS2_3_TPE2 TRACKING PHOTOEYE,MCM01
PS2_3_VFD1:I.In_2,PS2_3_TPE1 TRACKING PHOTOEYE,MCM01
PS2_3_VFD1:I.In_3,SPARE,MCM01
PS2_3_VFD1:I.IO_0,PS2_1_S2_PB START PUSHBUTTON,MCM01
PS2_3_VFD1:O.IO_1,PS2_1_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
@ -1338,8 +1338,8 @@ PS3_9_VFD1:I.In_0,PS3_9_VFD1_DISC DISCONNECT AUX,MCM01
PS3_9_VFD1:I.In_1,SPARE,MCM01
PS3_9_VFD1:I.In_2,PS3_9_TPE1 TRACKING PHOTOEYE,MCM01
PS3_9_VFD1:I.In_3,PS3_9_TPE2 TRACKING PHOTOEYE,MCM01
PS3_9_VFD1:I.IO_0,SPARE,MCM01
PS3_9_VFD1:I.IO_1,SPARE,MCM01
PS3_9_VFD1:O.IO_0,PS3_12_BCN1_R RED BEACON LIGHT,MCM01
PS3_9_VFD1:O.IO_1,PS3_12_BCN1_H ALARM HORN,MCM01
PS3_9_VFD1:SI.In00Data,SPARE,MCM01
PS3_9_VFD1:SI.In01Data,SPARE,MCM01
PS3_9_VFD1:SI.In02Data,SPARE,MCM01
@ -1360,8 +1360,8 @@ PS4_5_VFD1:I.In_0,PS4_5_VFD1_DISC DISCONNECT AUX,MCM01
PS4_5_VFD1:I.In_1,SPARE,MCM01
PS4_5_VFD1:I.In_2,PS4_5_TPE1 TRACKING PHOTOEYE,MCM01
PS4_5_VFD1:I.In_3,SPARE,MCM01
PS4_5_VFD1:I.IO_0,SPARE,MCM01
PS4_5_VFD1:I.IO_1,SPARE,MCM01
PS4_5_VFD1:O.IO_0,PS4_2_BCN1_A AMBER BEACON LIGHT,MCM01
PS4_5_VFD1:O.IO_1,PS4_2_BCN1_H ALARM HORN,MCM01
PS4_5_VFD1:SI.In00Data,SPARE,MCM01
PS4_5_VFD1:SI.In01Data,SPARE,MCM01
PS4_5_VFD1:SI.In02Data,SPARE,MCM01
@ -1380,7 +1380,7 @@ PS4_8_VFD1:SI.In03Data,SPARE,MCM01
PS4_8_VFD1:SO.Out00Output,PS4_8_BCN1_A AMBER BEACON LIGHT,MCM01
UL11_13_VFD1:I.In_0,UL11_13_VFD1_DISC DISCONNECT AUX,MCM01
UL11_13_VFD1:I.In_1,SPARE,MCM01
UL11_13_VFD1:I.In_2,UL11_13_TPE1 TRACKING PHOTOEYE,MCM01
UL11_13_VFD1:I.In_2,UL11_13_ENC1 FLOW SPLITTER ENCODER,MCM01
UL11_13_VFD1:I.In_3,SPARE,MCM01
UL11_13_VFD1:I.IO_0,SPARE,MCM01
UL11_13_VFD1:I.IO_1,SPARE,MCM01
@ -1399,7 +1399,7 @@ UL11_3_VFD1:SI.In00Data,UL11_3_EPC1 E-STOP PULLCORD,MCM01
UL11_3_VFD1:SI.In01Data,UL11_3_EPC1_2 E-STOP PULLCORD,MCM01
UL11_3_VFD1:SI.In02Data,UL11_3_EPC2 E-STOP PULLCORD,MCM01
UL11_3_VFD1:SI.In03Data,UL11_3_EPC2_2 E-STOP PULLCORD,MCM01
UL11_3_VFD1:SO.Out00Output,SPARE,MCM01
UL11_3_VFD1:SO.Out00Output,UL11_1_STO1 E-STOP OK,MCM01
UL11_4_VFD1:I.In_0,UL11_4_VFD1_DISC DISCONNECT AUX,MCM01
UL11_4_VFD1:I.In_1,SPARE,MCM01
UL11_4_VFD1:I.In_2,UL11_4_TPE1 TRACKING PHOTOEYE,MCM01
@ -1410,7 +1410,7 @@ UL11_4_VFD1:SI.In00Data,UL11_4_EPC1 E-STOP PULLCORD,MCM01
UL11_4_VFD1:SI.In01Data,UL11_4_EPC1_2 E-STOP PULLCORD,MCM01
UL11_4_VFD1:SI.In02Data,UL11_4_EPC2 E-STOP PULLCORD,MCM01
UL11_4_VFD1:SI.In03Data,UL11_4_EPC2_2 E-STOP PULLCORD,MCM01
UL11_4_VFD1:SO.Out00Output,UL11_1_STO1 E-STOP OK,MCM01
UL11_4_VFD1:SO.Out00Output,SPARE,MCM01
UL11_9_VFD1:I.In_0,UL11_9_VFD1_DISC DISCONNECT AUX,MCM01
UL11_9_VFD1:I.In_1,UL11_9_ENC1 ENCODER,MCM01
UL11_9_VFD1:I.In_2,UL11_9_TPE1 TRACKING PHOTOEYE,MCM01
@ -1446,7 +1446,7 @@ UL12_4_VFD1:SI.In03Data,UL12_4_EPC2_2 E-STOP PULLCORD,MCM01
UL12_4_VFD1:SO.Out00Output,SPARE,MCM01
UL1_13_VFD1:I.In_0,UL1_13_VFD1_DISC DISCONNECT AUX,MCM01
UL1_13_VFD1:I.In_1,SPARE,MCM01
UL1_13_VFD1:I.In_2,SPARE,MCM01
UL1_13_VFD1:I.In_2,UL1_13_ENC1 FLOW SPLITTER ENCODER,MCM01
UL1_13_VFD1:I.In_3,SPARE,MCM01
UL1_13_VFD1:I.IO_0,SPARE,MCM01
UL1_13_VFD1:I.IO_1,SPARE,MCM01
@ -1512,7 +1512,7 @@ UL2_4_VFD1:SI.In03Data,UL2_4_EPC2_2 E-STOP PULLCORD,MCM01
UL2_4_VFD1:SO.Out00Output,SPARE,MCM01
UL4_13_VFD1:I.In_0,UL4_13_VFD1_DISC DISCONNECT AUX,MCM01
UL4_13_VFD1:I.In_1,SPARE,MCM01
UL4_13_VFD1:I.In_2,SPARE,MCM01
UL4_13_VFD1:I.In_2,UL4_13_ENC1 FLOW SPLITTER ENCODER,MCM01
UL4_13_VFD1:I.In_3,SPARE,MCM01
UL4_13_VFD1:I.IO_0,SPARE,MCM01
UL4_13_VFD1:I.IO_1,SPARE,MCM01
@ -1536,13 +1536,13 @@ UL4_4_VFD1:I.In_0,UL4_4_VFD1_DISC DISCONNECT AUX,MCM01
UL4_4_VFD1:I.In_1,UL4_4_ENC1 ENCODER,MCM01
UL4_4_VFD1:I.In_2,UL4_4_TPE1 TRACKING PHOTOEYE,MCM01
UL4_4_VFD1:I.In_3,SPARE,MCM01
UL4_4_VFD1:O.IO_0,UL4_4_BCN1_R RED BEACON LIGHT,MCM01
UL4_4_VFD1:O.IO_1,UL4_4_BCN2_R RED BEACON LIGHT,MCM01
UL4_4_VFD1:O.IO_0,UL4_4_BCN2_R RED BEACON LIGHT,MCM01
UL4_4_VFD1:O.IO_1,UL4_4_BCN2_H ALARM HORN,MCM01
UL4_4_VFD1:SI.In00Data,UL4_4_EPC1 E-STOP PULLCORD,MCM01
UL4_4_VFD1:SI.In01Data,UL4_4_EPC1_2 E-STOP PULLCORD,MCM01
UL4_4_VFD1:SI.In02Data,UL4_4_EPC2 E-STOP PULLCORD,MCM01
UL4_4_VFD1:SI.In03Data,UL4_4_EPC2_2 E-STOP PULLCORD,MCM01
UL4_4_VFD1:SO.Out00Output,SPARE,MCM01
UL4_4_VFD1:SO.Out00Output,UL4_4_BCN1_R RED BEACON LIGHT,MCM01
UL4_9_VFD1:I.In_0,UL4_9_VFD1_DISC DISCONNECT AUX,MCM01
UL4_9_VFD1:I.In_1,UL4_9_ENC1 ENCODER,MCM01
UL4_9_VFD1:I.In_2,UL4_9_TPE1 TRACKING PHOTOEYE,MCM01
@ -1578,7 +1578,7 @@ UL5_4_VFD1:SI.In03Data,UL5_4_EPC2_2 E-STOP PULLCORD,MCM01
UL5_4_VFD1:SO.Out00Output,SPARE,MCM01
UL7_13_VFD1:I.In_0,UL7_13_VFD1_DISC DISCONNECT AUX,MCM01
UL7_13_VFD1:I.In_1,SPARE,MCM01
UL7_13_VFD1:I.In_2,SPARE,MCM01
UL7_13_VFD1:I.In_2,UL7_13_ENC1 FLOW SPLITTER ENCODER,MCM01
UL7_13_VFD1:I.In_3,SPARE,MCM01
UL7_13_VFD1:I.IO_0,SPARE,MCM01
UL7_13_VFD1:I.IO_1,SPARE,MCM01
@ -1630,7 +1630,7 @@ UL9_3_VFD1:SI.In00Data,UL9_3_EPC1 E-STOP PULLCORD,MCM01
UL9_3_VFD1:SI.In01Data,UL9_3_EPC1_2 E-STOP PULLCORD,MCM01
UL9_3_VFD1:SI.In02Data,UL9_3_EPC2 E-STOP PULLCORD,MCM01
UL9_3_VFD1:SI.In03Data,UL9_3_EPC2_2 E-STOP PULLCORD,MCM01
UL9_3_VFD1:SO.Out00Output,SPARE,MCM01
UL9_3_VFD1:SO.Out00Output,UL9_1_STO1 E-STOP OK,MCM01
UL9_4_VFD1:I.In_0,UL9_4_VFD1_DISC DISCONNECT AUX,MCM01
UL9_4_VFD1:I.In_1,UL9_4_ENC1 ENCODER,MCM01
UL9_4_VFD1:I.In_2,UL9_4_TPE1 TRACKING PHOTOEYE,MCM01
@ -1641,7 +1641,7 @@ UL9_4_VFD1:SI.In00Data,UL9_4_EPC1 E-STOP PULLCORD,MCM01
UL9_4_VFD1:SI.In01Data,UL9_4_EPC1_2 E-STOP PULLCORD,MCM01
UL9_4_VFD1:SI.In02Data,UL9_4_EPC2 E-STOP PULLCORD,MCM01
UL9_4_VFD1:SI.In03Data,UL9_4_EPC2_2 E-STOP PULLCORD,MCM01
UL9_4_VFD1:SO.Out00Output,UL9_1_STO1 E-STOP OK,MCM01
UL9_4_VFD1:SO.Out00Output,SPARE,MCM01
PS1_4_VFD1:I.In_0,PS1_4_VFD1_DISC DISCONNECT AUX,MCM01
PS1_4_VFD1:I.In_1,SPARE,MCM01
PS1_4_VFD1:I.In_2,PS1_4_TPE1 TRACKING PHOTOEYE,MCM01
@ -1752,301 +1752,355 @@ PS4_10_VFD1:SI.In01Data,SPARE,MCM01
PS4_10_VFD1:SI.In02Data,SPARE,MCM01
PS4_10_VFD1:SI.In03Data,SPARE,MCM01
PS4_10_VFD1:SO.Out00Output,SPARE,MCM01
PDP1_FIO1:I.Pt00.Data,PDP1_CB1 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt01.Data,PDP1_CB2 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt02.Data,PDP1_CB3 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt03.Data,PDP1_CB4 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt04.Data,PDP1_CB5 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:O.Pt05.Data,SPARE,MCM01
PDP1_FIO1:I.Pt06.Data,PDP1_CB6 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:O.Pt07.Data,SPARE,MCM01
PDP1_FIO1:I.Pt08.Data,PDP1_CB7 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt09.Data,PDP1_CB8 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt10.Data,PDP1_CB9 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt11.Data,PDP1_CB10 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIO1:I.Pt12.Data,PDP1_PWM1 PHASE MONITOR,MCM01
PDP1_FIO1:O.Pt13.Data,SPARE,MCM01
PDP2_FIO1:I.Pt00.Data,PDP2_CB1 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt01.Data,PDP2_CB2 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt02.Data,PDP2_CB3 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt03.Data,PDP2_CB4 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt04.Data,PDP2_CB5 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:O.Pt05.Data,SPARE,MCM01
PDP2_FIO1:I.Pt06.Data,PDP2_CB6 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:O.Pt07.Data,SPARE,MCM01
PDP2_FIO1:I.Pt08.Data,PDP2_CB7 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt09.Data,PDP2_CB8 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt10.Data,PDP2_CB9 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt11.Data,PDP2_CB10 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIO1:I.Pt12.Data,PDP2_PWM1 PHASE MONITOR,MCM01
PDP2_FIO1:O.Pt13.Data,SPARE,MCM01
PDP6_FIO1:I.Pt00.Data,PDP6_CB1 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt01.Data,PDP6_CB2 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt02.Data,PDP6_CB3 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt03.Data,PDP6_CB4 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt04.Data,PDP6_CB5 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:O.Pt05.Data,SPARE,MCM01
PDP6_FIO1:I.Pt06.Data,PDP6_CB6 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:O.Pt07.Data,SPARE,MCM01
PDP6_FIO1:I.Pt08.Data,PDP6_CB7 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt09.Data,PDP6_CB8 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt10.Data,PDP6_CB9 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt11.Data,PDP6_CB10 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIO1:I.Pt12.Data,PDP6_PWM1 PHASE MONITOR,MCM01
PDP6_FIO1:O.Pt13.Data,SPARE,MCM01
UL10_2_FIO1:O.Pt00.Data,UL10_1_BCN1_R RED BEACON LIGHT,MCM01
UL10_2_FIO1:I.Pt01.Data,SPARE,MCM01
UL10_2_FIO1:O.Pt02.Data,UL10_1_BCN2_R RED BEACON LIGHT,MCM01
UL10_2_FIO1:I.Pt03.Data,SPARE,MCM01
UL10_2_FIO1:I.Pt04.Data,UL10_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
UL10_2_FIO1:O.Pt05.Data,UL10_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
UL10_2_FIO1:I.Pt06.Data,UL10_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
UL10_2_FIO1:O.Pt07.Data,SPARE,MCM01
UL10_2_FIO1:I.Pt09.Data,SPARE,MCM01
UL10_2_FIO1:I.Pt11.Data,SPARE,MCM01
UL10_2_FIO1:I.Pt12.Data,SPARE,MCM01
UL10_2_FIO1:O.Pt13.Data,SPARE,MCM01
UL10_2_FIO1:I.Pt14.Data,SPARE,MCM01
UL10_2_FIO1:O.Pt15.Data,SPARE,MCM01
UL11_13_FIO1:I.Pt00.Data,UL11_13_PE1 DEBRIS SENSOR,MCM01
UL11_13_FIO1:I.Pt01.Data,SPARE,MCM01
UL11_13_FIO1:I.Pt02.Data,UL11_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
UL11_13_FIO1:I.Pt03.Data,SPARE,MCM01
UL11_13_FIO1:I.Pt08.Data,UL11_13_PE3 ENTRANCE PE,MCM01
UL11_13_FIO1:I.Pt09.Data,SPARE,MCM01
UL11_13_FIO1:I.Pt10.Data,UL11_13_PE4 EXIT PE,MCM01
UL11_13_FIO1:I.Pt11.Data,SPARE,MCM01
UL11_13_FIO1:I.Pt14.Data,UL11_13_PE5 DEBRIS SENSOR,MCM01
UL11_13_FIO1:O.Pt15.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt00.Data,UL11_3_BCN1_R RED BEACON LIGHT,MCM01
UL11_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt02.Data,UL11_3_BCN2_R RED BEACON LIGHT,MCM01
UL11_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL11_3_FIO1:I.Pt08.Data,UL11_3_S1_PB START PUSHBUTTON,MCM01
UL11_3_FIO1:O.Pt09.Data,UL11_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL11_3_FIO1:I.Pt10.Data,UL11_3_S2_PB START PUSHBUTTON,MCM01
UL11_3_FIO1:O.Pt11.Data,UL11_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL11_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL11_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL11_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt00.Data,UL12_3_BCN1_R RED BEACON LIGHT,MCM01
UL12_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt02.Data,UL12_3_BCN2_R RED BEACON LIGHT,MCM01
UL12_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL12_3_FIO1:I.Pt08.Data,UL12_3_S1_PB START PUSHBUTTON,MCM01
UL12_3_FIO1:O.Pt09.Data,UL12_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL12_3_FIO1:I.Pt10.Data,UL12_3_S2_PB START PUSHBUTTON,MCM01
UL12_3_FIO1:O.Pt11.Data,UL12_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL12_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL12_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL12_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL1_13_FIO1:I.Pt00.Data,UL1_13_PE1 DEBRIS SENSOR,MCM01
UL1_13_FIO1:I.Pt01.Data,SPARE,MCM01
UL1_13_FIO1:I.Pt02.Data,UL1_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
UL1_13_FIO1:I.Pt03.Data,SPARE,MCM01
UL1_13_FIO1:I.Pt08.Data,UL1_13_PE3 ENTRANCE PE,MCM01
UL1_13_FIO1:I.Pt09.Data,SPARE,MCM01
UL1_13_FIO1:I.Pt10.Data,UL1_13_PE4 EXIT PE,MCM01
UL1_13_FIO1:I.Pt11.Data,SPARE,MCM01
UL1_13_FIO1:I.Pt14.Data,UL1_13_PE5 DEBRIS SENSOR,MCM01
UL1_13_FIO1:O.Pt15.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt00.Data,UL1_3_BCN1_R RED BEACON LIGHT,MCM01
UL1_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt02.Data,UL1_3_BCN2_R RED BEACON LIGHT,MCM01
UL1_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL1_3_FIO1:I.Pt08.Data,UL1_3_S1_PB START PUSHBUTTON,MCM01
UL1_3_FIO1:O.Pt09.Data,UL1_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL1_3_FIO1:I.Pt10.Data,UL1_3_S2_PB START PUSHBUTTON,MCM01
UL1_3_FIO1:O.Pt11.Data,UL1_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL1_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL1_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL1_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt00.Data,UL2_3_BCN1_R RED BEACON LIGHT,MCM01
UL2_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt02.Data,UL2_3_BCN2_R RED BEACON LIGHT,MCM01
UL2_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL2_3_FIO1:I.Pt08.Data,UL2_3_S1_PB START PUSHBUTTON,MCM01
UL2_3_FIO1:O.Pt09.Data,UL2_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL2_3_FIO1:I.Pt10.Data,UL2_3_S2_PB START PUSHBUTTON,MCM01
UL2_3_FIO1:O.Pt11.Data,UL2_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL2_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL2_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL2_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL3_2_FIO1:O.Pt00.Data,UL3_1_BCN1_R RED BEACON LIGHT,MCM01
UL3_2_FIO1:O.Pt01.Data,UL3_1_BCN2_R RED BEACON LIGHT,MCM01
UL3_2_FIO1:I.Pt02.Data,UL3_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
UL3_2_FIO1:O.Pt03.Data,UL3_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
UL3_2_FIO1:I.Pt04.Data,UL3_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
UL3_2_FIO1:O.Pt05.Data,SPARE,MCM01
UL3_2_FIO1:O.Pt07.Data,SPARE,MCM01
UL3_2_FIO1:I.Pt09.Data,SPARE,MCM01
UL3_2_FIO1:O.Pt10.Data,UL3_2_BCN1_R RED BEACON LIGHT,MCM01
UL3_2_FIO1:O.Pt11.Data,UL3_2_BCN2_R RED BEACON LIGHT,MCM01
UL3_2_FIO1:I.Pt12.Data,UL3_2_S1_PB START PUSHBUTTON,MCM01
UL3_2_FIO1:O.Pt13.Data,UL3_2_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL3_2_FIO1:I.Pt14.Data,UL3_2_S2_PB START PUSHBUTTON,MCM01
UL3_2_FIO1:O.Pt15.Data,UL3_2_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL4_13_FIO1:I.Pt00.Data,UL4_13_PE1 DEBRIS SENSOR,MCM01
UL4_13_FIO1:I.Pt01.Data,SPARE,MCM01
UL4_13_FIO1:I.Pt02.Data,UL4_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
UL4_13_FIO1:I.Pt03.Data,SPARE,MCM01
UL4_13_FIO1:I.Pt08.Data,UL4_13_PE3 ENTRANCE PE,MCM01
UL4_13_FIO1:I.Pt09.Data,SPARE,MCM01
UL4_13_FIO1:I.Pt10.Data,UL4_13_PE4 EXIT PE,MCM01
UL4_13_FIO1:I.Pt11.Data,SPARE,MCM01
UL4_13_FIO1:I.Pt14.Data,UL4_13_PE5 DEBRIS SENSOR,MCM01
UL4_13_FIO1:O.Pt15.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt00.Data,UL4_3_BCN1_R RED BEACON LIGHT,MCM01
UL4_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt02.Data,UL4_3_BCN2_R RED BEACON LIGHT,MCM01
UL4_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL4_3_FIO1:I.Pt08.Data,UL4_3_S1_PB START PUSHBUTTON,MCM01
UL4_3_FIO1:O.Pt09.Data,UL4_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL4_3_FIO1:I.Pt10.Data,UL4_3_S2_PB START PUSHBUTTON,MCM01
UL4_3_FIO1:O.Pt11.Data,UL4_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL4_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL4_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL4_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt00.Data,UL5_3_BCN1_R RED BEACON LIGHT,MCM01
UL5_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt02.Data,UL5_3_BCN2_R RED BEACON LIGHT,MCM01
UL5_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL5_3_FIO1:I.Pt08.Data,UL5_3_S1_PB START PUSHBUTTON,MCM01
UL5_3_FIO1:O.Pt09.Data,UL5_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL5_3_FIO1:I.Pt10.Data,UL5_3_S2_PB START PUSHBUTTON,MCM01
UL5_3_FIO1:O.Pt11.Data,UL5_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL5_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL5_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL5_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL6_2_FIO1:O.Pt00.Data,UL6_1_BCN1_R RED BEACON LIGHT,MCM01
UL6_2_FIO1:O.Pt01.Data,UL6_1_BCN2_R RED BEACON LIGHT,MCM01
UL6_2_FIO1:I.Pt02.Data,UL6_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
UL6_2_FIO1:O.Pt03.Data,UL6_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
UL6_2_FIO1:I.Pt04.Data,UL6_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
UL6_2_FIO1:O.Pt05.Data,SPARE,MCM01
UL6_2_FIO1:O.Pt06.Data,UL6_2_BCN1_R RED BEACON LIGHT,MCM01
UL6_2_FIO1:O.Pt07.Data,UL6_2_BCN2_R RED BEACON LIGHT,MCM01
UL6_2_FIO1:I.Pt09.Data,SPARE,MCM01
UL6_2_FIO1:I.Pt11.Data,SPARE,MCM01
UL6_2_FIO1:I.Pt12.Data,UL6_2_S1_PB START PUSHBUTTON,MCM01
UL6_2_FIO1:O.Pt13.Data,UL6_2_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL6_2_FIO1:I.Pt14.Data,UL6_2_S2_PB START PUSHBUTTON,MCM01
UL6_2_FIO1:O.Pt15.Data,UL6_2_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL7_13_FIO1:I.Pt00.Data,UL7_13_PE1 DEBRIS SENSOR,MCM01
UL7_13_FIO1:I.Pt01.Data,SPARE,MCM01
UL7_13_FIO1:I.Pt02.Data,UL7_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
UL7_13_FIO1:I.Pt03.Data,SPARE,MCM01
UL7_13_FIO1:I.Pt08.Data,UL7_13_PE3 ENTRANCE PE,MCM01
UL7_13_FIO1:I.Pt09.Data,SPARE,MCM01
UL7_13_FIO1:I.Pt10.Data,UL7_13_PE4 EXIT PE,MCM01
UL7_13_FIO1:I.Pt11.Data,SPARE,MCM01
UL7_13_FIO1:I.Pt14.Data,UL7_13_PE5 DEBRIS SENSOR,MCM01
UL7_13_FIO1:O.Pt15.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt00.Data,UL7_3_BCN1_R RED BEACON LIGHT,MCM01
UL7_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt02.Data,UL7_3_BCN2_R RED BEACON LIGHT,MCM01
UL7_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL7_3_FIO1:I.Pt08.Data,UL7_3_S1_PB START PUSHBUTTON,MCM01
UL7_3_FIO1:O.Pt09.Data,UL7_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL7_3_FIO1:I.Pt10.Data,UL7_3_S2_PB START PUSHBUTTON,MCM01
UL7_3_FIO1:O.Pt11.Data,UL7_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL7_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL7_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL7_3_FIO1:O.Pt15.Data,SPARE,MCM01
UL8_2_FIO1:O.Pt00.Data,UL8_1_BCN1_R RED BEACON LIGHT,MCM01
UL8_2_FIO1:I.Pt01.Data,SPARE,MCM01
UL8_2_FIO1:O.Pt02.Data,UL8_1_BCN2_R RED BEACON LIGHT,MCM01
UL8_2_FIO1:I.Pt03.Data,SPARE,MCM01
UL8_2_FIO1:I.Pt04.Data,UL8_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
UL8_2_FIO1:O.Pt05.Data,UL8_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
UL8_2_FIO1:I.Pt06.Data,UL8_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
UL8_2_FIO1:O.Pt07.Data,SPARE,MCM01
UL8_2_FIO1:I.Pt09.Data,SPARE,MCM01
UL8_2_FIO1:I.Pt11.Data,SPARE,MCM01
UL8_2_FIO1:I.Pt12.Data,SPARE,MCM01
UL8_2_FIO1:O.Pt13.Data,SPARE,MCM01
UL8_2_FIO1:I.Pt14.Data,SPARE,MCM01
UL8_2_FIO1:O.Pt15.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt00.Data,UL9_3_BCN1_R RED BEACON LIGHT,MCM01
UL9_3_FIO1:I.Pt01.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt02.Data,UL9_3_BCN2_R RED BEACON LIGHT,MCM01
UL9_3_FIO1:I.Pt03.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt05.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt07.Data,SPARE,MCM01
UL9_3_FIO1:I.Pt08.Data,UL9_3_S1_PB START PUSHBUTTON,MCM01
UL9_3_FIO1:O.Pt09.Data,UL9_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
UL9_3_FIO1:I.Pt10.Data,UL9_3_S2_PB START PUSHBUTTON,MCM01
UL9_3_FIO1:O.Pt11.Data,UL9_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
UL9_3_FIO1:I.Pt12.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt13.Data,SPARE,MCM01
UL9_3_FIO1:I.Pt14.Data,SPARE,MCM01
UL9_3_FIO1:O.Pt15.Data,SPARE,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4,PDP1_CB11 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2,PDP1_CB12 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4,PDP1_CB13 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2,PDP1_CB14 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4,PDP1_CB15 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2,PDP1_CB16 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4,PDP1_CB17 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2,PDP1_CB18 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4,PDP1_CB19 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2,PDP1_CB20 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4,PDP1_CB21 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2,PDP1_CB22 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4,PDP1_CB23 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2,PDP1_CB24 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4,PDP1_CB25 CIRCUIT BREAKER MONITORING,MCM01
PDP1_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2,PDP1_CB26 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4,PDP2_CB11 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2,PDP2_CB12 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4,PDP2_CB13 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2,PDP2_CB14 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4,PDP2_CB15 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2,PDP2_CB16 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4,PDP2_CB17 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2,PDP2_CB18 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4,PDP2_CB19 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2,PDP2_CB20 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4,PDP2_CB21 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2,PDP2_CB22 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4,PDP2_CB23 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2,PDP2_CB24 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4,PDP2_CB25 CIRCUIT BREAKER MONITORING,MCM01
PDP2_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2,PDP2_CB26 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4,PDP6_CB11 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2,PDP6_CB12 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4,PDP6_CB13 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2,PDP6_CB14 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4,PDP6_CB15 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2,PDP6_CB16 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4,PDP6_CB17 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2,PDP6_CB18 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4,PDP6_CB19 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2,PDP6_CB20 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4,PDP6_CB21 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2,PDP6_CB22 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4,PDP6_CB23 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2,PDP6_CB24 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4,PDP6_CB25 CIRCUIT BREAKER MONITORING,MCM01
PDP6_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2,PDP6_CB26 CIRCUIT BREAKER MONITORING,MCM01
,PDP1_CB1 ,MCM01
,PDP1_CB2,MCM01
,PDP1_CB3,MCM01
,PDP1_CB4,MCM01
,PDP1_CB5,MCM01
,SPARE,MCM01
,PDP1_CB6,MCM01
,SPARE,MCM01
,PDP1_CB7,MCM01
,PDP1_CB8,MCM01
,PDP1_CB9,MCM01
,PDP1_CB10,MCM01
,PDP1_PWM1,MCM01
,SPARE,MCM01
,PDP1_FIOH1,MCM01
,SPARE,MCM01
,PDP2_CB1 ,MCM01
,PDP2_CB2,MCM01
,PDP2_CB3,MCM01
,PDP2_CB4,MCM01
,PDP2_CB5,MCM01
,SPARE,MCM01
,PDP2_CB6,MCM01
,SPARE,MCM01
,PDP2_CB7,MCM01
,PDP2_CB8,MCM01
,PDP2_CB9,MCM01
,PDP2_CB10,MCM01
,PDP2_PWM1,MCM01
,SPARE,MCM01
,PDP2_FIOH1,MCM01
,SPARE,MCM01
,PDP6_CB1 ,MCM01
,PDP6_CB2,MCM01
,PDP6_CB3,MCM01
,PDP6_CB4,MCM01
,PDP6_CB5,MCM01
,SPARE,MCM01
,PDP6_CB6,MCM01
,SPARE,MCM01
,PDP6_CB7,MCM01
,PDP6_CB8,MCM01
,PDP6_CB9,MCM01
,PDP6_CB10,MCM01
,PDP6_PWM1,MCM01
,SPARE,MCM01
,PDP6_FIOH1,MCM01
,SPARE,MCM01
,UL10_1_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL10_1_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL10_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
,UL10_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
,UL10_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
,SPARE,MCM01
,UL10_2_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL10_2_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL11_13_PE1 DEBRIS SENSOR,MCM01
,UL11_13_PE1 SEND,MCM01
,UL11_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
,UL11_13_PE2 SEND,MCM01
,UL11_13_SOL1 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL11_13_SOL2 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL11_13_PE3 ENTRANCE PE,MCM01
,SPARE,MCM01
,UL11_13_PE4 EXIT PE,MCM01
,SPARE,MCM01
,UL11_13_SOL3 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL11_13_PE5 DEBRIS SENSOR,MCM01
,UL11_13_PE5 SEND,MCM01
,UL11_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL11_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL11_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL11_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL11_3_S1_PB START PUSHBUTTON,MCM01
,UL11_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL11_3_S2_PB START PUSHBUTTON,MCM01
,UL11_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL12_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL12_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL12_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL12_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL12_3_S1_PB START PUSHBUTTON,MCM01
,UL12_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL12_3_S2_PB START PUSHBUTTON,MCM01
,UL12_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL1_13_PE1 DEBRIS SENSOR,MCM01
,UL1_13_PE1 SEND,MCM01
,UL1_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
,UL1_13_PE2 SEND,MCM01
,UL1_13_SOL1 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL1_13_SOL2 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL1_13_PE3 ENTRANCE PE,MCM01
,SPARE,MCM01
,UL1_13_PE4 EXIT PE,MCM01
,SPARE,MCM01
,UL1_13_SOL3 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL1_13_PE5 DEBRIS SENSOR,MCM01
,UL1_13_PE5 SEND,MCM01
,UL1_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL1_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL1_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL1_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL1_3_S1_PB START PUSHBUTTON,MCM01
,UL1_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL1_3_S2_PB START PUSHBUTTON,MCM01
,UL1_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL2_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL2_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL2_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL2_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL2_3_S1_PB START PUSHBUTTON,MCM01
,UL2_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL2_3_S2_PB START PUSHBUTTON,MCM01
,UL2_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL3_1_BCN1_R RED BEACON LIGHT,MCM01
,UL3_1_BCN2_R RED BEACON LIGHT,MCM01
,UL3_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
,UL3_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
,UL3_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
,SPARE,MCM01
,UL3_2_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL3_2_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL3_2_BCN1_R RED BEACON LIGHT,MCM01
,UL3_2_BCN2_R RED BEACON LIGHT,MCM01
,UL3_2_S1_PB START PUSHBUTTON,MCM01
,UL3_2_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL3_2_S2_PB START PUSHBUTTON,MCM01
,UL3_2_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL4_13_PE1 DEBRIS SENSOR,MCM01
,UL4_13_PE1 SEND,MCM01
,UL4_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
,UL4_13_PE2 SEND,MCM01
,UL4_13_SOL1 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL4_13_SOL2 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL4_13_PE3 ENTRANCE PE,MCM01
,SPARE,MCM01
,UL4_13_PE4 EXIT PE,MCM01
,SPARE,MCM01
,UL4_13_SOL3 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL4_13_PE5 DEBRIS SENSOR,MCM01
,UL4_13_PE5 SEND,MCM01
,UL4_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL4_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL4_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL4_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL4_3_S1_PB START PUSHBUTTON,MCM01
,UL4_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL4_3_S2_PB START PUSHBUTTON,MCM01
,UL4_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL5_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL5_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL5_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL5_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL5_3_S1_PB START PUSHBUTTON,MCM01
,UL5_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL5_3_S2_PB START PUSHBUTTON,MCM01
,UL5_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL6_1_BCN1_R RED BEACON LIGHT,MCM01
,UL6_1_BCN2_R RED BEACON LIGHT,MCM01
,UL6_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
,UL6_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
,UL6_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
,SPARE,MCM01
,UL6_2_BCN1_R RED BEACON LIGHT,MCM01
,UL6_2_BCN2_R RED BEACON LIGHT,MCM01
,UL6_2_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL6_2_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL6_2_S1_PB START PUSHBUTTON,MCM01
,UL6_2_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL6_2_S2_PB START PUSHBUTTON,MCM01
,UL6_2_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL7_13_PE1 DEBRIS SENSOR,MCM01
,UL7_13_PE1 SEND,MCM01
,UL7_13_PE2 BELT ENGAGEMENT SENSOR,MCM01
,UL7_13_PE2 SEND,MCM01
,UL7_13_SOL1 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL7_13_SOL2 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL7_13_PE3 ENTRANCE PE,MCM01
,SPARE,MCM01
,UL7_13_PE4 EXIT PE,MCM01
,SPARE,MCM01
,UL7_13_SOL3 DIVERT MODULE,MCM01
,SPARE,MCM01
,UL7_13_PE5 DEBRIS SENSOR,MCM01
,UL7_13_PE5 SEND,MCM01
,UL7_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL7_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL7_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL7_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL7_3_S1_PB START PUSHBUTTON,MCM01
,UL7_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL7_3_S2_PB START PUSHBUTTON,MCM01
,UL7_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL8_1_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL8_1_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL8_1_SS1_SPB SS STATION START PUSHBUTTON,MCM01
,UL8_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT,MCM01
,UL8_1_SS1_STPB SS STATION STOP PUSHBUTTON,MCM01
,SPARE,MCM01
,UL8_2_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL8_2_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,UL9_3_BCN1_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL9_3_BCN2_R RED BEACON LIGHT,MCM01
,SPARE,MCM01
,UL9_3_LPE1 LASEREYE,MCM01
,SPARE,MCM01
,UL9_3_LPE2 LASEREYE,MCM01
,SPARE,MCM01
,UL9_3_S1_PB START PUSHBUTTON,MCM01
,UL9_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM01
,UL9_3_S2_PB START PUSHBUTTON,MCM01
,UL9_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,SPARE,MCM01
,PDP1_CB17,MCM01
,PDP1_CB18,MCM01
,PDP1_CB25,MCM01
,PDP1_CB26,MCM01
,PDP1_CB15,MCM01
,PDP1_CB16,MCM01
,PDP1_CB23,MCM01
,PDP1_CB24,MCM01
,PDP1_CB13,MCM01
,PDP1_CB14,MCM01
,PDP1_CB21,MCM01
,PDP1_CB22,MCM01
,PDP1_CB11,MCM01
,PDP1_CB12,MCM01
,PDP1_CB19,MCM01
,PDP1_CB20,MCM01
,PDP2_CB17,MCM01
,PDP2_CB18,MCM01
,PDP2_CB25,MCM01
,PDP2_CB26,MCM01
,PDP2_CB15,MCM01
,PDP2_CB16,MCM01
,PDP2_CB23,MCM01
,PDP2_CB24,MCM01
,PDP2_CB13,MCM01
,PDP2_CB14,MCM01
,PDP2_CB21,MCM01
,PDP2_CB22,MCM01
,PDP2_CB11,MCM01
,PDP2_CB12,MCM01
,PDP2_CB19,MCM01
,PDP2_CB20,MCM01
,PDP6_CB17,MCM01
,PDP6_CB18,MCM01
,PDP6_CB25,MCM01
,PDP6_CB26,MCM01
,PDP6_CB15,MCM01
,PDP6_CB16,MCM01
,PDP6_CB23,MCM01
,PDP6_CB24,MCM01
,PDP6_CB13,MCM01
,PDP6_CB14,MCM01
,PDP6_CB21,MCM01
,PDP6_CB22,MCM01
,PDP6_CB11,MCM01
,PDP6_CB12,MCM01
,PDP6_CB19,MCM01
,PDP6_CB20,MCM01

1 Name Description Subsystem
62 PS1_2_VFD1:I.In_1 SPARE MCM01
63 PS1_2_VFD1:I.In_2 PS1_2_TPE1 TRACKING PHOTOEYE MCM01
64 PS1_2_VFD1:I.In_3 PS1_2_TPE2 TRACKING PHOTOEYE MCM01
65 PS1_2_VFD1:O.IO_0 PS1_1_BCN1_R RED BEACON LIGHT PS1_1_BCN2_R RED BEACON LIGHT MCM01
66 PS1_2_VFD1:O.IO_1 PS1_1_BCN2_R RED BEACON LIGHT PS1_1_BCN2_H ALARM HORN MCM01
67 PS1_2_VFD1:SI.In00Data SPARE MCM01
68 PS1_2_VFD1:SI.In01Data SPARE MCM01
69 PS1_2_VFD1:SI.In02Data SPARE MCM01
70 PS1_2_VFD1:SI.In03Data SPARE MCM01
71 PS1_2_VFD1:SO.Out00Output SPARE PS1_1_BCN1_R RED BEACON LIGHT MCM01
72 PS1_3_VFD1:I.In_0 PS1_3_VFD1_DISC DISCONNECT AUX MCM01
73 PS1_3_VFD1:I.In_1 SPARE MCM01
74 PS1_3_VFD1:I.In_2 SPARE MCM01
173 UL10_3_VFD1:I.In_2 UL10_3_TPE1 TRACKING PHOTOEYE MCM01
174 UL10_3_VFD1:I.In_3 SPARE MCM01
175 UL10_3_VFD1:O.IO_0 UL10_3_BCN1_R RED BEACON LIGHT MCM01
176 UL10_3_VFD1:O.IO_1 UL10_3_BCN2_R RED BEACON LIGHT UL10_3_BCN1_H ALARM HORN MCM01
177 UL10_3_VFD1:SI.In00Data UL10_3_EPC1 E-STOP PULLCORD MCM01
178 UL10_3_VFD1:SI.In01Data UL10_3_EPC1_2 E-STOP PULLCORD MCM01
179 UL10_3_VFD1:SI.In02Data UL10_3_EPC2 E-STOP PULLCORD MCM01
180 UL10_3_VFD1:SI.In03Data UL10_3_EPC2_2 E-STOP PULLCORD MCM01
181 UL10_3_VFD1:SO.Out00Output SPARE UL10_3_BCN2_R RED BEACON LIGHT MCM01
182 UL11_11_VFD1:I.In_0 UL11_11_VFD1_DISC DISCONNECT AUX MCM01
183 UL11_11_VFD1:I.In_1 UL11_11_ENC1 ENCODER MCM01
184 UL11_11_VFD1:I.In_2 UL11_11_TPE1 TRACKING PHOTOEYE MCM01
530 PS3_12_VFD1:SI.In01Data PS3_12_EPC1_2 E-STOP PULLCORD MCM01
531 PS3_12_VFD1:SI.In02Data PS3_12_EPC2 E-STOP PULLCORD MCM01
532 PS3_12_VFD1:SI.In03Data PS3_12_EPC2_2 E-STOP PULLCORD MCM01
533 PS3_12_VFD1:SO.Out00Output PS3_12_BCN1_R RED BEACON LIGHT SPARE MCM01
534 PS3_2_VFD1:I.In_0 PS3_2_VFD1_DISC DISCONNECT AUX MCM01
535 PS3_2_VFD1:I.In_1 SPARE MCM01
536 PS3_2_VFD1:I.In_2 PS3_2_TPE1 TRACKING PHOTOEYE MCM01
544 PS3_2_VFD1:SO.Out00Output SPARE MCM01
545 PS3_3_VFD1:I.In_0 PS3_3_VFD1_DISC DISCONNECT AUX MCM01
546 PS3_3_VFD1:I.In_1 SPARE MCM01
547 PS3_3_VFD1:I.In_2 PS3_3_TPE2 TRACKING PHOTOEYE PS3_3_TPE1 TRACKING PHOTOEYE MCM01
548 PS3_3_VFD1:I.In_3 SPARE MCM01
549 PS3_3_VFD1:I.IO_0 PS3_1_S2_PB START PUSHBUTTON MCM01
550 PS3_3_VFD1:O.IO_1 PS3_1_S2_PB_LT START PUSHBUTTON LIGHT MCM01
551 PS3_3_VFD1:SI.In00Data PS3_3_BCN1_A AMBER BEACON LIGHT SPARE MCM01
552 PS3_3_VFD1:SI.In01Data SPARE MCM01
553 PS3_3_VFD1:SI.In02Data SPARE MCM01
554 PS3_3_VFD1:SI.In03Data SPARE MCM01
555 PS3_3_VFD1:SO.Out00Output SPARE PS3_3_BCN1_A AMBER BEACON LIGHT MCM01
556 PS3_8_VFD1:I.In_0 PS3_8_VFD1_DISC DISCONNECT AUX MCM01
557 PS3_8_VFD1:I.In_1 SPARE MCM01
558 PS3_8_VFD1:I.In_2 SPARE MCM01
607 PS4_2_VFD1:SI.In01Data SPARE MCM01
608 PS4_2_VFD1:SI.In02Data SPARE MCM01
609 PS4_2_VFD1:SI.In03Data SPARE MCM01
610 PS4_2_VFD1:SO.Out00Output PS4_2_BCN1_A AMBER BEACON LIGHT SPARE MCM01
611 PS4_4_VFD1:I.In_0 PS4_4_VFD1_DISC DISCONNECT AUX MCM01
612 PS4_4_VFD1:I.In_1 SPARE MCM01
613 PS4_4_VFD1:I.In_2 PS4_4_TPE1 TRACKING PHOTOEYE MCM01
697 UL10_9_VFD1:SI.In03Data SPARE MCM01
698 UL10_9_VFD1:SO.Out00Output SPARE MCM01
699 UL11_10A_VFD1:I.In_0 UL11_10A_VFD1_DISC DISCONNECT AUX MCM01
700 UL11_10A_VFD1:I.In_1 UL11_9_TPE4 TRACKING PHOTOEYE SPARE MCM01
701 UL11_10A_VFD1:I.In_2 UL11_9_TPE5 TRACKING PHOTOEYE UL11_9_TPE4 TRACKING PHOTOEYE MCM01
702 UL11_10A_VFD1:I.In_3 SPARE UL11_9_TPE5 TRACKING PHOTOEYE MCM01
703 UL11_10A_VFD1:I.IO_0 UL11_9_S1_PB START PUSHBUTTON MCM01
704 UL11_10A_VFD1:O.IO_1 UL11_9_S1_PB_LT START PUSHBUTTON LIGHT MCM01
705 UL11_10A_VFD1:SI.In00Data SPARE MCM01
1292 PS1_5_VFD1:SO.Out00Output PS1_5_BCN1_R RED BEACON LIGHT MCM01
1293 PS2_3_VFD1:I.In_0 PS2_3_VFD1_DISC DISCONNECT AUX MCM01
1294 PS2_3_VFD1:I.In_1 SPARE MCM01
1295 PS2_3_VFD1:I.In_2 PS2_3_TPE2 TRACKING PHOTOEYE PS2_3_TPE1 TRACKING PHOTOEYE MCM01
1296 PS2_3_VFD1:I.In_3 SPARE MCM01
1297 PS2_3_VFD1:I.IO_0 PS2_1_S2_PB START PUSHBUTTON MCM01
1298 PS2_3_VFD1:O.IO_1 PS2_1_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1338 PS3_9_VFD1:I.In_1 SPARE MCM01
1339 PS3_9_VFD1:I.In_2 PS3_9_TPE1 TRACKING PHOTOEYE MCM01
1340 PS3_9_VFD1:I.In_3 PS3_9_TPE2 TRACKING PHOTOEYE MCM01
1341 PS3_9_VFD1:I.IO_0 PS3_9_VFD1:O.IO_0 SPARE PS3_12_BCN1_R RED BEACON LIGHT MCM01
1342 PS3_9_VFD1:I.IO_1 PS3_9_VFD1:O.IO_1 SPARE PS3_12_BCN1_H ALARM HORN MCM01
1343 PS3_9_VFD1:SI.In00Data SPARE MCM01
1344 PS3_9_VFD1:SI.In01Data SPARE MCM01
1345 PS3_9_VFD1:SI.In02Data SPARE MCM01
1360 PS4_5_VFD1:I.In_1 SPARE MCM01
1361 PS4_5_VFD1:I.In_2 PS4_5_TPE1 TRACKING PHOTOEYE MCM01
1362 PS4_5_VFD1:I.In_3 SPARE MCM01
1363 PS4_5_VFD1:I.IO_0 PS4_5_VFD1:O.IO_0 SPARE PS4_2_BCN1_A AMBER BEACON LIGHT MCM01
1364 PS4_5_VFD1:I.IO_1 PS4_5_VFD1:O.IO_1 SPARE PS4_2_BCN1_H ALARM HORN MCM01
1365 PS4_5_VFD1:SI.In00Data SPARE MCM01
1366 PS4_5_VFD1:SI.In01Data SPARE MCM01
1367 PS4_5_VFD1:SI.In02Data SPARE MCM01
1380 PS4_8_VFD1:SO.Out00Output PS4_8_BCN1_A AMBER BEACON LIGHT MCM01
1381 UL11_13_VFD1:I.In_0 UL11_13_VFD1_DISC DISCONNECT AUX MCM01
1382 UL11_13_VFD1:I.In_1 SPARE MCM01
1383 UL11_13_VFD1:I.In_2 UL11_13_TPE1 TRACKING PHOTOEYE UL11_13_ENC1 FLOW SPLITTER ENCODER MCM01
1384 UL11_13_VFD1:I.In_3 SPARE MCM01
1385 UL11_13_VFD1:I.IO_0 SPARE MCM01
1386 UL11_13_VFD1:I.IO_1 SPARE MCM01
1399 UL11_3_VFD1:SI.In01Data UL11_3_EPC1_2 E-STOP PULLCORD MCM01
1400 UL11_3_VFD1:SI.In02Data UL11_3_EPC2 E-STOP PULLCORD MCM01
1401 UL11_3_VFD1:SI.In03Data UL11_3_EPC2_2 E-STOP PULLCORD MCM01
1402 UL11_3_VFD1:SO.Out00Output SPARE UL11_1_STO1 E-STOP OK MCM01
1403 UL11_4_VFD1:I.In_0 UL11_4_VFD1_DISC DISCONNECT AUX MCM01
1404 UL11_4_VFD1:I.In_1 SPARE MCM01
1405 UL11_4_VFD1:I.In_2 UL11_4_TPE1 TRACKING PHOTOEYE MCM01
1410 UL11_4_VFD1:SI.In01Data UL11_4_EPC1_2 E-STOP PULLCORD MCM01
1411 UL11_4_VFD1:SI.In02Data UL11_4_EPC2 E-STOP PULLCORD MCM01
1412 UL11_4_VFD1:SI.In03Data UL11_4_EPC2_2 E-STOP PULLCORD MCM01
1413 UL11_4_VFD1:SO.Out00Output UL11_1_STO1 E-STOP OK SPARE MCM01
1414 UL11_9_VFD1:I.In_0 UL11_9_VFD1_DISC DISCONNECT AUX MCM01
1415 UL11_9_VFD1:I.In_1 UL11_9_ENC1 ENCODER MCM01
1416 UL11_9_VFD1:I.In_2 UL11_9_TPE1 TRACKING PHOTOEYE MCM01
1446 UL12_4_VFD1:SO.Out00Output SPARE MCM01
1447 UL1_13_VFD1:I.In_0 UL1_13_VFD1_DISC DISCONNECT AUX MCM01
1448 UL1_13_VFD1:I.In_1 SPARE MCM01
1449 UL1_13_VFD1:I.In_2 SPARE UL1_13_ENC1 FLOW SPLITTER ENCODER MCM01
1450 UL1_13_VFD1:I.In_3 SPARE MCM01
1451 UL1_13_VFD1:I.IO_0 SPARE MCM01
1452 UL1_13_VFD1:I.IO_1 SPARE MCM01
1512 UL2_4_VFD1:SO.Out00Output SPARE MCM01
1513 UL4_13_VFD1:I.In_0 UL4_13_VFD1_DISC DISCONNECT AUX MCM01
1514 UL4_13_VFD1:I.In_1 SPARE MCM01
1515 UL4_13_VFD1:I.In_2 SPARE UL4_13_ENC1 FLOW SPLITTER ENCODER MCM01
1516 UL4_13_VFD1:I.In_3 SPARE MCM01
1517 UL4_13_VFD1:I.IO_0 SPARE MCM01
1518 UL4_13_VFD1:I.IO_1 SPARE MCM01
1536 UL4_4_VFD1:I.In_1 UL4_4_ENC1 ENCODER MCM01
1537 UL4_4_VFD1:I.In_2 UL4_4_TPE1 TRACKING PHOTOEYE MCM01
1538 UL4_4_VFD1:I.In_3 SPARE MCM01
1539 UL4_4_VFD1:O.IO_0 UL4_4_BCN1_R RED BEACON LIGHT UL4_4_BCN2_R RED BEACON LIGHT MCM01
1540 UL4_4_VFD1:O.IO_1 UL4_4_BCN2_R RED BEACON LIGHT UL4_4_BCN2_H ALARM HORN MCM01
1541 UL4_4_VFD1:SI.In00Data UL4_4_EPC1 E-STOP PULLCORD MCM01
1542 UL4_4_VFD1:SI.In01Data UL4_4_EPC1_2 E-STOP PULLCORD MCM01
1543 UL4_4_VFD1:SI.In02Data UL4_4_EPC2 E-STOP PULLCORD MCM01
1544 UL4_4_VFD1:SI.In03Data UL4_4_EPC2_2 E-STOP PULLCORD MCM01
1545 UL4_4_VFD1:SO.Out00Output SPARE UL4_4_BCN1_R RED BEACON LIGHT MCM01
1546 UL4_9_VFD1:I.In_0 UL4_9_VFD1_DISC DISCONNECT AUX MCM01
1547 UL4_9_VFD1:I.In_1 UL4_9_ENC1 ENCODER MCM01
1548 UL4_9_VFD1:I.In_2 UL4_9_TPE1 TRACKING PHOTOEYE MCM01
1578 UL5_4_VFD1:SO.Out00Output SPARE MCM01
1579 UL7_13_VFD1:I.In_0 UL7_13_VFD1_DISC DISCONNECT AUX MCM01
1580 UL7_13_VFD1:I.In_1 SPARE MCM01
1581 UL7_13_VFD1:I.In_2 SPARE UL7_13_ENC1 FLOW SPLITTER ENCODER MCM01
1582 UL7_13_VFD1:I.In_3 SPARE MCM01
1583 UL7_13_VFD1:I.IO_0 SPARE MCM01
1584 UL7_13_VFD1:I.IO_1 SPARE MCM01
1630 UL9_3_VFD1:SI.In01Data UL9_3_EPC1_2 E-STOP PULLCORD MCM01
1631 UL9_3_VFD1:SI.In02Data UL9_3_EPC2 E-STOP PULLCORD MCM01
1632 UL9_3_VFD1:SI.In03Data UL9_3_EPC2_2 E-STOP PULLCORD MCM01
1633 UL9_3_VFD1:SO.Out00Output SPARE UL9_1_STO1 E-STOP OK MCM01
1634 UL9_4_VFD1:I.In_0 UL9_4_VFD1_DISC DISCONNECT AUX MCM01
1635 UL9_4_VFD1:I.In_1 UL9_4_ENC1 ENCODER MCM01
1636 UL9_4_VFD1:I.In_2 UL9_4_TPE1 TRACKING PHOTOEYE MCM01
1641 UL9_4_VFD1:SI.In01Data UL9_4_EPC1_2 E-STOP PULLCORD MCM01
1642 UL9_4_VFD1:SI.In02Data UL9_4_EPC2 E-STOP PULLCORD MCM01
1643 UL9_4_VFD1:SI.In03Data UL9_4_EPC2_2 E-STOP PULLCORD MCM01
1644 UL9_4_VFD1:SO.Out00Output UL9_1_STO1 E-STOP OK SPARE MCM01
1645 PS1_4_VFD1:I.In_0 PS1_4_VFD1_DISC DISCONNECT AUX MCM01
1646 PS1_4_VFD1:I.In_1 SPARE MCM01
1647 PS1_4_VFD1:I.In_2 PS1_4_TPE1 TRACKING PHOTOEYE MCM01
1752 PS4_10_VFD1:SI.In02Data SPARE MCM01
1753 PS4_10_VFD1:SI.In03Data SPARE MCM01
1754 PS4_10_VFD1:SO.Out00Output SPARE MCM01
1755 PDP1_FIO1:I.Pt00.Data PDP1_CB1 CIRCUIT BREAKER MONITORING PDP1_CB1 MCM01
1756 PDP1_FIO1:I.Pt01.Data PDP1_CB2 CIRCUIT BREAKER MONITORING PDP1_CB2 MCM01
1757 PDP1_FIO1:I.Pt02.Data PDP1_CB3 CIRCUIT BREAKER MONITORING PDP1_CB3 MCM01
1758 PDP1_FIO1:I.Pt03.Data PDP1_CB4 CIRCUIT BREAKER MONITORING PDP1_CB4 MCM01
1759 PDP1_FIO1:I.Pt04.Data PDP1_CB5 CIRCUIT BREAKER MONITORING PDP1_CB5 MCM01
1760 PDP1_FIO1:O.Pt05.Data SPARE MCM01
1761 PDP1_FIO1:I.Pt06.Data PDP1_CB6 CIRCUIT BREAKER MONITORING PDP1_CB6 MCM01
1762 PDP1_FIO1:O.Pt07.Data SPARE MCM01
1763 PDP1_FIO1:I.Pt08.Data PDP1_CB7 CIRCUIT BREAKER MONITORING PDP1_CB7 MCM01
1764 PDP1_FIO1:I.Pt09.Data PDP1_CB8 CIRCUIT BREAKER MONITORING PDP1_CB8 MCM01
1765 PDP1_FIO1:I.Pt10.Data PDP1_CB9 CIRCUIT BREAKER MONITORING PDP1_CB9 MCM01
1766 PDP1_FIO1:I.Pt11.Data PDP1_CB10 CIRCUIT BREAKER MONITORING PDP1_CB10 MCM01
1767 PDP1_FIO1:I.Pt12.Data PDP1_PWM1 PHASE MONITOR PDP1_PWM1 MCM01
1768 PDP1_FIO1:O.Pt13.Data SPARE MCM01
1769 PDP2_FIO1:I.Pt00.Data PDP2_CB1 CIRCUIT BREAKER MONITORING PDP1_FIOH1 MCM01
1770 PDP2_FIO1:I.Pt01.Data PDP2_CB2 CIRCUIT BREAKER MONITORING SPARE MCM01
1771 PDP2_FIO1:I.Pt02.Data PDP2_CB3 CIRCUIT BREAKER MONITORING PDP2_CB1 MCM01
1772 PDP2_FIO1:I.Pt03.Data PDP2_CB4 CIRCUIT BREAKER MONITORING PDP2_CB2 MCM01
1773 PDP2_FIO1:I.Pt04.Data PDP2_CB5 CIRCUIT BREAKER MONITORING PDP2_CB3 MCM01
1774 PDP2_FIO1:O.Pt05.Data SPARE PDP2_CB4 MCM01
1775 PDP2_FIO1:I.Pt06.Data PDP2_CB6 CIRCUIT BREAKER MONITORING PDP2_CB5 MCM01
1776 PDP2_FIO1:O.Pt07.Data SPARE MCM01
1777 PDP2_FIO1:I.Pt08.Data PDP2_CB7 CIRCUIT BREAKER MONITORING PDP2_CB6 MCM01
1778 PDP2_FIO1:I.Pt09.Data PDP2_CB8 CIRCUIT BREAKER MONITORING SPARE MCM01
1779 PDP2_FIO1:I.Pt10.Data PDP2_CB9 CIRCUIT BREAKER MONITORING PDP2_CB7 MCM01
1780 PDP2_FIO1:I.Pt11.Data PDP2_CB10 CIRCUIT BREAKER MONITORING PDP2_CB8 MCM01
1781 PDP2_FIO1:I.Pt12.Data PDP2_PWM1 PHASE MONITOR PDP2_CB9 MCM01
1782 PDP2_FIO1:O.Pt13.Data SPARE PDP2_CB10 MCM01
1783 PDP6_FIO1:I.Pt00.Data PDP6_CB1 CIRCUIT BREAKER MONITORING PDP2_PWM1 MCM01
1784 PDP6_FIO1:I.Pt01.Data PDP6_CB2 CIRCUIT BREAKER MONITORING SPARE MCM01
1785 PDP6_FIO1:I.Pt02.Data PDP6_CB3 CIRCUIT BREAKER MONITORING PDP2_FIOH1 MCM01
1786 PDP6_FIO1:I.Pt03.Data PDP6_CB4 CIRCUIT BREAKER MONITORING SPARE MCM01
1787 PDP6_FIO1:I.Pt04.Data PDP6_CB5 CIRCUIT BREAKER MONITORING PDP6_CB1 MCM01
1788 PDP6_FIO1:O.Pt05.Data SPARE PDP6_CB2 MCM01
1789 PDP6_FIO1:I.Pt06.Data PDP6_CB6 CIRCUIT BREAKER MONITORING PDP6_CB3 MCM01
1790 PDP6_FIO1:O.Pt07.Data SPARE PDP6_CB4 MCM01
1791 PDP6_FIO1:I.Pt08.Data PDP6_CB7 CIRCUIT BREAKER MONITORING PDP6_CB5 MCM01
1792 PDP6_FIO1:I.Pt09.Data PDP6_CB8 CIRCUIT BREAKER MONITORING SPARE MCM01
1793 PDP6_FIO1:I.Pt10.Data PDP6_CB9 CIRCUIT BREAKER MONITORING PDP6_CB6 MCM01
1794 PDP6_FIO1:I.Pt11.Data PDP6_CB10 CIRCUIT BREAKER MONITORING SPARE MCM01
1795 PDP6_FIO1:I.Pt12.Data PDP6_PWM1 PHASE MONITOR PDP6_CB7 MCM01
1796 PDP6_FIO1:O.Pt13.Data SPARE PDP6_CB8 MCM01
1797 UL10_2_FIO1:O.Pt00.Data UL10_1_BCN1_R RED BEACON LIGHT PDP6_CB9 MCM01
1798 UL10_2_FIO1:I.Pt01.Data SPARE PDP6_CB10 MCM01
1799 UL10_2_FIO1:O.Pt02.Data UL10_1_BCN2_R RED BEACON LIGHT PDP6_PWM1 MCM01
1800 UL10_2_FIO1:I.Pt03.Data SPARE MCM01
1801 UL10_2_FIO1:I.Pt04.Data UL10_1_SS1_SPB SS STATION START PUSHBUTTON PDP6_FIOH1 MCM01
1802 UL10_2_FIO1:O.Pt05.Data UL10_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT SPARE MCM01
1803 UL10_2_FIO1:I.Pt06.Data UL10_1_SS1_STPB SS STATION STOP PUSHBUTTON UL10_1_BCN1_R RED BEACON LIGHT MCM01
1804 UL10_2_FIO1:O.Pt07.Data SPARE MCM01
1805 UL10_2_FIO1:I.Pt09.Data SPARE UL10_1_BCN2_R RED BEACON LIGHT MCM01
1806 UL10_2_FIO1:I.Pt11.Data SPARE MCM01
1807 UL10_2_FIO1:I.Pt12.Data SPARE UL10_1_SS1_SPB SS STATION START PUSHBUTTON MCM01
1808 UL10_2_FIO1:O.Pt13.Data SPARE UL10_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT MCM01
1809 UL10_2_FIO1:I.Pt14.Data SPARE UL10_1_SS1_STPB SS STATION STOP PUSHBUTTON MCM01
1810 UL10_2_FIO1:O.Pt15.Data SPARE MCM01
1811 UL11_13_FIO1:I.Pt00.Data UL11_13_PE1 DEBRIS SENSOR UL10_2_LPE1 LASEREYE MCM01
1812 UL11_13_FIO1:I.Pt01.Data SPARE MCM01
1813 UL11_13_FIO1:I.Pt02.Data UL11_13_PE2 BELT ENGAGEMENT SENSOR UL10_2_LPE2 LASEREYE MCM01
1814 UL11_13_FIO1:I.Pt03.Data SPARE MCM01
1815 UL11_13_FIO1:I.Pt08.Data UL11_13_PE3 ENTRANCE PE SPARE MCM01
1816 UL11_13_FIO1:I.Pt09.Data SPARE MCM01
1817 UL11_13_FIO1:I.Pt10.Data UL11_13_PE4 EXIT PE SPARE MCM01
1818 UL11_13_FIO1:I.Pt11.Data SPARE MCM01
1819 UL11_13_FIO1:I.Pt14.Data UL11_13_PE5 DEBRIS SENSOR UL11_13_PE1 DEBRIS SENSOR MCM01
1820 UL11_13_FIO1:O.Pt15.Data SPARE UL11_13_PE1 SEND MCM01
1821 UL11_3_FIO1:O.Pt00.Data UL11_3_BCN1_R RED BEACON LIGHT UL11_13_PE2 BELT ENGAGEMENT SENSOR MCM01
1822 UL11_3_FIO1:I.Pt01.Data SPARE UL11_13_PE2 SEND MCM01
1823 UL11_3_FIO1:O.Pt02.Data UL11_3_BCN2_R RED BEACON LIGHT UL11_13_SOL1 DIVERT MODULE MCM01
1824 UL11_3_FIO1:I.Pt03.Data SPARE MCM01
1825 UL11_3_FIO1:O.Pt05.Data SPARE UL11_13_SOL2 DIVERT MODULE MCM01
1826 UL11_3_FIO1:O.Pt07.Data SPARE MCM01
1827 UL11_3_FIO1:I.Pt08.Data UL11_3_S1_PB START PUSHBUTTON UL11_13_PE3 ENTRANCE PE MCM01
1828 UL11_3_FIO1:O.Pt09.Data UL11_3_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1829 UL11_3_FIO1:I.Pt10.Data UL11_3_S2_PB START PUSHBUTTON UL11_13_PE4 EXIT PE MCM01
1830 UL11_3_FIO1:O.Pt11.Data UL11_3_S2_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1831 UL11_3_FIO1:I.Pt12.Data SPARE UL11_13_SOL3 DIVERT MODULE MCM01
1832 UL11_3_FIO1:O.Pt13.Data SPARE MCM01
1833 UL11_3_FIO1:I.Pt14.Data SPARE UL11_13_PE5 DEBRIS SENSOR MCM01
1834 UL11_3_FIO1:O.Pt15.Data SPARE UL11_13_PE5 SEND MCM01
1835 UL12_3_FIO1:O.Pt00.Data UL12_3_BCN1_R RED BEACON LIGHT UL11_3_BCN1_R RED BEACON LIGHT MCM01
1836 UL12_3_FIO1:I.Pt01.Data SPARE MCM01
1837 UL12_3_FIO1:O.Pt02.Data UL12_3_BCN2_R RED BEACON LIGHT UL11_3_BCN2_R RED BEACON LIGHT MCM01
1838 UL12_3_FIO1:I.Pt03.Data SPARE MCM01
1839 UL12_3_FIO1:O.Pt05.Data SPARE UL11_3_LPE1 LASEREYE MCM01
1840 UL12_3_FIO1:O.Pt07.Data SPARE MCM01
1841 UL12_3_FIO1:I.Pt08.Data UL12_3_S1_PB START PUSHBUTTON UL11_3_LPE2 LASEREYE MCM01
1842 UL12_3_FIO1:O.Pt09.Data UL12_3_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1843 UL12_3_FIO1:I.Pt10.Data UL12_3_S2_PB START PUSHBUTTON UL11_3_S1_PB START PUSHBUTTON MCM01
1844 UL12_3_FIO1:O.Pt11.Data UL12_3_S2_PB_LT START PUSHBUTTON LIGHT UL11_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1845 UL12_3_FIO1:I.Pt12.Data SPARE UL11_3_S2_PB START PUSHBUTTON MCM01
1846 UL12_3_FIO1:O.Pt13.Data SPARE UL11_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1847 UL12_3_FIO1:I.Pt14.Data SPARE MCM01
1848 UL12_3_FIO1:O.Pt15.Data SPARE MCM01
1849 UL1_13_FIO1:I.Pt00.Data UL1_13_PE1 DEBRIS SENSOR SPARE MCM01
1850 UL1_13_FIO1:I.Pt01.Data SPARE MCM01
1851 UL1_13_FIO1:I.Pt02.Data UL1_13_PE2 BELT ENGAGEMENT SENSOR UL12_3_BCN1_R RED BEACON LIGHT MCM01
1852 UL1_13_FIO1:I.Pt03.Data SPARE MCM01
1853 UL1_13_FIO1:I.Pt08.Data UL1_13_PE3 ENTRANCE PE UL12_3_BCN2_R RED BEACON LIGHT MCM01
1854 UL1_13_FIO1:I.Pt09.Data SPARE MCM01
1855 UL1_13_FIO1:I.Pt10.Data UL1_13_PE4 EXIT PE UL12_3_LPE1 LASEREYE MCM01
1856 UL1_13_FIO1:I.Pt11.Data SPARE MCM01
1857 UL1_13_FIO1:I.Pt14.Data UL1_13_PE5 DEBRIS SENSOR UL12_3_LPE2 LASEREYE MCM01
1858 UL1_13_FIO1:O.Pt15.Data SPARE MCM01
1859 UL1_3_FIO1:O.Pt00.Data UL1_3_BCN1_R RED BEACON LIGHT UL12_3_S1_PB START PUSHBUTTON MCM01
1860 UL1_3_FIO1:I.Pt01.Data SPARE UL12_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1861 UL1_3_FIO1:O.Pt02.Data UL1_3_BCN2_R RED BEACON LIGHT UL12_3_S2_PB START PUSHBUTTON MCM01
1862 UL1_3_FIO1:I.Pt03.Data SPARE UL12_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1863 UL1_3_FIO1:O.Pt05.Data SPARE MCM01
1864 UL1_3_FIO1:O.Pt07.Data SPARE MCM01
1865 UL1_3_FIO1:I.Pt08.Data UL1_3_S1_PB START PUSHBUTTON SPARE MCM01
1866 UL1_3_FIO1:O.Pt09.Data UL1_3_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1867 UL1_3_FIO1:I.Pt10.Data UL1_3_S2_PB START PUSHBUTTON UL1_13_PE1 DEBRIS SENSOR MCM01
1868 UL1_3_FIO1:O.Pt11.Data UL1_3_S2_PB_LT START PUSHBUTTON LIGHT UL1_13_PE1 SEND MCM01
1869 UL1_3_FIO1:I.Pt12.Data SPARE UL1_13_PE2 BELT ENGAGEMENT SENSOR MCM01
1870 UL1_3_FIO1:O.Pt13.Data SPARE UL1_13_PE2 SEND MCM01
1871 UL1_3_FIO1:I.Pt14.Data SPARE UL1_13_SOL1 DIVERT MODULE MCM01
1872 UL1_3_FIO1:O.Pt15.Data SPARE MCM01
1873 UL2_3_FIO1:O.Pt00.Data UL2_3_BCN1_R RED BEACON LIGHT UL1_13_SOL2 DIVERT MODULE MCM01
1874 UL2_3_FIO1:I.Pt01.Data SPARE MCM01
1875 UL2_3_FIO1:O.Pt02.Data UL2_3_BCN2_R RED BEACON LIGHT UL1_13_PE3 ENTRANCE PE MCM01
1876 UL2_3_FIO1:I.Pt03.Data SPARE MCM01
1877 UL2_3_FIO1:O.Pt05.Data SPARE UL1_13_PE4 EXIT PE MCM01
1878 UL2_3_FIO1:O.Pt07.Data SPARE MCM01
1879 UL2_3_FIO1:I.Pt08.Data UL2_3_S1_PB START PUSHBUTTON UL1_13_SOL3 DIVERT MODULE MCM01
1880 UL2_3_FIO1:O.Pt09.Data UL2_3_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1881 UL2_3_FIO1:I.Pt10.Data UL2_3_S2_PB START PUSHBUTTON UL1_13_PE5 DEBRIS SENSOR MCM01
1882 UL2_3_FIO1:O.Pt11.Data UL2_3_S2_PB_LT START PUSHBUTTON LIGHT UL1_13_PE5 SEND MCM01
1883 UL2_3_FIO1:I.Pt12.Data SPARE UL1_3_BCN1_R RED BEACON LIGHT MCM01
1884 UL2_3_FIO1:O.Pt13.Data SPARE MCM01
1885 UL2_3_FIO1:I.Pt14.Data SPARE UL1_3_BCN2_R RED BEACON LIGHT MCM01
1886 UL2_3_FIO1:O.Pt15.Data SPARE MCM01
1887 UL3_2_FIO1:O.Pt00.Data UL3_1_BCN1_R RED BEACON LIGHT UL1_3_LPE1 LASEREYE MCM01
1888 UL3_2_FIO1:O.Pt01.Data UL3_1_BCN2_R RED BEACON LIGHT SPARE MCM01
1889 UL3_2_FIO1:I.Pt02.Data UL3_1_SS1_SPB SS STATION START PUSHBUTTON UL1_3_LPE2 LASEREYE MCM01
1890 UL3_2_FIO1:O.Pt03.Data UL3_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT SPARE MCM01
1891 UL3_2_FIO1:I.Pt04.Data UL3_1_SS1_STPB SS STATION STOP PUSHBUTTON UL1_3_S1_PB START PUSHBUTTON MCM01
1892 UL3_2_FIO1:O.Pt05.Data SPARE UL1_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1893 UL3_2_FIO1:O.Pt07.Data SPARE UL1_3_S2_PB START PUSHBUTTON MCM01
1894 UL3_2_FIO1:I.Pt09.Data SPARE UL1_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1895 UL3_2_FIO1:O.Pt10.Data UL3_2_BCN1_R RED BEACON LIGHT SPARE MCM01
1896 UL3_2_FIO1:O.Pt11.Data UL3_2_BCN2_R RED BEACON LIGHT SPARE MCM01
1897 UL3_2_FIO1:I.Pt12.Data UL3_2_S1_PB START PUSHBUTTON SPARE MCM01
1898 UL3_2_FIO1:O.Pt13.Data UL3_2_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1899 UL3_2_FIO1:I.Pt14.Data UL3_2_S2_PB START PUSHBUTTON UL2_3_BCN1_R RED BEACON LIGHT MCM01
1900 UL3_2_FIO1:O.Pt15.Data UL3_2_S2_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1901 UL4_13_FIO1:I.Pt00.Data UL4_13_PE1 DEBRIS SENSOR UL2_3_BCN2_R RED BEACON LIGHT MCM01
1902 UL4_13_FIO1:I.Pt01.Data SPARE MCM01
1903 UL4_13_FIO1:I.Pt02.Data UL4_13_PE2 BELT ENGAGEMENT SENSOR UL2_3_LPE1 LASEREYE MCM01
1904 UL4_13_FIO1:I.Pt03.Data SPARE MCM01
1905 UL4_13_FIO1:I.Pt08.Data UL4_13_PE3 ENTRANCE PE UL2_3_LPE2 LASEREYE MCM01
1906 UL4_13_FIO1:I.Pt09.Data SPARE MCM01
1907 UL4_13_FIO1:I.Pt10.Data UL4_13_PE4 EXIT PE UL2_3_S1_PB START PUSHBUTTON MCM01
1908 UL4_13_FIO1:I.Pt11.Data SPARE UL2_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1909 UL4_13_FIO1:I.Pt14.Data UL4_13_PE5 DEBRIS SENSOR UL2_3_S2_PB START PUSHBUTTON MCM01
1910 UL4_13_FIO1:O.Pt15.Data SPARE UL2_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1911 UL4_3_FIO1:O.Pt00.Data UL4_3_BCN1_R RED BEACON LIGHT SPARE MCM01
1912 UL4_3_FIO1:I.Pt01.Data SPARE MCM01
1913 UL4_3_FIO1:O.Pt02.Data UL4_3_BCN2_R RED BEACON LIGHT SPARE MCM01
1914 UL4_3_FIO1:I.Pt03.Data SPARE MCM01
1915 UL4_3_FIO1:O.Pt05.Data SPARE UL3_1_BCN1_R RED BEACON LIGHT MCM01
1916 UL4_3_FIO1:O.Pt07.Data SPARE UL3_1_BCN2_R RED BEACON LIGHT MCM01
1917 UL4_3_FIO1:I.Pt08.Data UL4_3_S1_PB START PUSHBUTTON UL3_1_SS1_SPB SS STATION START PUSHBUTTON MCM01
1918 UL4_3_FIO1:O.Pt09.Data UL4_3_S1_PB_LT START PUSHBUTTON LIGHT UL3_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT MCM01
1919 UL4_3_FIO1:I.Pt10.Data UL4_3_S2_PB START PUSHBUTTON UL3_1_SS1_STPB SS STATION STOP PUSHBUTTON MCM01
1920 UL4_3_FIO1:O.Pt11.Data UL4_3_S2_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1921 UL4_3_FIO1:I.Pt12.Data SPARE UL3_2_LPE1 LASEREYE MCM01
1922 UL4_3_FIO1:O.Pt13.Data SPARE MCM01
1923 UL4_3_FIO1:I.Pt14.Data SPARE UL3_2_LPE2 LASEREYE MCM01
1924 UL4_3_FIO1:O.Pt15.Data SPARE MCM01
1925 UL5_3_FIO1:O.Pt00.Data UL5_3_BCN1_R RED BEACON LIGHT UL3_2_BCN1_R RED BEACON LIGHT MCM01
1926 UL5_3_FIO1:I.Pt01.Data SPARE UL3_2_BCN2_R RED BEACON LIGHT MCM01
1927 UL5_3_FIO1:O.Pt02.Data UL5_3_BCN2_R RED BEACON LIGHT UL3_2_S1_PB START PUSHBUTTON MCM01
1928 UL5_3_FIO1:I.Pt03.Data SPARE UL3_2_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1929 UL5_3_FIO1:O.Pt05.Data SPARE UL3_2_S2_PB START PUSHBUTTON MCM01
1930 UL5_3_FIO1:O.Pt07.Data SPARE UL3_2_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1931 UL5_3_FIO1:I.Pt08.Data UL5_3_S1_PB START PUSHBUTTON UL4_13_PE1 DEBRIS SENSOR MCM01
1932 UL5_3_FIO1:O.Pt09.Data UL5_3_S1_PB_LT START PUSHBUTTON LIGHT UL4_13_PE1 SEND MCM01
1933 UL5_3_FIO1:I.Pt10.Data UL5_3_S2_PB START PUSHBUTTON UL4_13_PE2 BELT ENGAGEMENT SENSOR MCM01
1934 UL5_3_FIO1:O.Pt11.Data UL5_3_S2_PB_LT START PUSHBUTTON LIGHT UL4_13_PE2 SEND MCM01
1935 UL5_3_FIO1:I.Pt12.Data SPARE UL4_13_SOL1 DIVERT MODULE MCM01
1936 UL5_3_FIO1:O.Pt13.Data SPARE MCM01
1937 UL5_3_FIO1:I.Pt14.Data SPARE UL4_13_SOL2 DIVERT MODULE MCM01
1938 UL5_3_FIO1:O.Pt15.Data SPARE MCM01
1939 UL6_2_FIO1:O.Pt00.Data UL6_1_BCN1_R RED BEACON LIGHT UL4_13_PE3 ENTRANCE PE MCM01
1940 UL6_2_FIO1:O.Pt01.Data UL6_1_BCN2_R RED BEACON LIGHT SPARE MCM01
1941 UL6_2_FIO1:I.Pt02.Data UL6_1_SS1_SPB SS STATION START PUSHBUTTON UL4_13_PE4 EXIT PE MCM01
1942 UL6_2_FIO1:O.Pt03.Data UL6_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT SPARE MCM01
1943 UL6_2_FIO1:I.Pt04.Data UL6_1_SS1_STPB SS STATION STOP PUSHBUTTON UL4_13_SOL3 DIVERT MODULE MCM01
1944 UL6_2_FIO1:O.Pt05.Data SPARE MCM01
1945 UL6_2_FIO1:O.Pt06.Data UL6_2_BCN1_R RED BEACON LIGHT UL4_13_PE5 DEBRIS SENSOR MCM01
1946 UL6_2_FIO1:O.Pt07.Data UL6_2_BCN2_R RED BEACON LIGHT UL4_13_PE5 SEND MCM01
1947 UL6_2_FIO1:I.Pt09.Data SPARE UL4_3_BCN1_R RED BEACON LIGHT MCM01
1948 UL6_2_FIO1:I.Pt11.Data SPARE MCM01
1949 UL6_2_FIO1:I.Pt12.Data UL6_2_S1_PB START PUSHBUTTON UL4_3_BCN2_R RED BEACON LIGHT MCM01
1950 UL6_2_FIO1:O.Pt13.Data UL6_2_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1951 UL6_2_FIO1:I.Pt14.Data UL6_2_S2_PB START PUSHBUTTON UL4_3_LPE1 LASEREYE MCM01
1952 UL6_2_FIO1:O.Pt15.Data UL6_2_S2_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1953 UL7_13_FIO1:I.Pt00.Data UL7_13_PE1 DEBRIS SENSOR UL4_3_LPE2 LASEREYE MCM01
1954 UL7_13_FIO1:I.Pt01.Data SPARE MCM01
1955 UL7_13_FIO1:I.Pt02.Data UL7_13_PE2 BELT ENGAGEMENT SENSOR UL4_3_S1_PB START PUSHBUTTON MCM01
1956 UL7_13_FIO1:I.Pt03.Data SPARE UL4_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1957 UL7_13_FIO1:I.Pt08.Data UL7_13_PE3 ENTRANCE PE UL4_3_S2_PB START PUSHBUTTON MCM01
1958 UL7_13_FIO1:I.Pt09.Data SPARE UL4_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1959 UL7_13_FIO1:I.Pt10.Data UL7_13_PE4 EXIT PE SPARE MCM01
1960 UL7_13_FIO1:I.Pt11.Data SPARE MCM01
1961 UL7_13_FIO1:I.Pt14.Data UL7_13_PE5 DEBRIS SENSOR SPARE MCM01
1962 UL7_13_FIO1:O.Pt15.Data SPARE MCM01
1963 UL7_3_FIO1:O.Pt00.Data UL7_3_BCN1_R RED BEACON LIGHT UL5_3_BCN1_R RED BEACON LIGHT MCM01
1964 UL7_3_FIO1:I.Pt01.Data SPARE MCM01
1965 UL7_3_FIO1:O.Pt02.Data UL7_3_BCN2_R RED BEACON LIGHT UL5_3_BCN2_R RED BEACON LIGHT MCM01
1966 UL7_3_FIO1:I.Pt03.Data SPARE MCM01
1967 UL7_3_FIO1:O.Pt05.Data SPARE UL5_3_LPE1 LASEREYE MCM01
1968 UL7_3_FIO1:O.Pt07.Data SPARE MCM01
1969 UL7_3_FIO1:I.Pt08.Data UL7_3_S1_PB START PUSHBUTTON UL5_3_LPE2 LASEREYE MCM01
1970 UL7_3_FIO1:O.Pt09.Data UL7_3_S1_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
1971 UL7_3_FIO1:I.Pt10.Data UL7_3_S2_PB START PUSHBUTTON UL5_3_S1_PB START PUSHBUTTON MCM01
1972 UL7_3_FIO1:O.Pt11.Data UL7_3_S2_PB_LT START PUSHBUTTON LIGHT UL5_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1973 UL7_3_FIO1:I.Pt12.Data SPARE UL5_3_S2_PB START PUSHBUTTON MCM01
1974 UL7_3_FIO1:O.Pt13.Data SPARE UL5_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1975 UL7_3_FIO1:I.Pt14.Data SPARE MCM01
1976 UL7_3_FIO1:O.Pt15.Data SPARE MCM01
1977 UL8_2_FIO1:O.Pt00.Data UL8_1_BCN1_R RED BEACON LIGHT SPARE MCM01
1978 UL8_2_FIO1:I.Pt01.Data SPARE MCM01
1979 UL8_2_FIO1:O.Pt02.Data UL8_1_BCN2_R RED BEACON LIGHT UL6_1_BCN1_R RED BEACON LIGHT MCM01
1980 UL8_2_FIO1:I.Pt03.Data SPARE UL6_1_BCN2_R RED BEACON LIGHT MCM01
1981 UL8_2_FIO1:I.Pt04.Data UL8_1_SS1_SPB SS STATION START PUSHBUTTON UL6_1_SS1_SPB SS STATION START PUSHBUTTON MCM01
1982 UL8_2_FIO1:O.Pt05.Data UL8_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT UL6_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT MCM01
1983 UL8_2_FIO1:I.Pt06.Data UL8_1_SS1_STPB SS STATION STOP PUSHBUTTON UL6_1_SS1_STPB SS STATION STOP PUSHBUTTON MCM01
1984 UL8_2_FIO1:O.Pt07.Data SPARE MCM01
1985 UL8_2_FIO1:I.Pt09.Data SPARE UL6_2_BCN1_R RED BEACON LIGHT MCM01
1986 UL8_2_FIO1:I.Pt11.Data SPARE UL6_2_BCN2_R RED BEACON LIGHT MCM01
1987 UL8_2_FIO1:I.Pt12.Data SPARE UL6_2_LPE1 LASEREYE MCM01
1988 UL8_2_FIO1:O.Pt13.Data SPARE MCM01
1989 UL8_2_FIO1:I.Pt14.Data SPARE UL6_2_LPE2 LASEREYE MCM01
1990 UL8_2_FIO1:O.Pt15.Data SPARE MCM01
1991 UL9_3_FIO1:O.Pt00.Data UL9_3_BCN1_R RED BEACON LIGHT UL6_2_S1_PB START PUSHBUTTON MCM01
1992 UL9_3_FIO1:I.Pt01.Data SPARE UL6_2_S1_PB_LT START PUSHBUTTON LIGHT MCM01
1993 UL9_3_FIO1:O.Pt02.Data UL9_3_BCN2_R RED BEACON LIGHT UL6_2_S2_PB START PUSHBUTTON MCM01
1994 UL9_3_FIO1:I.Pt03.Data SPARE UL6_2_S2_PB_LT START PUSHBUTTON LIGHT MCM01
1995 UL9_3_FIO1:O.Pt05.Data SPARE UL7_13_PE1 DEBRIS SENSOR MCM01
1996 UL9_3_FIO1:O.Pt07.Data SPARE UL7_13_PE1 SEND MCM01
1997 UL9_3_FIO1:I.Pt08.Data UL9_3_S1_PB START PUSHBUTTON UL7_13_PE2 BELT ENGAGEMENT SENSOR MCM01
1998 UL9_3_FIO1:O.Pt09.Data UL9_3_S1_PB_LT START PUSHBUTTON LIGHT UL7_13_PE2 SEND MCM01
1999 UL9_3_FIO1:I.Pt10.Data UL9_3_S2_PB START PUSHBUTTON UL7_13_SOL1 DIVERT MODULE MCM01
2000 UL9_3_FIO1:O.Pt11.Data UL9_3_S2_PB_LT START PUSHBUTTON LIGHT SPARE MCM01
2001 UL9_3_FIO1:I.Pt12.Data SPARE UL7_13_SOL2 DIVERT MODULE MCM01
2002 UL9_3_FIO1:O.Pt13.Data SPARE MCM01
2003 UL9_3_FIO1:I.Pt14.Data SPARE UL7_13_PE3 ENTRANCE PE MCM01
2004 UL9_3_FIO1:O.Pt15.Data SPARE MCM01
2005 PDP1_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4 PDP1_CB11 CIRCUIT BREAKER MONITORING UL7_13_PE4 EXIT PE MCM01
2006 PDP1_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2 PDP1_CB12 CIRCUIT BREAKER MONITORING SPARE MCM01
2007 PDP1_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4 PDP1_CB13 CIRCUIT BREAKER MONITORING UL7_13_SOL3 DIVERT MODULE MCM01
2008 PDP1_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2 PDP1_CB14 CIRCUIT BREAKER MONITORING SPARE MCM01
2009 PDP1_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4 PDP1_CB15 CIRCUIT BREAKER MONITORING UL7_13_PE5 DEBRIS SENSOR MCM01
2010 PDP1_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2 PDP1_CB16 CIRCUIT BREAKER MONITORING UL7_13_PE5 SEND MCM01
2011 PDP1_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4 PDP1_CB17 CIRCUIT BREAKER MONITORING UL7_3_BCN1_R RED BEACON LIGHT MCM01
2012 PDP1_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2 PDP1_CB18 CIRCUIT BREAKER MONITORING SPARE MCM01
2013 PDP1_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4 PDP1_CB19 CIRCUIT BREAKER MONITORING UL7_3_BCN2_R RED BEACON LIGHT MCM01
2014 PDP1_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2 PDP1_CB20 CIRCUIT BREAKER MONITORING SPARE MCM01
2015 PDP1_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4 PDP1_CB21 CIRCUIT BREAKER MONITORING UL7_3_LPE1 LASEREYE MCM01
2016 PDP1_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2 PDP1_CB22 CIRCUIT BREAKER MONITORING SPARE MCM01
2017 PDP1_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4 PDP1_CB23 CIRCUIT BREAKER MONITORING UL7_3_LPE2 LASEREYE MCM01
2018 PDP1_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2 PDP1_CB24 CIRCUIT BREAKER MONITORING SPARE MCM01
2019 PDP1_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4 PDP1_CB25 CIRCUIT BREAKER MONITORING UL7_3_S1_PB START PUSHBUTTON MCM01
2020 PDP1_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2 PDP1_CB26 CIRCUIT BREAKER MONITORING UL7_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
2021 PDP2_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4 PDP2_CB11 CIRCUIT BREAKER MONITORING UL7_3_S2_PB START PUSHBUTTON MCM01
2022 PDP2_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2 PDP2_CB12 CIRCUIT BREAKER MONITORING UL7_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
2023 PDP2_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4 PDP2_CB13 CIRCUIT BREAKER MONITORING SPARE MCM01
2024 PDP2_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2 PDP2_CB14 CIRCUIT BREAKER MONITORING SPARE MCM01
2025 PDP2_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4 PDP2_CB15 CIRCUIT BREAKER MONITORING SPARE MCM01
2026 PDP2_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2 PDP2_CB16 CIRCUIT BREAKER MONITORING SPARE MCM01
2027 PDP2_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4 PDP2_CB17 CIRCUIT BREAKER MONITORING UL8_1_BCN1_R RED BEACON LIGHT MCM01
2028 PDP2_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2 PDP2_CB18 CIRCUIT BREAKER MONITORING SPARE MCM01
2029 PDP2_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4 PDP2_CB19 CIRCUIT BREAKER MONITORING UL8_1_BCN2_R RED BEACON LIGHT MCM01
2030 PDP2_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2 PDP2_CB20 CIRCUIT BREAKER MONITORING SPARE MCM01
2031 PDP2_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4 PDP2_CB21 CIRCUIT BREAKER MONITORING UL8_1_SS1_SPB SS STATION START PUSHBUTTON MCM01
2032 PDP2_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2 PDP2_CB22 CIRCUIT BREAKER MONITORING UL8_1_SS1_SPB_LT SS STATION START PUSHBUTTON LIGHT MCM01
2033 PDP2_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4 PDP2_CB23 CIRCUIT BREAKER MONITORING UL8_1_SS1_STPB SS STATION STOP PUSHBUTTON MCM01
2034 PDP2_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2 PDP2_CB24 CIRCUIT BREAKER MONITORING SPARE MCM01
2035 PDP2_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4 PDP2_CB25 CIRCUIT BREAKER MONITORING UL8_2_LPE1 LASEREYE MCM01
2036 PDP2_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2 PDP2_CB26 CIRCUIT BREAKER MONITORING SPARE MCM01
2037 PDP6_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4 PDP6_CB11 CIRCUIT BREAKER MONITORING UL8_2_LPE2 LASEREYE MCM01
2038 PDP6_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2 PDP6_CB12 CIRCUIT BREAKER MONITORING SPARE MCM01
2039 PDP6_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4 PDP6_CB13 CIRCUIT BREAKER MONITORING SPARE MCM01
2040 PDP6_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2 PDP6_CB14 CIRCUIT BREAKER MONITORING SPARE MCM01
2041 PDP6_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4 PDP6_CB15 CIRCUIT BREAKER MONITORING SPARE MCM01
2042 PDP6_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2 PDP6_CB16 CIRCUIT BREAKER MONITORING SPARE MCM01
2043 PDP6_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4 PDP6_CB17 CIRCUIT BREAKER MONITORING UL9_3_BCN1_R RED BEACON LIGHT MCM01
2044 PDP6_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2 PDP6_CB18 CIRCUIT BREAKER MONITORING SPARE MCM01
2045 PDP6_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4 PDP6_CB19 CIRCUIT BREAKER MONITORING UL9_3_BCN2_R RED BEACON LIGHT MCM01
2046 PDP6_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2 PDP6_CB20 CIRCUIT BREAKER MONITORING SPARE MCM01
2047 PDP6_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4 PDP6_CB21 CIRCUIT BREAKER MONITORING UL9_3_LPE1 LASEREYE MCM01
2048 PDP6_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2 PDP6_CB22 CIRCUIT BREAKER MONITORING SPARE MCM01
2049 PDP6_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4 PDP6_CB23 CIRCUIT BREAKER MONITORING UL9_3_LPE2 LASEREYE MCM01
2050 PDP6_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2 PDP6_CB24 CIRCUIT BREAKER MONITORING SPARE MCM01
2051 PDP6_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4 PDP6_CB25 CIRCUIT BREAKER MONITORING UL9_3_S1_PB START PUSHBUTTON MCM01
2052 PDP6_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2 PDP6_CB26 CIRCUIT BREAKER MONITORING UL9_3_S1_PB_LT START PUSHBUTTON LIGHT MCM01
2053 UL9_3_S2_PB START PUSHBUTTON MCM01
2054 UL9_3_S2_PB_LT START PUSHBUTTON LIGHT MCM01
2055 SPARE MCM01
2056 SPARE MCM01
2057 SPARE MCM01
2058 SPARE MCM01
2059 PDP1_CB17 MCM01
2060 PDP1_CB18 MCM01
2061 PDP1_CB25 MCM01
2062 PDP1_CB26 MCM01
2063 PDP1_CB15 MCM01
2064 PDP1_CB16 MCM01
2065 PDP1_CB23 MCM01
2066 PDP1_CB24 MCM01
2067 PDP1_CB13 MCM01
2068 PDP1_CB14 MCM01
2069 PDP1_CB21 MCM01
2070 PDP1_CB22 MCM01
2071 PDP1_CB11 MCM01
2072 PDP1_CB12 MCM01
2073 PDP1_CB19 MCM01
2074 PDP1_CB20 MCM01
2075 PDP2_CB17 MCM01
2076 PDP2_CB18 MCM01
2077 PDP2_CB25 MCM01
2078 PDP2_CB26 MCM01
2079 PDP2_CB15 MCM01
2080 PDP2_CB16 MCM01
2081 PDP2_CB23 MCM01
2082 PDP2_CB24 MCM01
2083 PDP2_CB13 MCM01
2084 PDP2_CB14 MCM01
2085 PDP2_CB21 MCM01
2086 PDP2_CB22 MCM01
2087 PDP2_CB11 MCM01
2088 PDP2_CB12 MCM01
2089 PDP2_CB19 MCM01
2090 PDP2_CB20 MCM01
2091 PDP6_CB17 MCM01
2092 PDP6_CB18 MCM01
2093 PDP6_CB25 MCM01
2094 PDP6_CB26 MCM01
2095 PDP6_CB15 MCM01
2096 PDP6_CB16 MCM01
2097 PDP6_CB23 MCM01
2098 PDP6_CB24 MCM01
2099 PDP6_CB13 MCM01
2100 PDP6_CB14 MCM01
2101 PDP6_CB21 MCM01
2102 PDP6_CB22 MCM01
2103 PDP6_CB11 MCM01
2104 PDP6_CB12 MCM01
2105 PDP6_CB19 MCM01
2106 PDP6_CB20 MCM01

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,770 @@
Name,Description,Subsystem
Local:5:I.Data.0,MCM03 S_PBLT START,MCM03
Local:5:I.Data.1,MCM03 ST_PB STOP,MCM03
Local:5:I.Data.10,SPARE,MCM03
Local:5:I.Data.11,SPARE,MCM03
Local:5:I.Data.12,SPARE,MCM03
Local:5:I.Data.13,SPARE,MCM03
Local:5:I.Data.14,SPARE,MCM03
Local:5:I.Data.15,SPARE,MCM03
Local:5:I.Data.2,MCM03 MF_PBLT MOTOR FAULT RESET,MCM03
Local:5:I.Data.3,MCM03 JR_PBLT JAM RESET,MCM03
Local:5:I.Data.4,MCM03 LAP_PBLT LOW AIR PRESSURE,MCM03
Local:5:I.Data.5,MCM03 PBFR_PBLT POWER BRANCH FAULT RESET,MCM03
Local:5:I.Data.6,MCM03 BATTERY_FAULT_UPS BATTERY FAULT,MCM03
Local:5:I.Data.7,MCM03 ON_BATTERY ON BATTERY,MCM03
Local:5:I.Data.8,MCM03 UPS_BATTERY_LOW UPS BATTERY LOW,MCM03
Local:5:I.Data.9,MCM03 NAT_SWITCH ALARM NAT SWITCH,MCM03
Local:7:I.Pt00.Data,MCM03 FIRE_ALARM FIRE ALARM,MCM03
Local:7:I.Pt01.Data,SPARE,MCM03
Local:7:I.Pt10.Data,SPARE,MCM03
Local:7:I.Pt11.Data,SPARE,MCM03
Local:7:I.Pt12.Data,SPARE,MCM03
Local:7:I.Pt13.Data,SPARE,MCM03
Local:7:I.Pt14.Data,SPARE,MCM03
Local:7:I.Pt15.Data,SPARE,MCM03
Local:7:I.Pt02.Data,MCM03 ES_PB ES_PB_CH1,MCM03
Local:7:I.Pt03.Data,MCM03 ES_PB ES_PB_CH2,MCM03
Local:7:I.Pt04.Data,SPARE,MCM03
Local:7:I.Pt05.Data,SPARE,MCM03
Local:7:I.Pt06.Data,SPARE,MCM03
Local:7:I.Pt07.Data,SPARE,MCM03
Local:7:I.Pt08.Data,SPARE,MCM03
Local:7:I.Pt09.Data,SPARE,MCM03
Local:6:O.Data.0,MCM03 ES_LT EMERGENCY STOP ACTUATED,MCM03
Local:6:O.Data.1,MCM03 S_PBLT START LIGHT,MCM03
Local:6:O.Data.10,SPARE,MCM03
Local:6:O.Data.11,SPARE,MCM03
Local:6:O.Data.12,SPARE,MCM03
Local:6:O.Data.13,SPARE,MCM03
Local:6:O.Data.14,SPARE,MCM03
Local:6:O.Data.15,SPARE,MCM03
Local:6:O.Data.2,MCM03 MF_PBLT MOTOR FAULT LIGHT,MCM03
Local:6:O.Data.3,MCM03 JR_PBLT JAM RESTART LIGHT,MCM03
Local:6:O.Data.4,MCM03 LAP_PBLT LOW AIR PRESSURE LIGHT,MCM03
Local:6:O.Data.5,MCM03 PBFR_PBLT POWER BRANCH FAULT RESET LIGHT,MCM03
Local:6:O.Data.6,SPARE,MCM03
Local:6:O.Data.7,SPARE,MCM03
Local:6:O.Data.8,SPARE,MCM03
Local:6:O.Data.9,SPARE,MCM03
UL11_20_VFD1:I.In_0,UL11_20_VFD1_DISC DISCONNECT AUX,MCM03
UL11_20_VFD1:I.In_1,SPARE,MCM03
UL11_20_VFD1:I.In_2,SPARE,MCM03
UL11_20_VFD1:I.In_3,SPARE,MCM03
UL11_20_VFD1:I.IO_0,SPARE,MCM03
UL11_20_VFD1:I.IO_1,SPARE,MCM03
UL11_20_VFD1:SI.In00Data,SPARE,MCM03
UL11_20_VFD1:SI.In01Data,SPARE,MCM03
UL11_20_VFD1:SI.In02Data,SPARE,MCM03
UL11_20_VFD1:SI.In03Data,SPARE,MCM03
UL11_20_VFD1:SO.Out00Output,SPARE,MCM03
UL13_19_VFD1:I.In_0,UL13_19_VFD1_DISC DISCONNECT AUX,MCM03
UL13_19_VFD1:I.In_1,SPARE,MCM03
UL13_19_VFD1:I.In_2,SPARE,MCM03
UL13_19_VFD1:I.In_3,SPARE,MCM03
UL13_19_VFD1:I.IO_0,SPARE,MCM03
UL13_19_VFD1:I.IO_1,SPARE,MCM03
UL13_19_VFD1:SI.In00Data,SPARE,MCM03
UL13_19_VFD1:SI.In01Data,SPARE,MCM03
UL13_19_VFD1:SI.In02Data,SPARE,MCM03
UL13_19_VFD1:SI.In03Data,SPARE,MCM03
UL13_19_VFD1:SO.Out00Output,SPARE,MCM03
UL18_23_VFD1:I.In_0,UL18_23_VFD1_DISC DISCONNECT AUX,MCM03
UL18_23_VFD1:I.In_1,SPARE,MCM03
UL18_23_VFD1:I.In_2,SPARE,MCM03
UL18_23_VFD1:I.In_3,SPARE,MCM03
UL18_23_VFD1:I.IO_0,SPARE,MCM03
UL18_23_VFD1:I.IO_1,SPARE,MCM03
UL18_23_VFD1:SI.In00Data,SPARE,MCM03
UL18_23_VFD1:SI.In01Data,SPARE,MCM03
UL18_23_VFD1:SI.In02Data,SPARE,MCM03
UL18_23_VFD1:SI.In03Data,SPARE,MCM03
UL18_23_VFD1:SO.Out00Output,SPARE,MCM03
UL1_20_VFD1:I.In_0,UL1_20_VFD1_DISC DISCONNECT AUX,MCM03
UL1_20_VFD1:I.In_1,SPARE,MCM03
UL1_20_VFD1:I.In_2,SPARE,MCM03
UL1_20_VFD1:I.In_3,SPARE,MCM03
UL1_20_VFD1:I.IO_0,SPARE,MCM03
UL1_20_VFD1:I.IO_1,SPARE,MCM03
UL1_20_VFD1:SI.In00Data,SPARE,MCM03
UL1_20_VFD1:SI.In01Data,SPARE,MCM03
UL1_20_VFD1:SI.In02Data,SPARE,MCM03
UL1_20_VFD1:SI.In03Data,SPARE,MCM03
UL1_20_VFD1:SO.Out00Output,SPARE,MCM03
UL21_24_VFD1:I.In_0,UL21_24_VFD1_DISC DISCONNECT AUX,MCM03
UL21_24_VFD1:I.In_1,SPARE,MCM03
UL21_24_VFD1:I.In_2,SPARE,MCM03
UL21_24_VFD1:I.In_3,SPARE,MCM03
UL21_24_VFD1:I.IO_0,SPARE,MCM03
UL21_24_VFD1:I.IO_1,SPARE,MCM03
UL21_24_VFD1:SI.In00Data,SPARE,MCM03
UL21_24_VFD1:SI.In01Data,SPARE,MCM03
UL21_24_VFD1:SI.In02Data,SPARE,MCM03
UL21_24_VFD1:SI.In03Data,SPARE,MCM03
UL21_24_VFD1:SO.Out00Output,SPARE,MCM03
UL4_14_VFD1:I.In_0,UL4_14_VFD1_DISC DISCONNECT AUX,MCM03
UL4_14_VFD1:I.In_1,UL4_14_ENC1 ENCODER,MCM03
UL4_14_VFD1:I.In_2,UL4_14_TPE1 TRACKING PHOTOEYE,MCM03
UL4_14_VFD1:I.In_3,SPARE,MCM03
UL4_14_VFD1:O.IO_0,UL4_14_BCN1_A AMBER BEACON LIGHT,MCM03
UL4_14_VFD1:O.IO_1,UL4_14_BCN1_R RED BEACON LIGHT,MCM03
UL4_14_VFD1:SI.In00Data,UL4_14_EPC1 E-STOP PULLCORD,MCM03
UL4_14_VFD1:SI.In01Data,UL4_14_EPC1_2 E-STOP PULLCORD,MCM03
UL4_14_VFD1:SI.In02Data,UL4_14_EPC2 E-STOP PULLCORD,MCM03
UL4_14_VFD1:SI.In03Data,UL4_14_EPC2_2 E-STOP PULLCORD,MCM03
UL4_14_VFD1:SO.Out00Output,SPARE,MCM03
UL4_20_VFD1:I.In_0,UL4_20_VFD1_DISC DISCONNECT AUX,MCM03
UL4_20_VFD1:I.In_1,SPARE,MCM03
UL4_20_VFD1:I.In_2,SPARE,MCM03
UL4_20_VFD1:I.In_3,SPARE,MCM03
UL4_20_VFD1:I.IO_0,SPARE,MCM03
UL4_20_VFD1:I.IO_1,SPARE,MCM03
UL4_20_VFD1:SI.In00Data,SPARE,MCM03
UL4_20_VFD1:SI.In01Data,SPARE,MCM03
UL4_20_VFD1:SI.In02Data,SPARE,MCM03
UL4_20_VFD1:SI.In03Data,SPARE,MCM03
UL4_20_VFD1:SO.Out00Output,SPARE,MCM03
UL7_20_VFD1:I.In_0,UL7_20_VFD1_DISC DISCONNECT AUX,MCM03
UL7_20_VFD1:I.In_1,SPARE,MCM03
UL7_20_VFD1:I.In_2,SPARE,MCM03
UL7_20_VFD1:I.In_3,SPARE,MCM03
UL7_20_VFD1:I.IO_0,SPARE,MCM03
UL7_20_VFD1:I.IO_1,SPARE,MCM03
UL7_20_VFD1:SI.In00Data,SPARE,MCM03
UL7_20_VFD1:SI.In01Data,SPARE,MCM03
UL7_20_VFD1:SI.In02Data,SPARE,MCM03
UL7_20_VFD1:SI.In03Data,SPARE,MCM03
UL7_20_VFD1:SO.Out00Output,SPARE,MCM03
UL11_14_VFD1:I.In_0,UL11_14_VFD1_DISC DISCONNECT AUX,MCM03
UL11_14_VFD1:I.In_1,UL11_14_ENC1 ENCODER,MCM03
UL11_14_VFD1:I.In_2,UL11_14_TPE1 TRACKING PHOTOEYE,MCM03
UL11_14_VFD1:I.In_3,SPARE,MCM03
UL11_14_VFD1:O.IO_0,UL11_14_BCN1_A AMBER BEACON LIGHT,MCM03
UL11_14_VFD1:O.IO_1,UL11_14_BCN1_R RED BEACON LIGHT,MCM03
UL11_14_VFD1:SI.In00Data,UL11_14_EPC1 E-STOP PULLCORD,MCM03
UL11_14_VFD1:SI.In01Data,UL11_14_EPC1_2 E-STOP PULLCORD,MCM03
UL11_14_VFD1:SI.In02Data,UL11_14_EPC2 E-STOP PULLCORD,MCM03
UL11_14_VFD1:SI.In03Data,UL11_14_EPC2_2 E-STOP PULLCORD,MCM03
UL11_14_VFD1:SO.Out00Output,SPARE,MCM03
UL11_15_VFD1:I.In_0,UL11_15_VFD1_DISC DISCONNECT AUX,MCM03
UL11_15_VFD1:I.In_1,UL11_15_ENC1 ENCODER,MCM03
UL11_15_VFD1:I.In_2,UL11_15_TPE1 TRACKING PHOTOEYE,MCM03
UL11_15_VFD1:I.In_3,SPARE,MCM03
UL11_15_VFD1:O.IO_0,UL11_14_BCN2_A AMBER BEACON LIGHT,MCM03
UL11_15_VFD1:O.IO_1,UL11_14_BCN2_R RED BEACON LIGHT,MCM03
UL11_15_VFD1:SI.In00Data,SPARE,MCM03
UL11_15_VFD1:SI.In01Data,SPARE,MCM03
UL11_15_VFD1:SI.In02Data,SPARE,MCM03
UL11_15_VFD1:SI.In03Data,SPARE,MCM03
UL11_15_VFD1:SO.Out00Output,SPARE,MCM03
UL11_16_VFD1:I.In_0,UL11_16_VFD1_DISC DISCONNECT AUX,MCM03
UL11_16_VFD1:I.In_1,UL11_16_ENC1 ENCODER,MCM03
UL11_16_VFD1:I.In_2,UL11_16_TPE1 TRACKING PHOTOEYE,MCM03
UL11_16_VFD1:I.In_3,SPARE,MCM03
UL11_16_VFD1:I.IO_0,UL11_14_S1_PB START PUSHBUTTON,MCM03
UL11_16_VFD1:O.IO_1,UL11_14_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL11_16_VFD1:SI.In00Data,SPARE,MCM03
UL11_16_VFD1:SI.In01Data,SPARE,MCM03
UL11_16_VFD1:SI.In02Data,SPARE,MCM03
UL11_16_VFD1:SI.In03Data,SPARE,MCM03
UL11_16_VFD1:SO.Out00Output,SPARE,MCM03
UL11_17_VFD1:I.In_0,UL11_17_VFD1_DISC DISCONNECT AUX,MCM03
UL11_17_VFD1:I.In_1,UL11_17_ENC1 ENCODER,MCM03
UL11_17_VFD1:I.In_2,UL11_17_TPE1 TRACKING PHOTOEYE,MCM03
UL11_17_VFD1:I.In_3,SPARE,MCM03
UL11_17_VFD1:I.IO_0,UL11_14_S2_PB START PUSHBUTTON,MCM03
UL11_17_VFD1:O.IO_1,UL11_14_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL11_17_VFD1:SI.In00Data,SPARE,MCM03
UL11_17_VFD1:SI.In01Data,SPARE,MCM03
UL11_17_VFD1:SI.In02Data,SPARE,MCM03
UL11_17_VFD1:SI.In03Data,SPARE,MCM03
UL11_19_VFD1:I.In_0,UL11_19_VFD1_DISC DISCONNECT AUX,MCM03
UL11_19_VFD1:I.In_1,UL11_19_ENC1 ENCODER,MCM03
UL11_19_VFD1:I.In_2,UL11_19_TPE1 TRACKING PHOTOEYE,MCM03
UL11_19_VFD1:I.In_3,UL11_19_TPE2 TRACKING PHOTOEYE,MCM03
UL11_19_VFD1:I.IO_0,SPARE,MCM03
UL11_19_VFD1:I.IO_1,SPARE,MCM03
UL11_19_VFD1:SI.In00Data,SPARE,MCM03
UL11_19_VFD1:SI.In01Data,SPARE,MCM03
UL11_19_VFD1:SI.In02Data,SPARE,MCM03
UL11_19_VFD1:SI.In03Data,SPARE,MCM03
UL11_19_VFD1:SO.Out00Output,SPARE,MCM03
UL13_13_VFD1:I.In_0,UL13_13_VFD1_DISC DISCONNECT AUX,MCM03
UL13_13_VFD1:I.In_1,UL13_13_ENC1 ENCODER,MCM03
UL13_13_VFD1:I.In_2,UL13_13_TPE1 TRACKING PHOTOEYE,MCM03
UL13_13_VFD1:I.In_3,SPARE,MCM03
UL13_13_VFD1:O.IO_0,UL13_13_BCN1_A AMBER BEACON LIGHT,MCM03
UL13_13_VFD1:O.IO_1,UL13_13_BCN1_R RED BEACON LIGHT,MCM03
UL13_13_VFD1:SI.In00Data,UL13_13_EPC1 E-STOP PULLCORD,MCM03
UL13_13_VFD1:SI.In01Data,UL13_13_EPC1_2 E-STOP PULLCORD,MCM03
UL13_13_VFD1:SI.In02Data,UL13_13_EPC2 E-STOP PULLCORD,MCM03
UL13_13_VFD1:SI.In03Data,UL13_13_EPC2_2 E-STOP PULLCORD,MCM03
UL13_13_VFD1:SO.Out00Output,SPARE,MCM03
UL13_14_VFD1:I.In_0,UL13_14_VFD1_DISC DISCONNECT AUX,MCM03
UL13_14_VFD1:I.In_1,UL13_14_ENC1 ENCODER,MCM03
UL13_14_VFD1:I.In_2,UL13_14_TPE1 TRACKING PHOTOEYE,MCM03
UL13_14_VFD1:I.In_3,SPARE,MCM03
UL13_14_VFD1:O.IO_0,UL13_13_BCN2_R RED BEACON LIGHT,MCM03
UL13_14_VFD1:I.IO_1,SPARE,MCM03
UL13_14_VFD1:SI.In00Data,SPARE,MCM03
UL13_14_VFD1:SI.In01Data,SPARE,MCM03
UL13_14_VFD1:SI.In02Data,SPARE,MCM03
UL13_14_VFD1:SI.In03Data,SPARE,MCM03
UL13_14_VFD1:SO.Out00Output,SPARE,MCM03
UL13_15_VFD1:I.In_0,UL13_15_VFD1_DISC DISCONNECT AUX,MCM03
UL13_15_VFD1:I.In_1,UL13_15_ENC1 ENCODER,MCM03
UL13_15_VFD1:I.In_2,UL13_15_TPE1 TRACKING PHOTOEYE,MCM03
UL13_15_VFD1:I.In_3,SPARE,MCM03
UL13_15_VFD1:I.IO_0,UL13_13_S1_PB START PUSHBUTTON,MCM03
UL13_15_VFD1:O.IO_1,UL13_13_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL13_15_VFD1:SI.In00Data,SPARE,MCM03
UL13_15_VFD1:SI.In01Data,SPARE,MCM03
UL13_15_VFD1:SI.In02Data,SPARE,MCM03
UL13_15_VFD1:SI.In03Data,SPARE,MCM03
UL13_15_VFD1:SO.Out00Output,SPARE,MCM03
UL13_16_VFD1:I.In_0,UL13_16_VFD1_DISC DISCONNECT AUX,MCM03
UL13_16_VFD1:I.In_1,UL13_16_ENC1 ENCODER,MCM03
UL13_16_VFD1:I.In_2,UL13_16_TPE1 TRACKING PHOTOEYE,MCM03
UL13_16_VFD1:I.In_3,SPARE,MCM03
UL13_16_VFD1:I.IO_0,UL13_13_S2_PB START PUSHBUTTON,MCM03
UL13_16_VFD1:O.IO_1,UL13_13_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL13_16_VFD1:SI.In00Data,SPARE,MCM03
UL13_16_VFD1:SI.In01Data,SPARE,MCM03
UL13_16_VFD1:SI.In02Data,SPARE,MCM03
UL13_16_VFD1:SI.In03Data,SPARE,MCM03
UL13_16_VFD1:SO.Out00Output,SPARE,MCM03
UL13_18_VFD1:I.In_0,UL13_18_VFD1_DISC DISCONNECT AUX,MCM03
UL13_18_VFD1:I.In_1,UL13_18_ENC1 ENCODER,MCM03
UL13_18_VFD1:I.In_2,UL13_18_TPE1 TRACKING PHOTOEYE,MCM03
UL13_18_VFD1:I.In_3,UL13_18_TPE2 TRACKING PHOTOEYE,MCM03
UL13_18_VFD1:I.IO_0,SPARE,MCM03
UL13_18_VFD1:I.IO_1,SPARE,MCM03
UL13_18_VFD1:SI.In00Data,SPARE,MCM03
UL13_18_VFD1:SI.In01Data,SPARE,MCM03
UL13_18_VFD1:SI.In02Data,SPARE,MCM03
UL13_18_VFD1:SI.In03Data,SPARE,MCM03
UL13_18_VFD1:SO.Out00Output,SPARE,MCM03
UL18_17_VFD1:I.In_0,UL18_17_VFD1_DISC DISCONNECT AUX,MCM03
UL18_17_VFD1:I.In_1,UL18_17_ENC1 ENCODER,MCM03
UL18_17_VFD1:I.In_2,UL18_17_TPE1 TRACKING PHOTOEYE,MCM03
UL18_17_VFD1:I.In_3,SPARE,MCM03
UL18_17_VFD1:O.IO_0,UL18_17_BCN1_A AMBER BEACON LIGHT,MCM03
UL18_17_VFD1:O.IO_1,UL18_17_BCN1_R RED BEACON LIGHT,MCM03
UL18_17_VFD1:SI.In00Data,UL18_17_EPC1 E-STOP PULLCORD,MCM03
UL18_17_VFD1:SI.In01Data,UL18_17_EPC1_2 E-STOP PULLCORD,MCM03
UL18_17_VFD1:SI.In02Data,UL18_17_EPC2 E-STOP PULLCORD,MCM03
UL18_17_VFD1:SI.In03Data,UL18_17_EPC2_2 E-STOP PULLCORD,MCM03
UL18_17_VFD1:SO.Out00Output,SPARE,MCM03
UL18_18_VFD1:I.In_0,UL18_18_VFD1_DISC DISCONNECT AUX,MCM03
UL18_18_VFD1:I.In_1,UL18_18_ENC1 ENCODER,MCM03
UL18_18_VFD1:I.In_2,UL18_18_TPE1 TRACKING PHOTOEYE,MCM03
UL18_18_VFD1:I.In_3,SPARE,MCM03
UL18_18_VFD1:O.IO_0,UL18_17_BCN2_R RED BEACON LIGHT,MCM03
UL18_18_VFD1:I.IO_1,SPARE,MCM03
UL18_18_VFD1:SI.In00Data,SPARE,MCM03
UL18_18_VFD1:SI.In01Data,SPARE,MCM03
UL18_18_VFD1:SI.In02Data,SPARE,MCM03
UL18_18_VFD1:SI.In03Data,SPARE,MCM03
UL18_18_VFD1:SO.Out00Output,SPARE,MCM03
UL18_19_VFD1:I.In_0,UL18_19_VFD1_DISC DISCONNECT AUX,MCM03
UL18_19_VFD1:I.In_1,UL18_19_ENC1 ENCODER,MCM03
UL18_19_VFD1:I.In_2,UL18_19_TPE1 TRACKING PHOTOEYE,MCM03
UL18_19_VFD1:I.In_3,SPARE,MCM03
UL18_19_VFD1:I.IO_0,UL18_17_S1_PB START PUSHBUTTON,MCM03
UL18_19_VFD1:O.IO_1,UL18_17_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL18_19_VFD1:SI.In00Data,SPARE,MCM03
UL18_19_VFD1:SI.In01Data,SPARE,MCM03
UL18_19_VFD1:SI.In02Data,SPARE,MCM03
UL18_19_VFD1:SI.In03Data,SPARE,MCM03
UL18_19_VFD1:SO.Out00Output,SPARE,MCM03
UL18_20_VFD1:I.In_0,UL18_20_VFD1_DISC DISCONNECT AUX,MCM03
UL18_20_VFD1:I.In_1,UL18_20_ENC1 ENCODER,MCM03
UL18_20_VFD1:I.In_2,UL18_20_TPE1 TRACKING PHOTOEYE,MCM03
UL18_20_VFD1:I.In_3,SPARE,MCM03
UL18_20_VFD1:I.IO_0,UL18_17_S2_PB START PUSHBUTTON,MCM03
UL18_20_VFD1:O.IO_1,UL18_17_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL18_20_VFD1:SI.In00Data,SPARE,MCM03
UL18_20_VFD1:SI.In01Data,SPARE,MCM03
UL18_20_VFD1:SI.In02Data,SPARE,MCM03
UL18_20_VFD1:SI.In03Data,SPARE,MCM03
UL18_20_VFD1:SO.Out00Output,SPARE,MCM03
UL18_22_VFD1:I.In_0,UL18_22_VFD1_DISC DISCONNECT AUX,MCM03
UL18_22_VFD1:I.In_1,UL18_22_ENC1 ENCODER,MCM03
UL18_22_VFD1:I.In_2,UL18_22_TPE1 TRACKING PHOTOEYE,MCM03
UL18_22_VFD1:I.In_3,UL18_22_TPE2 TRACKING PHOTOEYE,MCM03
UL18_22_VFD1:I.IO_0,SPARE,MCM03
UL18_22_VFD1:I.IO_1,SPARE,MCM03
UL18_22_VFD1:SI.In00Data,SPARE,MCM03
UL18_22_VFD1:SI.In01Data,SPARE,MCM03
UL18_22_VFD1:SI.In02Data,SPARE,MCM03
UL18_22_VFD1:SI.In03Data,SPARE,MCM03
UL18_22_VFD1:SO.Out00Output,SPARE,MCM03
UL1_14_VFD1:I.In_0,UL1_14_VFD1_DISC DISCONNECT AUX,MCM03
UL1_14_VFD1:I.In_1,UL1_14_ENC1 ENCODER,MCM03
UL1_14_VFD1:I.In_2,UL1_14_TPE1 TRACKING PHOTOEYE,MCM03
UL1_14_VFD1:I.In_3,SPARE,MCM03
UL1_14_VFD1:O.IO_0,UL1_14_BCN1_A AMBER BEACON LIGHT,MCM03
UL1_14_VFD1:O.IO_1,UL1_14_BCN1_R RED BEACON LIGHT,MCM03
UL1_14_VFD1:SI.In00Data,UL1_14_EPC1 E-STOP PULLCORD,MCM03
UL1_14_VFD1:SI.In01Data,UL1_14_EPC1_2 E-STOP PULLCORD,MCM03
UL1_14_VFD1:SI.In02Data,UL1_14_EPC2 E-STOP PULLCORD,MCM03
UL1_14_VFD1:SI.In03Data,UL1_14_EPC2_2 E-STOP PULLCORD,MCM03
UL1_14_VFD1:SO.Out00Output,SPARE,MCM03
UL1_15_VFD1:I.In_0,UL1_15_VFD1_DISC DISCONNECT AUX,MCM03
UL1_15_VFD1:I.In_1,UL1_15_ENC1 ENCODER,MCM03
UL1_15_VFD1:I.In_2,UL1_15_TPE1 TRACKING PHOTOEYE,MCM03
UL1_15_VFD1:I.In_3,SPARE,MCM03
UL1_15_VFD1:O.IO_0,UL1_14_BCN2_A AMBER BEACON LIGHT,MCM03
UL1_15_VFD1:O.IO_1,UL1_14_BCN2_R RED BEACON LIGHT,MCM03
UL1_15_VFD1:SI.In00Data,SPARE,MCM03
UL1_15_VFD1:SI.In01Data,SPARE,MCM03
UL1_15_VFD1:SI.In02Data,SPARE,MCM03
UL1_15_VFD1:SI.In03Data,SPARE,MCM03
UL1_15_VFD1:SO.Out00Output,SPARE,MCM03
UL1_16_VFD1:I.In_0,UL1_16_VFD1_DISC DISCONNECT AUX,MCM03
UL1_16_VFD1:I.In_1,UL1_16_ENC1 ENCODER,MCM03
UL1_16_VFD1:I.In_2,UL1_16_TPE1 TRACKING PHOTOEYE,MCM03
UL1_16_VFD1:I.In_3,SPARE,MCM03
UL1_16_VFD1:I.IO_0,UL1_14_S1_PB START PUSHBUTTON,MCM03
UL1_16_VFD1:O.IO_1,UL1_14_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL1_16_VFD1:SI.In00Data,SPARE,MCM03
UL1_16_VFD1:SI.In01Data,SPARE,MCM03
UL1_16_VFD1:SI.In02Data,SPARE,MCM03
UL1_16_VFD1:SI.In03Data,SPARE,MCM03
UL1_16_VFD1:SO.Out00Output,SPARE,MCM03
UL1_17_VFD1:I.In_0,UL1_17_VFD1_DISC DISCONNECT AUX,MCM03
UL1_17_VFD1:I.In_1,UL1_17_ENC1 ENCODER,MCM03
UL1_17_VFD1:I.In_2,UL1_17_TPE1 TRACKING PHOTOEYE,MCM03
UL1_17_VFD1:I.In_3,SPARE,MCM03
UL1_17_VFD1:I.IO_0,UL1_14_S2_PB START PUSHBUTTON,MCM03
UL1_17_VFD1:O.IO_1,UL1_14_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL1_17_VFD1:SI.In00Data,SPARE,MCM03
UL1_17_VFD1:SI.In01Data,SPARE,MCM03
UL1_17_VFD1:SI.In02Data,SPARE,MCM03
UL1_17_VFD1:SI.In03Data,SPARE,MCM03
UL1_17_VFD1:SO.Out00Output,SPARE,MCM03
UL1_19_VFD1:I.In_0,UL1_19_VFD1_DISC DISCONNECT AUX,MCM03
UL1_19_VFD1:I.In_1,UL1_19_ENC1 ENCODER,MCM03
UL1_19_VFD1:I.In_2,UL1_19_TPE1 TRACKING PHOTOEYE,MCM03
UL1_19_VFD1:I.In_3,UL1_19_TPE2 TRACKING PHOTOEYE,MCM03
UL1_19_VFD1:I.IO_0,SPARE,MCM03
UL1_19_VFD1:I.IO_1,SPARE,MCM03
UL1_19_VFD1:SI.In00Data,SPARE,MCM03
UL1_19_VFD1:SI.In01Data,SPARE,MCM03
UL1_19_VFD1:SI.In02Data,SPARE,MCM03
UL1_19_VFD1:SI.In03Data,SPARE,MCM03
UL1_19_VFD1:SO.Out00Output,SPARE,MCM03
UL21_18_VFD1:I.In_0,UL21_18_VFD1_DISC DISCONNECT AUX,MCM03
UL21_18_VFD1:I.In_1,UL21_18_ENC1 ENCODER,MCM03
UL21_18_VFD1:I.In_2,UL21_18_TPE1 TRACKING PHOTOEYE,MCM03
UL21_18_VFD1:I.In_3,SPARE,MCM03
UL21_18_VFD1:O.IO_0,UL21_18_BCN1_A AMBER BEACON LIGHT,MCM03
UL21_18_VFD1:O.IO_1,UL21_18_BCN1_R RED BEACON LIGHT,MCM03
UL21_18_VFD1:SI.In00Data,UL21_18_EPC1 E-STOP PULLCORD,MCM03
UL21_18_VFD1:SI.In01Data,UL21_18_EPC1_2 E-STOP PULLCORD,MCM03
UL21_18_VFD1:SI.In02Data,UL21_18_EPC2 E-STOP PULLCORD,MCM03
UL21_18_VFD1:SI.In03Data,UL21_18_EPC2_2 E-STOP PULLCORD,MCM03
UL21_18_VFD1:SO.Out00Output,SPARE,MCM03
UL21_19_VFD1:I.In_0,UL21_19_VFD1_DISC DISCONNECT AUX,MCM03
UL21_19_VFD1:I.In_1,UL21_19_ENC1 ENCODER,MCM03
UL21_19_VFD1:I.In_2,UL21_19_TPE1 TRACKING PHOTOEYE,MCM03
UL21_19_VFD1:I.In_3,SPARE,MCM03
UL21_19_VFD1:O.IO_0,UL21_18_BCN2_R RED BEACON LIGHT,MCM03
UL21_19_VFD1:I.IO_1,SPARE,MCM03
UL21_19_VFD1:SI.In00Data,SPARE,MCM03
UL21_19_VFD1:SI.In01Data,SPARE,MCM03
UL21_19_VFD1:SI.In02Data,SPARE,MCM03
UL21_19_VFD1:SI.In03Data,SPARE,MCM03
UL21_19_VFD1:SO.Out00Output,SPARE,MCM03
UL21_20_VFD1:I.In_0,UL21_20_VFD1_DISC DISCONNECT AUX,MCM03
UL21_20_VFD1:I.In_1,UL21_20_ENC1 ENCODER,MCM03
UL21_20_VFD1:I.In_2,UL21_20_TPE1 TRACKING PHOTOEYE,MCM03
UL21_20_VFD1:I.In_3,SPARE,MCM03
UL21_20_VFD1:I.IO_0,UL21_18_S1_PB START PUSHBUTTON,MCM03
UL21_20_VFD1:O.IO_1,UL21_18_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL21_20_VFD1:SI.In00Data,SPARE,MCM03
UL21_20_VFD1:SI.In01Data,SPARE,MCM03
UL21_20_VFD1:SI.In02Data,SPARE,MCM03
UL21_20_VFD1:SI.In03Data,SPARE,MCM03
UL21_20_VFD1:SO.Out00Output,SPARE,MCM03
UL21_21_VFD1:I.In_0,UL21_21_VFD1_DISC DISCONNECT AUX,MCM03
UL21_21_VFD1:I.In_1,UL21_21_ENC1 ENCODER,MCM03
UL21_21_VFD1:I.In_2,UL21_21_TPE1 TRACKING PHOTOEYE,MCM03
UL21_21_VFD1:I.In_3,SPARE,MCM03
UL21_21_VFD1:I.IO_0,UL21_18_S2_PB START PUSHBUTTON,MCM03
UL21_21_VFD1:O.IO_1,UL21_18_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL21_21_VFD1:SI.In00Data,SPARE,MCM03
UL21_21_VFD1:SI.In01Data,SPARE,MCM03
UL21_21_VFD1:SI.In02Data,SPARE,MCM03
UL21_21_VFD1:SI.In03Data,SPARE,MCM03
UL21_21_VFD1:SO.Out00Output,SPARE,MCM03
UL21_23_VFD1:I.In_0,UL21_23_VFD1_DISC DISCONNECT AUX,MCM03
UL21_23_VFD1:I.In_1,UL21_23_ENC1 ENCODER,MCM03
UL21_23_VFD1:I.In_2,UL21_23_TPE1 TRACKING PHOTOEYE,MCM03
UL21_23_VFD1:I.In_3,UL21_23_TPE2 TRACKING PHOTOEYE,MCM03
UL21_23_VFD1:I.IO_0,SPARE,MCM03
UL21_23_VFD1:I.IO_1,SPARE,MCM03
UL21_23_VFD1:SI.In00Data,SPARE,MCM03
UL21_23_VFD1:SI.In01Data,SPARE,MCM03
UL21_23_VFD1:SI.In02Data,SPARE,MCM03
UL21_23_VFD1:SI.In03Data,SPARE,MCM03
UL21_23_VFD1:SO.Out00Output,SPARE,MCM03
UL4_15_VFD1:I.In_0,UL4_15_VFD1_DISC DISCONNECT AUX,MCM03
UL4_15_VFD1:I.In_1,UL4_15_ENC1 ENCODER,MCM03
UL4_15_VFD1:I.In_2,UL4_15_TPE1 TRACKING PHOTOEYE,MCM03
UL4_15_VFD1:I.In_3,SPARE,MCM03
UL4_15_VFD1:O.IO_0,UL4_14_BCN2_A AMBER BEACON LIGHT,MCM03
UL4_15_VFD1:O.IO_1,UL4_14_BCN2_R RED BEACON LIGHT,MCM03
UL4_15_VFD1:SI.In00Data,SPARE,MCM03
UL4_15_VFD1:SI.In01Data,SPARE,MCM03
UL4_15_VFD1:SI.In02Data,SPARE,MCM03
UL4_15_VFD1:SI.In03Data,SPARE,MCM03
UL4_15_VFD1:SO.Out00Output,SPARE,MCM03
UL4_16_VFD1:I.In_0,UL4_16_VFD1_DISC DISCONNECT AUX,MCM03
UL4_16_VFD1:I.In_1,UL4_16_ENC1 ENCODER,MCM03
UL4_16_VFD1:I.In_2,UL4_16_TPE1 TRACKING PHOTOEYE,MCM03
UL4_16_VFD1:I.In_3,SPARE,MCM03
UL4_16_VFD1:I.IO_0,UL4_14_S1_PB START PUSHBUTTON,MCM03
UL4_16_VFD1:O.IO_1,UL4_14_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL4_16_VFD1:SI.In00Data,SPARE,MCM03
UL4_16_VFD1:SI.In01Data,SPARE,MCM03
UL4_16_VFD1:SI.In02Data,SPARE,MCM03
UL4_16_VFD1:SI.In03Data,SPARE,MCM03
UL4_16_VFD1:SO.Out00Output,SPARE,MCM03
UL4_17_VFD1:I.In_0,UL4_17_VFD1_DISC DISCONNECT AUX,MCM03
UL4_17_VFD1:I.In_1,UL4_17_ENC1 ENCODER,MCM03
UL4_17_VFD1:I.In_2,UL4_17_TPE1 TRACKING PHOTOEYE,MCM03
UL4_17_VFD1:I.In_3,SPARE,MCM03
UL4_17_VFD1:I.IO_0,UL4_14_S2_PB START PUSHBUTTON,MCM03
UL4_17_VFD1:O.IO_1,UL4_14_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL4_17_VFD1:SI.In00Data,SPARE,MCM03
UL4_17_VFD1:SI.In01Data,SPARE,MCM03
UL4_17_VFD1:SI.In02Data,SPARE,MCM03
UL4_17_VFD1:SI.In03Data,SPARE,MCM03
UL4_17_VFD1:SO.Out00Output,SPARE,MCM03
UL4_19_VFD1:I.In_0,UL4_19_VFD1_DISC DISCONNECT AUX,MCM03
UL4_19_VFD1:I.In_1,UL4_19_ENC1 ENCODER,MCM03
UL4_19_VFD1:I.In_2,UL4_19_TPE1 TRACKING PHOTOEYE,MCM03
UL4_19_VFD1:I.In_3,UL4_19_TPE2 TRACKING PHOTOEYE,MCM03
UL4_19_VFD1:I.IO_0,SPARE,MCM03
UL4_19_VFD1:I.IO_1,SPARE,MCM03
UL4_19_VFD1:SI.In00Data,SPARE,MCM03
UL4_19_VFD1:SI.In01Data,SPARE,MCM03
UL4_19_VFD1:SI.In02Data,SPARE,MCM03
UL4_19_VFD1:SI.In03Data,SPARE,MCM03
UL4_19_VFD1:SO.Out00Output,SPARE,MCM03
UL7_14_VFD1:I.In_0,UL7_14_VFD1_DISC DISCONNECT AUX,MCM03
UL7_14_VFD1:I.In_1,UL7_14_ENC1 ENCODER,MCM03
UL7_14_VFD1:I.In_2,UL7_14_TPE1 TRACKING PHOTOEYE,MCM03
UL7_14_VFD1:I.In_3,SPARE,MCM03
UL7_14_VFD1:O.IO_0,UL7_14_BCN1_R RED BEACON LIGHT,MCM03
UL7_14_VFD1:O.IO_1,UL7_14_BCN2_R RED BEACON LIGHT,MCM03
UL7_14_VFD1:SI.In00Data,UL7_14_EPC1 E-STOP PULLCORD,MCM03
UL7_14_VFD1:SI.In01Data,UL7_14_EPC1_2 E-STOP PULLCORD,MCM03
UL7_14_VFD1:SI.In02Data,UL7_14_EPC2 E-STOP PULLCORD,MCM03
UL7_14_VFD1:SI.In03Data,UL7_14_EPC2_2 E-STOP PULLCORD,MCM03
UL7_14_VFD1:SO.Out00Output,SPARE,MCM03
UL7_15_VFD1:I.In_0,UL7_15_VFD1_DISC DISCONNECT AUX,MCM03
UL7_15_VFD1:I.In_1,UL7_15_ENC1 ENCODER,MCM03
UL7_15_VFD1:I.In_2,UL7_15_TPE1 TRACKING PHOTOEYE,MCM03
UL7_15_VFD1:I.In_3,SPARE,MCM03
UL7_15_VFD1:I.IO_0,UL7_14_S1_PB START PUSHBUTTON,MCM03
UL7_15_VFD1:O.IO_1,UL7_14_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
UL7_15_VFD1:SI.In00Data,SPARE,MCM03
UL7_15_VFD1:SI.In01Data,SPARE,MCM03
UL7_15_VFD1:SI.In02Data,SPARE,MCM03
UL7_15_VFD1:SI.In03Data,SPARE,MCM03
UL7_15_VFD1:SO.Out00Output,SPARE,MCM03
UL7_16_VFD1:I.In_0,UL7_16_VFD1_DISC DISCONNECT AUX,MCM03
UL7_16_VFD1:I.In_1,UL7_16_ENC1 ENCODER,MCM03
UL7_16_VFD1:I.In_2,UL7_16_TPE1 TRACKING PHOTOEYE,MCM03
UL7_16_VFD1:I.In_3,SPARE,MCM03
UL7_16_VFD1:I.IO_0,UL7_14_S2_PB START PUSHBUTTON,MCM03
UL7_16_VFD1:O.IO_1,UL7_14_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
UL7_16_VFD1:SI.In00Data,SPARE,MCM03
UL7_16_VFD1:SI.In01Data,SPARE,MCM03
UL7_16_VFD1:SI.In02Data,SPARE,MCM03
UL7_16_VFD1:SI.In03Data,SPARE,MCM03
UL7_16_VFD1:SO.Out00Output,SPARE,MCM03
UL7_17_VFD1:I.In_0,UL7_17_VFD1_DISC DISCONNECT AUX,MCM03
UL7_17_VFD1:I.In_1,UL7_17_ENC1 ENCODER,MCM03
UL7_17_VFD1:I.In_2,UL7_17_TPE1 TRACKING PHOTOEYE,MCM03
UL7_17_VFD1:I.In_3,SPARE,MCM03
UL7_17_VFD1:I.IO_0,SPARE,MCM03
UL7_17_VFD1:I.IO_1,SPARE,MCM03
UL7_17_VFD1:SI.In00Data,SPARE,MCM03
UL7_17_VFD1:SI.In01Data,SPARE,MCM03
UL7_17_VFD1:SI.In02Data,SPARE,MCM03
UL7_17_VFD1:SI.In03Data,SPARE,MCM03
UL7_17_VFD1:SO.Out00Output,SPARE,MCM03
UL7_19_VFD1:I.In_0,UL7_19_VFD1_DISC DISCONNECT AUX,MCM03
UL7_19_VFD1:I.In_1,UL7_19_ENC1 ENCODER,MCM03
UL7_19_VFD1:I.In_2,UL7_19_TPE1 TRACKING PHOTOEYE,MCM03
UL7_19_VFD1:I.In_3,UL7_19_TPE2 TRACKING PHOTOEYE,MCM03
UL7_19_VFD1:I.IO_0,SPARE,MCM03
UL7_19_VFD1:I.IO_1,SPARE,MCM03
UL7_19_VFD1:SI.In00Data,SPARE,MCM03
UL7_19_VFD1:SI.In01Data,SPARE,MCM03
UL7_19_VFD1:SI.In02Data,SPARE,MCM03
UL7_19_VFD1:SI.In03Data,SPARE,MCM03
UL7_19_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_4_VFD1:I.In_0,NCP1_4_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_4_VFD1:I.In_1,NCP1_3_TPE3 TRACKING PHOTOEYE,MCM03
NCP1_4_VFD1:I.In_2,NCP1_3_TPE4 TRACKING PHOTOEYE,MCM03
NCP1_4_VFD1:I.In_3,NCP1_3_TPE5 TRACKING PHOTOEYE,MCM03
NCP1_4_VFD1:I.IO_0,NCP1_3_TPE6 TRACKING PHOTOEYE,MCM03
NCP1_4_VFD1:I.IO_1,NCP1_3_TPE7 TRACKING PHOTOEYE,MCM03
NCP1_4_VFD1:SI.In00Data,SPARE,MCM03
NCP1_4_VFD1:SI.In01Data,SPARE,MCM03
NCP1_4_VFD1:SI.In02Data,SPARE,MCM03
NCP1_4_VFD1:SI.In03Data,SPARE,MCM03
NCP1_4_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_6_VFD1:I.In_0,NCP1_6_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_6_VFD1:I.In_1,SPARE,MCM03
NCP1_6_VFD1:I.In_2,NCP1_6_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_6_VFD1:I.In_3,SPARE,MCM03
NCP1_6_VFD1:I.IO_0,NCP1_8_S2_PB START PUSHBUTTON,MCM03
NCP1_6_VFD1:O.IO_1,NCP1_8_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_6_VFD1:SI.In00Data,SPARE,MCM03
NCP1_6_VFD1:SI.In01Data,SPARE,MCM03
NCP1_6_VFD1:SI.In02Data,SPARE,MCM03
NCP1_6_VFD1:SI.In03Data,SPARE,MCM03
NCP1_6_VFD1:SO.Out00Output,SPARE,MCM03
UL11_18_VFD1:I.In_0,UL11_18_VFD1_DISC DISCONNECT AUX,MCM03
UL11_18_VFD1:I.In_1,UL11_18_ENC1 ENCODER,MCM03
UL11_18_VFD1:I.In_2,SPARE,MCM03
UL11_18_VFD1:I.In_3,SPARE,MCM03
UL11_18_VFD1:I.IO_0,SPARE,MCM03
UL11_18_VFD1:I.IO_1,SPARE,MCM03
UL11_18_VFD1:SI.In00Data,SPARE,MCM03
UL11_18_VFD1:SI.In01Data,SPARE,MCM03
UL11_18_VFD1:SI.In02Data,SPARE,MCM03
UL11_18_VFD1:SI.In03Data,SPARE,MCM03
UL11_18_VFD1:SO.Out00Output,SPARE,MCM03
UL13_17_VFD1:I.In_0,UL13_17_VFD1_DISC DISCONNECT AUX,MCM03
UL13_17_VFD1:I.In_1,UL13_17_ENC1 ENCODER,MCM03
UL13_17_VFD1:I.In_2,SPARE,MCM03
UL13_17_VFD1:I.In_3,SPARE,MCM03
UL13_17_VFD1:I.IO_0,SPARE,MCM03
UL13_17_VFD1:I.IO_1,SPARE,MCM03
UL13_17_VFD1:SI.In00Data,SPARE,MCM03
UL13_17_VFD1:SI.In01Data,SPARE,MCM03
UL13_17_VFD1:SI.In02Data,SPARE,MCM03
UL13_17_VFD1:SI.In03Data,SPARE,MCM03
UL13_17_VFD1:SO.Out00Output,SPARE,MCM03
UL18_21_VFD1:I.In_0,UL18_21_VFD1_DISC DISCONNECT AUX,MCM03
UL18_21_VFD1:I.In_1,UL18_21_ENC1 ENCODER,MCM03
UL18_21_VFD1:I.In_2,SPARE,MCM03
UL18_21_VFD1:I.In_3,SPARE,MCM03
UL18_21_VFD1:I.IO_0,SPARE,MCM03
UL18_21_VFD1:I.IO_1,SPARE,MCM03
UL18_21_VFD1:SI.In00Data,SPARE,MCM03
UL18_21_VFD1:SI.In01Data,SPARE,MCM03
UL18_21_VFD1:SI.In02Data,SPARE,MCM03
UL18_21_VFD1:SI.In03Data,SPARE,MCM03
UL18_21_VFD1:SO.Out00Output,SPARE,MCM03
UL1_18_VFD1:I.In_0,UL1_18_VFD1_DISC DISCONNECT AUX,MCM03
UL1_18_VFD1:I.In_1,UL1_18_ENC1 ENCODER,MCM03
UL1_18_VFD1:I.In_2,SPARE,MCM03
UL1_18_VFD1:I.In_3,SPARE,MCM03
UL1_18_VFD1:I.IO_0,SPARE,MCM03
UL1_18_VFD1:I.IO_1,SPARE,MCM03
UL1_18_VFD1:SI.In00Data,SPARE,MCM03
UL1_18_VFD1:SI.In01Data,SPARE,MCM03
UL1_18_VFD1:SI.In02Data,SPARE,MCM03
UL1_18_VFD1:SI.In03Data,SPARE,MCM03
UL1_18_VFD1:SO.Out00Output,SPARE,MCM03
UL21_22_VFD1:I.In_0,UL21_22_VFD1_DISC DISCONNECT AUX,MCM03
UL21_22_VFD1:I.In_1,UL21_22_ENC1 ENCODER,MCM03
UL21_22_VFD1:I.In_2,SPARE,MCM03
UL21_22_VFD1:I.In_3,SPARE,MCM03
UL21_22_VFD1:I.IO_0,SPARE,MCM03
UL21_22_VFD1:I.IO_1,SPARE,MCM03
UL21_22_VFD1:SI.In00Data,SPARE,MCM03
UL21_22_VFD1:SI.In01Data,SPARE,MCM03
UL21_22_VFD1:SI.In02Data,SPARE,MCM03
UL21_22_VFD1:SI.In03Data,SPARE,MCM03
UL21_22_VFD1:SO.Out00Output,SPARE,MCM03
UL4_18_VFD1:I.In_0,UL4_18_VFD1_DISC DISCONNECT AUX,MCM03
UL4_18_VFD1:I.In_1,UL4_18_ENC1 ENCODER,MCM03
UL4_18_VFD1:I.In_2,SPARE,MCM03
UL4_18_VFD1:I.In_3,SPARE,MCM03
UL4_18_VFD1:I.IO_0,SPARE,MCM03
UL4_18_VFD1:I.IO_1,SPARE,MCM03
UL4_18_VFD1:SI.In00Data,SPARE,MCM03
UL4_18_VFD1:SI.In01Data,SPARE,MCM03
UL4_18_VFD1:SI.In02Data,SPARE,MCM03
UL4_18_VFD1:SI.In03Data,SPARE,MCM03
UL4_18_VFD1:SO.Out00Output,SPARE,MCM03
UL7_18_VFD1:I.In_0,UL7_18_VFD1_DISC DISCONNECT AUX,MCM03
UL7_18_VFD1:I.In_1,UL7_18_ENC1 ENCODER,MCM03
UL7_18_VFD1:I.In_2,SPARE,MCM03
UL7_18_VFD1:I.In_3,SPARE,MCM03
UL7_18_VFD1:I.IO_0,SPARE,MCM03
UL7_18_VFD1:I.IO_1,SPARE,MCM03
UL7_18_VFD1:SI.In00Data,SPARE,MCM03
UL7_18_VFD1:SI.In01Data,SPARE,MCM03
UL7_18_VFD1:SI.In02Data,SPARE,MCM03
UL7_18_VFD1:SI.In03Data,SPARE,MCM03
UL7_18_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_1_VFD1:I.In_0,NCP1_1_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_1_VFD1:I.In_1,NCP1_1_ENC1 ENCODER,MCM03
NCP1_1_VFD1:I.In_2,NCP1_1_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_1_VFD1:I.In_3,NCP1_1_TPE2 TRACKING PHOTOEYE,MCM03
NCP1_1_VFD1:O.IO_0,NCP1_1_BCN2_A AMBER BEACON LIGHT,MCM03
NCP1_1_VFD1:O.IO_1,NCP1_1_BCN2_R RED BEACON LIGHT,MCM03
NCP1_1_VFD1:SI.In00Data,NCP1_1_EPC1 E-STOP PULLCORD,MCM03
NCP1_1_VFD1:SI.In01Data,NCP1_1_EPC1_2 E-STOP PULLCORD,MCM03
NCP1_1_VFD1:SI.In02Data,NCP1_1_EPC2 E-STOP PULLCORD,MCM03
NCP1_1_VFD1:SI.In03Data,NCP1_1_EPC2_2 E-STOP PULLCORD,MCM03
NCP1_1_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_2_VFD1:I.In_0,NCP1_2_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_2_VFD1:I.In_1,NCP1_2_ENC1 ENCODER,MCM03
NCP1_2_VFD1:I.In_2,NCP1_2_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_2_VFD1:I.In_3,NCP1_2_TPE2 TRACKING PHOTOEYE,MCM03
NCP1_2_VFD1:I.IO_0,NCP1_1_JR1_PB JAM RESET PUSHBUTTON,MCM03
NCP1_2_VFD1:O.IO_1,NCP1_1_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT,MCM03
NCP1_2_VFD1:SI.In00Data,NCP1_2_EPC1 E-STOP PULLCORD,MCM03
NCP1_2_VFD1:SI.In01Data,NCP1_2_EPC1_2 E-STOP PULLCORD,MCM03
NCP1_2_VFD1:SI.In02Data,NCP1_2_EPC2 E-STOP PULLCORD,MCM03
NCP1_2_VFD1:SI.In03Data,NCP1_2_EPC2_2 E-STOP PULLCORD,MCM03
NCP1_2_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_3_VFD1:I.In_0,NCP1_3_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_3_VFD1:I.In_1,NCP1_3_ENC1 ENCODER,MCM03
NCP1_3_VFD1:I.In_2,NCP1_3_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_3_VFD1:I.In_3,NCP1_3_TPE2 TRACKING PHOTOEYE,MCM03
NCP1_3_VFD1:I.IO_0,SPARE,MCM03
NCP1_3_VFD1:I.IO_1,SPARE,MCM03
NCP1_3_VFD1:SI.In00Data,NCP1_3_EPC1 E-STOP PULLCORD,MCM03
NCP1_3_VFD1:SI.In01Data,NCP1_3_EPC1_2 E-STOP PULLCORD,MCM03
NCP1_3_VFD1:SI.In02Data,NCP1_3_EPC2 E-STOP PULLCORD,MCM03
NCP1_3_VFD1:SI.In03Data,NCP1_3_EPC2_2 E-STOP PULLCORD,MCM03
NCP1_3_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_5_VFD1:I.In_0,NCP1_5_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_5_VFD1:I.In_1,SPARE,MCM03
NCP1_5_VFD1:I.In_2,NCP1_5_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_5_VFD1:I.In_3,NCP1_5_TPE2 TRACKING PHOTOEYE,MCM03
NCP1_5_VFD1:I.IO_0,SPARE,MCM03
NCP1_5_VFD1:I.IO_1,SPARE,MCM03
NCP1_5_VFD1:SI.In00Data,SPARE,MCM03
NCP1_5_VFD1:SI.In01Data,SPARE,MCM03
NCP1_5_VFD1:SI.In02Data,SPARE,MCM03
NCP1_5_VFD1:SI.In03Data,SPARE,MCM03
NCP1_5_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_7_VFD1:I.In_0,NCP1_7_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_7_VFD1:I.In_1,SPARE,MCM03
NCP1_7_VFD1:I.In_2,NCP1_7_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_7_VFD1:I.In_3,SPARE,MCM03
NCP1_7_VFD1:I.IO_0,NCP1_8_S1_PB START PUSHBUTTON,MCM03
NCP1_7_VFD1:O.IO_1,NCP1_8_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_7_VFD1:SI.In00Data,SPARE,MCM03
NCP1_7_VFD1:SI.In01Data,SPARE,MCM03
NCP1_7_VFD1:SI.In02Data,SPARE,MCM03
NCP1_7_VFD1:SI.In03Data,SPARE,MCM03
NCP1_7_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_8_VFD1:I.In_0,NCP1_8_VFD1_DISC DISCONNECT AUX,MCM03
NCP1_8_VFD1:I.In_1,SPARE,MCM03
NCP1_8_VFD1:I.In_2,NCP1_8_TPE1 TRACKING PHOTOEYE,MCM03
NCP1_8_VFD1:I.In_3,SPARE,MCM03
NCP1_8_VFD1:O.IO_0,NCP1_8_BCN1_R RED BEACON LIGHT,MCM03
NCP1_8_VFD1:I.IO_1,SPARE,MCM03
NCP1_8_VFD1:SI.In00Data,NCP1_8_EPC1 E-STOP PULLCORD,MCM03
NCP1_8_VFD1:SI.In01Data,NCP1_8_EPC1_2 E-STOP PULLCORD,MCM03
NCP1_8_VFD1:SI.In02Data,NCP1_8_EPC2 E-STOP PULLCORD,MCM03
NCP1_8_VFD1:SI.In03Data,NCP1_8_EPC2_2 E-STOP PULLCORD,MCM03
NCP1_8_VFD1:SO.Out00Output,SPARE,MCM03
NCP1_1_FIO1:O.Pt00.Data,NCP1_1_BCN1_R RED BEACON LIGHT,MCM03
NCP1_1_FIO1:I.Pt01.Data,SPARE,MCM03
NCP1_1_FIO1:O.Pt10.Data,NCP1_1_BCN3_A AMBER BEACON LIGHT,MCM03
NCP1_1_FIO1:O.Pt11.Data,NCP1_1_BCN3_H ALARM HORN,MCM03
NCP1_1_FIO1:I.Pt12.Data,NCP1_1_TPE4 TRACKING PHOTOEYE,MCM03
NCP1_1_FIO1:O.Pt13.Data,SPARE,MCM03
NCP1_1_FIO1:I.Pt14.Data,SPARE,MCM03
NCP1_1_FIO1:O.Pt15.Data,SPARE,MCM03
NCP1_1_FIO1:I.Pt02.Data,NCP1_1_S1_PB START PUSHBUTTON,MCM03
NCP1_1_FIO1:O.Pt03.Data,NCP1_1_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_1_FIO1:I.Pt04.Data,NCP1_1_S2_PB START PUSHBUTTON,MCM03
NCP1_1_FIO1:O.Pt05.Data,NCP1_1_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_1_FIO1:I.Pt06.Data,NCP1_1_TPE3 TRACKING PHOTOEYE,MCM03
NCP1_1_FIO1:O.Pt07.Data,SPARE,MCM03
NCP1_1_FIO1:I.Pt08.Data,NCP1_1_TPE5 TRACKING PHOTOEYE,MCM03
NCP1_1_FIO1:I.Pt09.Data,SPARE,MCM03
NCP1_2_FIO1:O.Pt00.Data,NCP1_2_BCN2_A AMBER BEACON LIGHT,MCM03
NCP1_2_FIO1:O.Pt01.Data,NCP1_2_BCN2_R RED BEACON LIGHT,MCM03
NCP1_2_FIO1:I.Pt10.Data,NCP1_2_TPE3 TRACKING PHOTOEYE,MCM03
NCP1_2_FIO1:I.Pt11.Data,NCP1_2_TPE4 TRACKING PHOTOEYE,MCM03
NCP1_2_FIO1:I.Pt12.Data,NCP1_2_TPE5 TRACKING PHOTOEYE,MCM03
NCP1_2_FIO1:O.Pt13.Data,SPARE,MCM03
NCP1_2_FIO1:I.Pt14.Data,SPARE,MCM03
NCP1_2_FIO1:O.Pt15.Data,SPARE,MCM03
NCP1_2_FIO1:O.Pt02.Data,NCP1_2_BCN1_R RED BEACON LIGHT,MCM03
NCP1_2_FIO1:O.Pt03.Data,NCP1_2_BCN3_A AMBER BEACON LIGHT,MCM03
NCP1_2_FIO1:I.Pt04.Data,NCP1_2_JR1_PB JAM RESET PUSHBUTTON,MCM03
NCP1_2_FIO1:O.Pt05.Data,NCP1_2_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT,MCM03
NCP1_2_FIO1:I.Pt06.Data,NCP1_2_S1_PB START PUSHBUTTON,MCM03
NCP1_2_FIO1:O.Pt07.Data,NCP1_2_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_2_FIO1:I.Pt08.Data,NCP1_2_S2_PB START PUSHBUTTON,MCM03
NCP1_2_FIO1:O.Pt09.Data,NCP1_2_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_3_FIO1:O.Pt00.Data,NCP1_3_BCN2_A AMBER BEACON LIGHT,MCM03
NCP1_3_FIO1:O.Pt01.Data,NCP1_3_BCN2_R RED BEACON LIGHT,MCM03
NCP1_3_FIO1:I.Pt10.Data,NCP1_3_JR3_PB JAM RESET PUSHBUTTON,MCM03
NCP1_3_FIO1:O.Pt11.Data,NCP1_3_JR3_PB_LT JAM RESET PUSHBUTTON LIGHT,MCM03
NCP1_3_FIO1:I.Pt12.Data,NCP1_3_S1_PB START PUSHBUTTON,MCM03
NCP1_3_FIO1:O.Pt13.Data,NCP1_3_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_3_FIO1:I.Pt14.Data,NCP1_3_S2_PB START PUSHBUTTON,MCM03
NCP1_3_FIO1:O.Pt15.Data,NCP1_3_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_3_FIO1:O.Pt02.Data,NCP1_3_BCN1_R RED BEACON LIGHT,MCM03
NCP1_3_FIO1:O.Pt03.Data,NCP1_3_BCN3_A AMBER BEACON LIGHT,MCM03
NCP1_3_FIO1:O.Pt04.Data,NCP1_3_BCN4_A AMBER BEACON LIGHT,MCM03
NCP1_3_FIO1:O.Pt05.Data,SPARE,MCM03
NCP1_3_FIO1:I.Pt06.Data,NCP1_3_JR1_PB JAM RESET PUSHBUTTON,MCM03
NCP1_3_FIO1:O.Pt07.Data,NCP1_3_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT,MCM03
NCP1_3_FIO1:I.Pt08.Data,NCP1_3_JR2_PB JAM RESET PUSHBUTTON,MCM03
NCP1_3_FIO1:O.Pt09.Data,NCP1_3_JR2_PB_LT JAM RESET PUSHBUTTON LIGHT,MCM03
NCP1_8_FIO1:O.Pt00.Data,NCP1_8_BCN2_R RED BEACON LIGHT,MCM03
NCP1_8_FIO1:O.Pt01.Data,NCP1_8_BCN2_H HORN,MCM03
NCP1_8_FIO1:I.Pt10.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt11.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt12.Data,SPARE,MCM03
NCP1_8_FIO1:O.Pt13.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt14.Data,SPARE,MCM03
NCP1_8_FIO1:O.Pt15.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt02.Data,NCP1_8_S1_PB START PUSHBUTTON,MCM03
NCP1_8_FIO1:O.Pt03.Data,NCP1_8_S1_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_8_FIO1:I.Pt04.Data,NCP1_8_S2_PB START PUSHBUTTON,MCM03
NCP1_8_FIO1:O.Pt05.Data,NCP1_8_S2_PB_LT START PUSHBUTTON LIGHT,MCM03
NCP1_8_FIO1:I.Pt06.Data,SPARE,MCM03
NCP1_8_FIO1:O.Pt07.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt08.Data,SPARE,MCM03
NCP1_8_FIO1:I.Pt09.Data,SPARE,MCM03
PDP5_FIO1:I.Pt00.Data,PDP5_CB1 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt01.Data,PDP5_CB2 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt10.Data,PDP5_CB9 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt11.Data,PDP5_CB10 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt12.Data,PDP5_PWM1 PDP5_PHASE MONITOR,MCM03
PDP5_FIO1:O.Pt13.Data,SPARE,MCM03
PDP5_FIO1:O.Pt15.Data,SPARE,MCM03
PDP5_FIO1:I.Pt02.Data,PDP5_CB3 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt03.Data,PDP5_CB4 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt04.Data,PDP5_CB5 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:O.Pt05.Data,SPARE,MCM03
PDP5_FIO1:I.Pt06.Data,PDP5_CB6 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:O.Pt07.Data,SPARE,MCM03
PDP5_FIO1:I.Pt08.Data,PDP5_CB7 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIO1:I.Pt09.Data,PDP5_CB8 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4,PDP5_CB11 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2,PDP5_CB12 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4,PDP5_CB21 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2,PDP5_CB22 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4,PDP5_CB23 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2,PDP5_CB24 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4,PDP5_CB25 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2,PDP5_CB26 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4,PDP5_CB13 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2,PDP5_CB14 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4,PDP5_CB15 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2,PDP5_CB16 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4,PDP5_CB17 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2,PDP5_CB18 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4,PDP5_CB19 CIRCUIT BREAKER MONITORING,MCM03
PDP5_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2,PDP5_CB20 CIRCUIT BREAKER MONITORING,MCM03
1 Name Description Subsystem
2 Local:5:I.Data.0 MCM03 S_PBLT START MCM03
3 Local:5:I.Data.1 MCM03 ST_PB STOP MCM03
4 Local:5:I.Data.10 SPARE MCM03
5 Local:5:I.Data.11 SPARE MCM03
6 Local:5:I.Data.12 SPARE MCM03
7 Local:5:I.Data.13 SPARE MCM03
8 Local:5:I.Data.14 SPARE MCM03
9 Local:5:I.Data.15 SPARE MCM03
10 Local:5:I.Data.2 MCM03 MF_PBLT MOTOR FAULT RESET MCM03
11 Local:5:I.Data.3 MCM03 JR_PBLT JAM RESET MCM03
12 Local:5:I.Data.4 MCM03 LAP_PBLT LOW AIR PRESSURE MCM03
13 Local:5:I.Data.5 MCM03 PBFR_PBLT POWER BRANCH FAULT RESET MCM03
14 Local:5:I.Data.6 MCM03 BATTERY_FAULT_UPS BATTERY FAULT MCM03
15 Local:5:I.Data.7 MCM03 ON_BATTERY ON BATTERY MCM03
16 Local:5:I.Data.8 MCM03 UPS_BATTERY_LOW UPS BATTERY LOW MCM03
17 Local:5:I.Data.9 MCM03 NAT_SWITCH ALARM NAT SWITCH MCM03
18 Local:7:I.Pt00.Data MCM03 FIRE_ALARM FIRE ALARM MCM03
19 Local:7:I.Pt01.Data SPARE MCM03
20 Local:7:I.Pt10.Data SPARE MCM03
21 Local:7:I.Pt11.Data SPARE MCM03
22 Local:7:I.Pt12.Data SPARE MCM03
23 Local:7:I.Pt13.Data SPARE MCM03
24 Local:7:I.Pt14.Data SPARE MCM03
25 Local:7:I.Pt15.Data SPARE MCM03
26 Local:7:I.Pt02.Data MCM03 ES_PB ES_PB_CH1 MCM03
27 Local:7:I.Pt03.Data MCM03 ES_PB ES_PB_CH2 MCM03
28 Local:7:I.Pt04.Data SPARE MCM03
29 Local:7:I.Pt05.Data SPARE MCM03
30 Local:7:I.Pt06.Data SPARE MCM03
31 Local:7:I.Pt07.Data SPARE MCM03
32 Local:7:I.Pt08.Data SPARE MCM03
33 Local:7:I.Pt09.Data SPARE MCM03
34 Local:6:O.Data.0 MCM03 ES_LT EMERGENCY STOP ACTUATED MCM03
35 Local:6:O.Data.1 MCM03 S_PBLT START LIGHT MCM03
36 Local:6:O.Data.10 SPARE MCM03
37 Local:6:O.Data.11 SPARE MCM03
38 Local:6:O.Data.12 SPARE MCM03
39 Local:6:O.Data.13 SPARE MCM03
40 Local:6:O.Data.14 SPARE MCM03
41 Local:6:O.Data.15 SPARE MCM03
42 Local:6:O.Data.2 MCM03 MF_PBLT MOTOR FAULT LIGHT MCM03
43 Local:6:O.Data.3 MCM03 JR_PBLT JAM RESTART LIGHT MCM03
44 Local:6:O.Data.4 MCM03 LAP_PBLT LOW AIR PRESSURE LIGHT MCM03
45 Local:6:O.Data.5 MCM03 PBFR_PBLT POWER BRANCH FAULT RESET LIGHT MCM03
46 Local:6:O.Data.6 SPARE MCM03
47 Local:6:O.Data.7 SPARE MCM03
48 Local:6:O.Data.8 SPARE MCM03
49 Local:6:O.Data.9 SPARE MCM03
50 UL11_20_VFD1:I.In_0 UL11_20_VFD1_DISC DISCONNECT AUX MCM03
51 UL11_20_VFD1:I.In_1 SPARE MCM03
52 UL11_20_VFD1:I.In_2 SPARE MCM03
53 UL11_20_VFD1:I.In_3 SPARE MCM03
54 UL11_20_VFD1:I.IO_0 SPARE MCM03
55 UL11_20_VFD1:I.IO_1 SPARE MCM03
56 UL11_20_VFD1:SI.In00Data SPARE MCM03
57 UL11_20_VFD1:SI.In01Data SPARE MCM03
58 UL11_20_VFD1:SI.In02Data SPARE MCM03
59 UL11_20_VFD1:SI.In03Data SPARE MCM03
60 UL11_20_VFD1:SO.Out00Output SPARE MCM03
61 UL13_19_VFD1:I.In_0 UL13_19_VFD1_DISC DISCONNECT AUX MCM03
62 UL13_19_VFD1:I.In_1 SPARE MCM03
63 UL13_19_VFD1:I.In_2 SPARE MCM03
64 UL13_19_VFD1:I.In_3 SPARE MCM03
65 UL13_19_VFD1:I.IO_0 SPARE MCM03
66 UL13_19_VFD1:I.IO_1 SPARE MCM03
67 UL13_19_VFD1:SI.In00Data SPARE MCM03
68 UL13_19_VFD1:SI.In01Data SPARE MCM03
69 UL13_19_VFD1:SI.In02Data SPARE MCM03
70 UL13_19_VFD1:SI.In03Data SPARE MCM03
71 UL13_19_VFD1:SO.Out00Output SPARE MCM03
72 UL18_23_VFD1:I.In_0 UL18_23_VFD1_DISC DISCONNECT AUX MCM03
73 UL18_23_VFD1:I.In_1 SPARE MCM03
74 UL18_23_VFD1:I.In_2 SPARE MCM03
75 UL18_23_VFD1:I.In_3 SPARE MCM03
76 UL18_23_VFD1:I.IO_0 SPARE MCM03
77 UL18_23_VFD1:I.IO_1 SPARE MCM03
78 UL18_23_VFD1:SI.In00Data SPARE MCM03
79 UL18_23_VFD1:SI.In01Data SPARE MCM03
80 UL18_23_VFD1:SI.In02Data SPARE MCM03
81 UL18_23_VFD1:SI.In03Data SPARE MCM03
82 UL18_23_VFD1:SO.Out00Output SPARE MCM03
83 UL1_20_VFD1:I.In_0 UL1_20_VFD1_DISC DISCONNECT AUX MCM03
84 UL1_20_VFD1:I.In_1 SPARE MCM03
85 UL1_20_VFD1:I.In_2 SPARE MCM03
86 UL1_20_VFD1:I.In_3 SPARE MCM03
87 UL1_20_VFD1:I.IO_0 SPARE MCM03
88 UL1_20_VFD1:I.IO_1 SPARE MCM03
89 UL1_20_VFD1:SI.In00Data SPARE MCM03
90 UL1_20_VFD1:SI.In01Data SPARE MCM03
91 UL1_20_VFD1:SI.In02Data SPARE MCM03
92 UL1_20_VFD1:SI.In03Data SPARE MCM03
93 UL1_20_VFD1:SO.Out00Output SPARE MCM03
94 UL21_24_VFD1:I.In_0 UL21_24_VFD1_DISC DISCONNECT AUX MCM03
95 UL21_24_VFD1:I.In_1 SPARE MCM03
96 UL21_24_VFD1:I.In_2 SPARE MCM03
97 UL21_24_VFD1:I.In_3 SPARE MCM03
98 UL21_24_VFD1:I.IO_0 SPARE MCM03
99 UL21_24_VFD1:I.IO_1 SPARE MCM03
100 UL21_24_VFD1:SI.In00Data SPARE MCM03
101 UL21_24_VFD1:SI.In01Data SPARE MCM03
102 UL21_24_VFD1:SI.In02Data SPARE MCM03
103 UL21_24_VFD1:SI.In03Data SPARE MCM03
104 UL21_24_VFD1:SO.Out00Output SPARE MCM03
105 UL4_14_VFD1:I.In_0 UL4_14_VFD1_DISC DISCONNECT AUX MCM03
106 UL4_14_VFD1:I.In_1 UL4_14_ENC1 ENCODER MCM03
107 UL4_14_VFD1:I.In_2 UL4_14_TPE1 TRACKING PHOTOEYE MCM03
108 UL4_14_VFD1:I.In_3 SPARE MCM03
109 UL4_14_VFD1:O.IO_0 UL4_14_BCN1_A AMBER BEACON LIGHT MCM03
110 UL4_14_VFD1:O.IO_1 UL4_14_BCN1_R RED BEACON LIGHT MCM03
111 UL4_14_VFD1:SI.In00Data UL4_14_EPC1 E-STOP PULLCORD MCM03
112 UL4_14_VFD1:SI.In01Data UL4_14_EPC1_2 E-STOP PULLCORD MCM03
113 UL4_14_VFD1:SI.In02Data UL4_14_EPC2 E-STOP PULLCORD MCM03
114 UL4_14_VFD1:SI.In03Data UL4_14_EPC2_2 E-STOP PULLCORD MCM03
115 UL4_14_VFD1:SO.Out00Output SPARE MCM03
116 UL4_20_VFD1:I.In_0 UL4_20_VFD1_DISC DISCONNECT AUX MCM03
117 UL4_20_VFD1:I.In_1 SPARE MCM03
118 UL4_20_VFD1:I.In_2 SPARE MCM03
119 UL4_20_VFD1:I.In_3 SPARE MCM03
120 UL4_20_VFD1:I.IO_0 SPARE MCM03
121 UL4_20_VFD1:I.IO_1 SPARE MCM03
122 UL4_20_VFD1:SI.In00Data SPARE MCM03
123 UL4_20_VFD1:SI.In01Data SPARE MCM03
124 UL4_20_VFD1:SI.In02Data SPARE MCM03
125 UL4_20_VFD1:SI.In03Data SPARE MCM03
126 UL4_20_VFD1:SO.Out00Output SPARE MCM03
127 UL7_20_VFD1:I.In_0 UL7_20_VFD1_DISC DISCONNECT AUX MCM03
128 UL7_20_VFD1:I.In_1 SPARE MCM03
129 UL7_20_VFD1:I.In_2 SPARE MCM03
130 UL7_20_VFD1:I.In_3 SPARE MCM03
131 UL7_20_VFD1:I.IO_0 SPARE MCM03
132 UL7_20_VFD1:I.IO_1 SPARE MCM03
133 UL7_20_VFD1:SI.In00Data SPARE MCM03
134 UL7_20_VFD1:SI.In01Data SPARE MCM03
135 UL7_20_VFD1:SI.In02Data SPARE MCM03
136 UL7_20_VFD1:SI.In03Data SPARE MCM03
137 UL7_20_VFD1:SO.Out00Output SPARE MCM03
138 UL11_14_VFD1:I.In_0 UL11_14_VFD1_DISC DISCONNECT AUX MCM03
139 UL11_14_VFD1:I.In_1 UL11_14_ENC1 ENCODER MCM03
140 UL11_14_VFD1:I.In_2 UL11_14_TPE1 TRACKING PHOTOEYE MCM03
141 UL11_14_VFD1:I.In_3 SPARE MCM03
142 UL11_14_VFD1:O.IO_0 UL11_14_BCN1_A AMBER BEACON LIGHT MCM03
143 UL11_14_VFD1:O.IO_1 UL11_14_BCN1_R RED BEACON LIGHT MCM03
144 UL11_14_VFD1:SI.In00Data UL11_14_EPC1 E-STOP PULLCORD MCM03
145 UL11_14_VFD1:SI.In01Data UL11_14_EPC1_2 E-STOP PULLCORD MCM03
146 UL11_14_VFD1:SI.In02Data UL11_14_EPC2 E-STOP PULLCORD MCM03
147 UL11_14_VFD1:SI.In03Data UL11_14_EPC2_2 E-STOP PULLCORD MCM03
148 UL11_14_VFD1:SO.Out00Output SPARE MCM03
149 UL11_15_VFD1:I.In_0 UL11_15_VFD1_DISC DISCONNECT AUX MCM03
150 UL11_15_VFD1:I.In_1 UL11_15_ENC1 ENCODER MCM03
151 UL11_15_VFD1:I.In_2 UL11_15_TPE1 TRACKING PHOTOEYE MCM03
152 UL11_15_VFD1:I.In_3 SPARE MCM03
153 UL11_15_VFD1:O.IO_0 UL11_14_BCN2_A AMBER BEACON LIGHT MCM03
154 UL11_15_VFD1:O.IO_1 UL11_14_BCN2_R RED BEACON LIGHT MCM03
155 UL11_15_VFD1:SI.In00Data SPARE MCM03
156 UL11_15_VFD1:SI.In01Data SPARE MCM03
157 UL11_15_VFD1:SI.In02Data SPARE MCM03
158 UL11_15_VFD1:SI.In03Data SPARE MCM03
159 UL11_15_VFD1:SO.Out00Output SPARE MCM03
160 UL11_16_VFD1:I.In_0 UL11_16_VFD1_DISC DISCONNECT AUX MCM03
161 UL11_16_VFD1:I.In_1 UL11_16_ENC1 ENCODER MCM03
162 UL11_16_VFD1:I.In_2 UL11_16_TPE1 TRACKING PHOTOEYE MCM03
163 UL11_16_VFD1:I.In_3 SPARE MCM03
164 UL11_16_VFD1:I.IO_0 UL11_14_S1_PB START PUSHBUTTON MCM03
165 UL11_16_VFD1:O.IO_1 UL11_14_S1_PB_LT START PUSHBUTTON LIGHT MCM03
166 UL11_16_VFD1:SI.In00Data SPARE MCM03
167 UL11_16_VFD1:SI.In01Data SPARE MCM03
168 UL11_16_VFD1:SI.In02Data SPARE MCM03
169 UL11_16_VFD1:SI.In03Data SPARE MCM03
170 UL11_16_VFD1:SO.Out00Output SPARE MCM03
171 UL11_17_VFD1:I.In_0 UL11_17_VFD1_DISC DISCONNECT AUX MCM03
172 UL11_17_VFD1:I.In_1 UL11_17_ENC1 ENCODER MCM03
173 UL11_17_VFD1:I.In_2 UL11_17_TPE1 TRACKING PHOTOEYE MCM03
174 UL11_17_VFD1:I.In_3 SPARE MCM03
175 UL11_17_VFD1:I.IO_0 UL11_14_S2_PB START PUSHBUTTON MCM03
176 UL11_17_VFD1:O.IO_1 UL11_14_S2_PB_LT START PUSHBUTTON LIGHT MCM03
177 UL11_17_VFD1:SI.In00Data SPARE MCM03
178 UL11_17_VFD1:SI.In01Data SPARE MCM03
179 UL11_17_VFD1:SI.In02Data SPARE MCM03
180 UL11_17_VFD1:SI.In03Data SPARE MCM03
181 UL11_19_VFD1:I.In_0 UL11_19_VFD1_DISC DISCONNECT AUX MCM03
182 UL11_19_VFD1:I.In_1 UL11_19_ENC1 ENCODER MCM03
183 UL11_19_VFD1:I.In_2 UL11_19_TPE1 TRACKING PHOTOEYE MCM03
184 UL11_19_VFD1:I.In_3 UL11_19_TPE2 TRACKING PHOTOEYE MCM03
185 UL11_19_VFD1:I.IO_0 SPARE MCM03
186 UL11_19_VFD1:I.IO_1 SPARE MCM03
187 UL11_19_VFD1:SI.In00Data SPARE MCM03
188 UL11_19_VFD1:SI.In01Data SPARE MCM03
189 UL11_19_VFD1:SI.In02Data SPARE MCM03
190 UL11_19_VFD1:SI.In03Data SPARE MCM03
191 UL11_19_VFD1:SO.Out00Output SPARE MCM03
192 UL13_13_VFD1:I.In_0 UL13_13_VFD1_DISC DISCONNECT AUX MCM03
193 UL13_13_VFD1:I.In_1 UL13_13_ENC1 ENCODER MCM03
194 UL13_13_VFD1:I.In_2 UL13_13_TPE1 TRACKING PHOTOEYE MCM03
195 UL13_13_VFD1:I.In_3 SPARE MCM03
196 UL13_13_VFD1:O.IO_0 UL13_13_BCN1_A AMBER BEACON LIGHT MCM03
197 UL13_13_VFD1:O.IO_1 UL13_13_BCN1_R RED BEACON LIGHT MCM03
198 UL13_13_VFD1:SI.In00Data UL13_13_EPC1 E-STOP PULLCORD MCM03
199 UL13_13_VFD1:SI.In01Data UL13_13_EPC1_2 E-STOP PULLCORD MCM03
200 UL13_13_VFD1:SI.In02Data UL13_13_EPC2 E-STOP PULLCORD MCM03
201 UL13_13_VFD1:SI.In03Data UL13_13_EPC2_2 E-STOP PULLCORD MCM03
202 UL13_13_VFD1:SO.Out00Output SPARE MCM03
203 UL13_14_VFD1:I.In_0 UL13_14_VFD1_DISC DISCONNECT AUX MCM03
204 UL13_14_VFD1:I.In_1 UL13_14_ENC1 ENCODER MCM03
205 UL13_14_VFD1:I.In_2 UL13_14_TPE1 TRACKING PHOTOEYE MCM03
206 UL13_14_VFD1:I.In_3 SPARE MCM03
207 UL13_14_VFD1:O.IO_0 UL13_13_BCN2_R RED BEACON LIGHT MCM03
208 UL13_14_VFD1:I.IO_1 SPARE MCM03
209 UL13_14_VFD1:SI.In00Data SPARE MCM03
210 UL13_14_VFD1:SI.In01Data SPARE MCM03
211 UL13_14_VFD1:SI.In02Data SPARE MCM03
212 UL13_14_VFD1:SI.In03Data SPARE MCM03
213 UL13_14_VFD1:SO.Out00Output SPARE MCM03
214 UL13_15_VFD1:I.In_0 UL13_15_VFD1_DISC DISCONNECT AUX MCM03
215 UL13_15_VFD1:I.In_1 UL13_15_ENC1 ENCODER MCM03
216 UL13_15_VFD1:I.In_2 UL13_15_TPE1 TRACKING PHOTOEYE MCM03
217 UL13_15_VFD1:I.In_3 SPARE MCM03
218 UL13_15_VFD1:I.IO_0 UL13_13_S1_PB START PUSHBUTTON MCM03
219 UL13_15_VFD1:O.IO_1 UL13_13_S1_PB_LT START PUSHBUTTON LIGHT MCM03
220 UL13_15_VFD1:SI.In00Data SPARE MCM03
221 UL13_15_VFD1:SI.In01Data SPARE MCM03
222 UL13_15_VFD1:SI.In02Data SPARE MCM03
223 UL13_15_VFD1:SI.In03Data SPARE MCM03
224 UL13_15_VFD1:SO.Out00Output SPARE MCM03
225 UL13_16_VFD1:I.In_0 UL13_16_VFD1_DISC DISCONNECT AUX MCM03
226 UL13_16_VFD1:I.In_1 UL13_16_ENC1 ENCODER MCM03
227 UL13_16_VFD1:I.In_2 UL13_16_TPE1 TRACKING PHOTOEYE MCM03
228 UL13_16_VFD1:I.In_3 SPARE MCM03
229 UL13_16_VFD1:I.IO_0 UL13_13_S2_PB START PUSHBUTTON MCM03
230 UL13_16_VFD1:O.IO_1 UL13_13_S2_PB_LT START PUSHBUTTON LIGHT MCM03
231 UL13_16_VFD1:SI.In00Data SPARE MCM03
232 UL13_16_VFD1:SI.In01Data SPARE MCM03
233 UL13_16_VFD1:SI.In02Data SPARE MCM03
234 UL13_16_VFD1:SI.In03Data SPARE MCM03
235 UL13_16_VFD1:SO.Out00Output SPARE MCM03
236 UL13_18_VFD1:I.In_0 UL13_18_VFD1_DISC DISCONNECT AUX MCM03
237 UL13_18_VFD1:I.In_1 UL13_18_ENC1 ENCODER MCM03
238 UL13_18_VFD1:I.In_2 UL13_18_TPE1 TRACKING PHOTOEYE MCM03
239 UL13_18_VFD1:I.In_3 UL13_18_TPE2 TRACKING PHOTOEYE MCM03
240 UL13_18_VFD1:I.IO_0 SPARE MCM03
241 UL13_18_VFD1:I.IO_1 SPARE MCM03
242 UL13_18_VFD1:SI.In00Data SPARE MCM03
243 UL13_18_VFD1:SI.In01Data SPARE MCM03
244 UL13_18_VFD1:SI.In02Data SPARE MCM03
245 UL13_18_VFD1:SI.In03Data SPARE MCM03
246 UL13_18_VFD1:SO.Out00Output SPARE MCM03
247 UL18_17_VFD1:I.In_0 UL18_17_VFD1_DISC DISCONNECT AUX MCM03
248 UL18_17_VFD1:I.In_1 UL18_17_ENC1 ENCODER MCM03
249 UL18_17_VFD1:I.In_2 UL18_17_TPE1 TRACKING PHOTOEYE MCM03
250 UL18_17_VFD1:I.In_3 SPARE MCM03
251 UL18_17_VFD1:O.IO_0 UL18_17_BCN1_A AMBER BEACON LIGHT MCM03
252 UL18_17_VFD1:O.IO_1 UL18_17_BCN1_R RED BEACON LIGHT MCM03
253 UL18_17_VFD1:SI.In00Data UL18_17_EPC1 E-STOP PULLCORD MCM03
254 UL18_17_VFD1:SI.In01Data UL18_17_EPC1_2 E-STOP PULLCORD MCM03
255 UL18_17_VFD1:SI.In02Data UL18_17_EPC2 E-STOP PULLCORD MCM03
256 UL18_17_VFD1:SI.In03Data UL18_17_EPC2_2 E-STOP PULLCORD MCM03
257 UL18_17_VFD1:SO.Out00Output SPARE MCM03
258 UL18_18_VFD1:I.In_0 UL18_18_VFD1_DISC DISCONNECT AUX MCM03
259 UL18_18_VFD1:I.In_1 UL18_18_ENC1 ENCODER MCM03
260 UL18_18_VFD1:I.In_2 UL18_18_TPE1 TRACKING PHOTOEYE MCM03
261 UL18_18_VFD1:I.In_3 SPARE MCM03
262 UL18_18_VFD1:O.IO_0 UL18_17_BCN2_R RED BEACON LIGHT MCM03
263 UL18_18_VFD1:I.IO_1 SPARE MCM03
264 UL18_18_VFD1:SI.In00Data SPARE MCM03
265 UL18_18_VFD1:SI.In01Data SPARE MCM03
266 UL18_18_VFD1:SI.In02Data SPARE MCM03
267 UL18_18_VFD1:SI.In03Data SPARE MCM03
268 UL18_18_VFD1:SO.Out00Output SPARE MCM03
269 UL18_19_VFD1:I.In_0 UL18_19_VFD1_DISC DISCONNECT AUX MCM03
270 UL18_19_VFD1:I.In_1 UL18_19_ENC1 ENCODER MCM03
271 UL18_19_VFD1:I.In_2 UL18_19_TPE1 TRACKING PHOTOEYE MCM03
272 UL18_19_VFD1:I.In_3 SPARE MCM03
273 UL18_19_VFD1:I.IO_0 UL18_17_S1_PB START PUSHBUTTON MCM03
274 UL18_19_VFD1:O.IO_1 UL18_17_S1_PB_LT START PUSHBUTTON LIGHT MCM03
275 UL18_19_VFD1:SI.In00Data SPARE MCM03
276 UL18_19_VFD1:SI.In01Data SPARE MCM03
277 UL18_19_VFD1:SI.In02Data SPARE MCM03
278 UL18_19_VFD1:SI.In03Data SPARE MCM03
279 UL18_19_VFD1:SO.Out00Output SPARE MCM03
280 UL18_20_VFD1:I.In_0 UL18_20_VFD1_DISC DISCONNECT AUX MCM03
281 UL18_20_VFD1:I.In_1 UL18_20_ENC1 ENCODER MCM03
282 UL18_20_VFD1:I.In_2 UL18_20_TPE1 TRACKING PHOTOEYE MCM03
283 UL18_20_VFD1:I.In_3 SPARE MCM03
284 UL18_20_VFD1:I.IO_0 UL18_17_S2_PB START PUSHBUTTON MCM03
285 UL18_20_VFD1:O.IO_1 UL18_17_S2_PB_LT START PUSHBUTTON LIGHT MCM03
286 UL18_20_VFD1:SI.In00Data SPARE MCM03
287 UL18_20_VFD1:SI.In01Data SPARE MCM03
288 UL18_20_VFD1:SI.In02Data SPARE MCM03
289 UL18_20_VFD1:SI.In03Data SPARE MCM03
290 UL18_20_VFD1:SO.Out00Output SPARE MCM03
291 UL18_22_VFD1:I.In_0 UL18_22_VFD1_DISC DISCONNECT AUX MCM03
292 UL18_22_VFD1:I.In_1 UL18_22_ENC1 ENCODER MCM03
293 UL18_22_VFD1:I.In_2 UL18_22_TPE1 TRACKING PHOTOEYE MCM03
294 UL18_22_VFD1:I.In_3 UL18_22_TPE2 TRACKING PHOTOEYE MCM03
295 UL18_22_VFD1:I.IO_0 SPARE MCM03
296 UL18_22_VFD1:I.IO_1 SPARE MCM03
297 UL18_22_VFD1:SI.In00Data SPARE MCM03
298 UL18_22_VFD1:SI.In01Data SPARE MCM03
299 UL18_22_VFD1:SI.In02Data SPARE MCM03
300 UL18_22_VFD1:SI.In03Data SPARE MCM03
301 UL18_22_VFD1:SO.Out00Output SPARE MCM03
302 UL1_14_VFD1:I.In_0 UL1_14_VFD1_DISC DISCONNECT AUX MCM03
303 UL1_14_VFD1:I.In_1 UL1_14_ENC1 ENCODER MCM03
304 UL1_14_VFD1:I.In_2 UL1_14_TPE1 TRACKING PHOTOEYE MCM03
305 UL1_14_VFD1:I.In_3 SPARE MCM03
306 UL1_14_VFD1:O.IO_0 UL1_14_BCN1_A AMBER BEACON LIGHT MCM03
307 UL1_14_VFD1:O.IO_1 UL1_14_BCN1_R RED BEACON LIGHT MCM03
308 UL1_14_VFD1:SI.In00Data UL1_14_EPC1 E-STOP PULLCORD MCM03
309 UL1_14_VFD1:SI.In01Data UL1_14_EPC1_2 E-STOP PULLCORD MCM03
310 UL1_14_VFD1:SI.In02Data UL1_14_EPC2 E-STOP PULLCORD MCM03
311 UL1_14_VFD1:SI.In03Data UL1_14_EPC2_2 E-STOP PULLCORD MCM03
312 UL1_14_VFD1:SO.Out00Output SPARE MCM03
313 UL1_15_VFD1:I.In_0 UL1_15_VFD1_DISC DISCONNECT AUX MCM03
314 UL1_15_VFD1:I.In_1 UL1_15_ENC1 ENCODER MCM03
315 UL1_15_VFD1:I.In_2 UL1_15_TPE1 TRACKING PHOTOEYE MCM03
316 UL1_15_VFD1:I.In_3 SPARE MCM03
317 UL1_15_VFD1:O.IO_0 UL1_14_BCN2_A AMBER BEACON LIGHT MCM03
318 UL1_15_VFD1:O.IO_1 UL1_14_BCN2_R RED BEACON LIGHT MCM03
319 UL1_15_VFD1:SI.In00Data SPARE MCM03
320 UL1_15_VFD1:SI.In01Data SPARE MCM03
321 UL1_15_VFD1:SI.In02Data SPARE MCM03
322 UL1_15_VFD1:SI.In03Data SPARE MCM03
323 UL1_15_VFD1:SO.Out00Output SPARE MCM03
324 UL1_16_VFD1:I.In_0 UL1_16_VFD1_DISC DISCONNECT AUX MCM03
325 UL1_16_VFD1:I.In_1 UL1_16_ENC1 ENCODER MCM03
326 UL1_16_VFD1:I.In_2 UL1_16_TPE1 TRACKING PHOTOEYE MCM03
327 UL1_16_VFD1:I.In_3 SPARE MCM03
328 UL1_16_VFD1:I.IO_0 UL1_14_S1_PB START PUSHBUTTON MCM03
329 UL1_16_VFD1:O.IO_1 UL1_14_S1_PB_LT START PUSHBUTTON LIGHT MCM03
330 UL1_16_VFD1:SI.In00Data SPARE MCM03
331 UL1_16_VFD1:SI.In01Data SPARE MCM03
332 UL1_16_VFD1:SI.In02Data SPARE MCM03
333 UL1_16_VFD1:SI.In03Data SPARE MCM03
334 UL1_16_VFD1:SO.Out00Output SPARE MCM03
335 UL1_17_VFD1:I.In_0 UL1_17_VFD1_DISC DISCONNECT AUX MCM03
336 UL1_17_VFD1:I.In_1 UL1_17_ENC1 ENCODER MCM03
337 UL1_17_VFD1:I.In_2 UL1_17_TPE1 TRACKING PHOTOEYE MCM03
338 UL1_17_VFD1:I.In_3 SPARE MCM03
339 UL1_17_VFD1:I.IO_0 UL1_14_S2_PB START PUSHBUTTON MCM03
340 UL1_17_VFD1:O.IO_1 UL1_14_S2_PB_LT START PUSHBUTTON LIGHT MCM03
341 UL1_17_VFD1:SI.In00Data SPARE MCM03
342 UL1_17_VFD1:SI.In01Data SPARE MCM03
343 UL1_17_VFD1:SI.In02Data SPARE MCM03
344 UL1_17_VFD1:SI.In03Data SPARE MCM03
345 UL1_17_VFD1:SO.Out00Output SPARE MCM03
346 UL1_19_VFD1:I.In_0 UL1_19_VFD1_DISC DISCONNECT AUX MCM03
347 UL1_19_VFD1:I.In_1 UL1_19_ENC1 ENCODER MCM03
348 UL1_19_VFD1:I.In_2 UL1_19_TPE1 TRACKING PHOTOEYE MCM03
349 UL1_19_VFD1:I.In_3 UL1_19_TPE2 TRACKING PHOTOEYE MCM03
350 UL1_19_VFD1:I.IO_0 SPARE MCM03
351 UL1_19_VFD1:I.IO_1 SPARE MCM03
352 UL1_19_VFD1:SI.In00Data SPARE MCM03
353 UL1_19_VFD1:SI.In01Data SPARE MCM03
354 UL1_19_VFD1:SI.In02Data SPARE MCM03
355 UL1_19_VFD1:SI.In03Data SPARE MCM03
356 UL1_19_VFD1:SO.Out00Output SPARE MCM03
357 UL21_18_VFD1:I.In_0 UL21_18_VFD1_DISC DISCONNECT AUX MCM03
358 UL21_18_VFD1:I.In_1 UL21_18_ENC1 ENCODER MCM03
359 UL21_18_VFD1:I.In_2 UL21_18_TPE1 TRACKING PHOTOEYE MCM03
360 UL21_18_VFD1:I.In_3 SPARE MCM03
361 UL21_18_VFD1:O.IO_0 UL21_18_BCN1_A AMBER BEACON LIGHT MCM03
362 UL21_18_VFD1:O.IO_1 UL21_18_BCN1_R RED BEACON LIGHT MCM03
363 UL21_18_VFD1:SI.In00Data UL21_18_EPC1 E-STOP PULLCORD MCM03
364 UL21_18_VFD1:SI.In01Data UL21_18_EPC1_2 E-STOP PULLCORD MCM03
365 UL21_18_VFD1:SI.In02Data UL21_18_EPC2 E-STOP PULLCORD MCM03
366 UL21_18_VFD1:SI.In03Data UL21_18_EPC2_2 E-STOP PULLCORD MCM03
367 UL21_18_VFD1:SO.Out00Output SPARE MCM03
368 UL21_19_VFD1:I.In_0 UL21_19_VFD1_DISC DISCONNECT AUX MCM03
369 UL21_19_VFD1:I.In_1 UL21_19_ENC1 ENCODER MCM03
370 UL21_19_VFD1:I.In_2 UL21_19_TPE1 TRACKING PHOTOEYE MCM03
371 UL21_19_VFD1:I.In_3 SPARE MCM03
372 UL21_19_VFD1:O.IO_0 UL21_18_BCN2_R RED BEACON LIGHT MCM03
373 UL21_19_VFD1:I.IO_1 SPARE MCM03
374 UL21_19_VFD1:SI.In00Data SPARE MCM03
375 UL21_19_VFD1:SI.In01Data SPARE MCM03
376 UL21_19_VFD1:SI.In02Data SPARE MCM03
377 UL21_19_VFD1:SI.In03Data SPARE MCM03
378 UL21_19_VFD1:SO.Out00Output SPARE MCM03
379 UL21_20_VFD1:I.In_0 UL21_20_VFD1_DISC DISCONNECT AUX MCM03
380 UL21_20_VFD1:I.In_1 UL21_20_ENC1 ENCODER MCM03
381 UL21_20_VFD1:I.In_2 UL21_20_TPE1 TRACKING PHOTOEYE MCM03
382 UL21_20_VFD1:I.In_3 SPARE MCM03
383 UL21_20_VFD1:I.IO_0 UL21_18_S1_PB START PUSHBUTTON MCM03
384 UL21_20_VFD1:O.IO_1 UL21_18_S1_PB_LT START PUSHBUTTON LIGHT MCM03
385 UL21_20_VFD1:SI.In00Data SPARE MCM03
386 UL21_20_VFD1:SI.In01Data SPARE MCM03
387 UL21_20_VFD1:SI.In02Data SPARE MCM03
388 UL21_20_VFD1:SI.In03Data SPARE MCM03
389 UL21_20_VFD1:SO.Out00Output SPARE MCM03
390 UL21_21_VFD1:I.In_0 UL21_21_VFD1_DISC DISCONNECT AUX MCM03
391 UL21_21_VFD1:I.In_1 UL21_21_ENC1 ENCODER MCM03
392 UL21_21_VFD1:I.In_2 UL21_21_TPE1 TRACKING PHOTOEYE MCM03
393 UL21_21_VFD1:I.In_3 SPARE MCM03
394 UL21_21_VFD1:I.IO_0 UL21_18_S2_PB START PUSHBUTTON MCM03
395 UL21_21_VFD1:O.IO_1 UL21_18_S2_PB_LT START PUSHBUTTON LIGHT MCM03
396 UL21_21_VFD1:SI.In00Data SPARE MCM03
397 UL21_21_VFD1:SI.In01Data SPARE MCM03
398 UL21_21_VFD1:SI.In02Data SPARE MCM03
399 UL21_21_VFD1:SI.In03Data SPARE MCM03
400 UL21_21_VFD1:SO.Out00Output SPARE MCM03
401 UL21_23_VFD1:I.In_0 UL21_23_VFD1_DISC DISCONNECT AUX MCM03
402 UL21_23_VFD1:I.In_1 UL21_23_ENC1 ENCODER MCM03
403 UL21_23_VFD1:I.In_2 UL21_23_TPE1 TRACKING PHOTOEYE MCM03
404 UL21_23_VFD1:I.In_3 UL21_23_TPE2 TRACKING PHOTOEYE MCM03
405 UL21_23_VFD1:I.IO_0 SPARE MCM03
406 UL21_23_VFD1:I.IO_1 SPARE MCM03
407 UL21_23_VFD1:SI.In00Data SPARE MCM03
408 UL21_23_VFD1:SI.In01Data SPARE MCM03
409 UL21_23_VFD1:SI.In02Data SPARE MCM03
410 UL21_23_VFD1:SI.In03Data SPARE MCM03
411 UL21_23_VFD1:SO.Out00Output SPARE MCM03
412 UL4_15_VFD1:I.In_0 UL4_15_VFD1_DISC DISCONNECT AUX MCM03
413 UL4_15_VFD1:I.In_1 UL4_15_ENC1 ENCODER MCM03
414 UL4_15_VFD1:I.In_2 UL4_15_TPE1 TRACKING PHOTOEYE MCM03
415 UL4_15_VFD1:I.In_3 SPARE MCM03
416 UL4_15_VFD1:O.IO_0 UL4_14_BCN2_A AMBER BEACON LIGHT MCM03
417 UL4_15_VFD1:O.IO_1 UL4_14_BCN2_R RED BEACON LIGHT MCM03
418 UL4_15_VFD1:SI.In00Data SPARE MCM03
419 UL4_15_VFD1:SI.In01Data SPARE MCM03
420 UL4_15_VFD1:SI.In02Data SPARE MCM03
421 UL4_15_VFD1:SI.In03Data SPARE MCM03
422 UL4_15_VFD1:SO.Out00Output SPARE MCM03
423 UL4_16_VFD1:I.In_0 UL4_16_VFD1_DISC DISCONNECT AUX MCM03
424 UL4_16_VFD1:I.In_1 UL4_16_ENC1 ENCODER MCM03
425 UL4_16_VFD1:I.In_2 UL4_16_TPE1 TRACKING PHOTOEYE MCM03
426 UL4_16_VFD1:I.In_3 SPARE MCM03
427 UL4_16_VFD1:I.IO_0 UL4_14_S1_PB START PUSHBUTTON MCM03
428 UL4_16_VFD1:O.IO_1 UL4_14_S1_PB_LT START PUSHBUTTON LIGHT MCM03
429 UL4_16_VFD1:SI.In00Data SPARE MCM03
430 UL4_16_VFD1:SI.In01Data SPARE MCM03
431 UL4_16_VFD1:SI.In02Data SPARE MCM03
432 UL4_16_VFD1:SI.In03Data SPARE MCM03
433 UL4_16_VFD1:SO.Out00Output SPARE MCM03
434 UL4_17_VFD1:I.In_0 UL4_17_VFD1_DISC DISCONNECT AUX MCM03
435 UL4_17_VFD1:I.In_1 UL4_17_ENC1 ENCODER MCM03
436 UL4_17_VFD1:I.In_2 UL4_17_TPE1 TRACKING PHOTOEYE MCM03
437 UL4_17_VFD1:I.In_3 SPARE MCM03
438 UL4_17_VFD1:I.IO_0 UL4_14_S2_PB START PUSHBUTTON MCM03
439 UL4_17_VFD1:O.IO_1 UL4_14_S2_PB_LT START PUSHBUTTON LIGHT MCM03
440 UL4_17_VFD1:SI.In00Data SPARE MCM03
441 UL4_17_VFD1:SI.In01Data SPARE MCM03
442 UL4_17_VFD1:SI.In02Data SPARE MCM03
443 UL4_17_VFD1:SI.In03Data SPARE MCM03
444 UL4_17_VFD1:SO.Out00Output SPARE MCM03
445 UL4_19_VFD1:I.In_0 UL4_19_VFD1_DISC DISCONNECT AUX MCM03
446 UL4_19_VFD1:I.In_1 UL4_19_ENC1 ENCODER MCM03
447 UL4_19_VFD1:I.In_2 UL4_19_TPE1 TRACKING PHOTOEYE MCM03
448 UL4_19_VFD1:I.In_3 UL4_19_TPE2 TRACKING PHOTOEYE MCM03
449 UL4_19_VFD1:I.IO_0 SPARE MCM03
450 UL4_19_VFD1:I.IO_1 SPARE MCM03
451 UL4_19_VFD1:SI.In00Data SPARE MCM03
452 UL4_19_VFD1:SI.In01Data SPARE MCM03
453 UL4_19_VFD1:SI.In02Data SPARE MCM03
454 UL4_19_VFD1:SI.In03Data SPARE MCM03
455 UL4_19_VFD1:SO.Out00Output SPARE MCM03
456 UL7_14_VFD1:I.In_0 UL7_14_VFD1_DISC DISCONNECT AUX MCM03
457 UL7_14_VFD1:I.In_1 UL7_14_ENC1 ENCODER MCM03
458 UL7_14_VFD1:I.In_2 UL7_14_TPE1 TRACKING PHOTOEYE MCM03
459 UL7_14_VFD1:I.In_3 SPARE MCM03
460 UL7_14_VFD1:O.IO_0 UL7_14_BCN1_R RED BEACON LIGHT MCM03
461 UL7_14_VFD1:O.IO_1 UL7_14_BCN2_R RED BEACON LIGHT MCM03
462 UL7_14_VFD1:SI.In00Data UL7_14_EPC1 E-STOP PULLCORD MCM03
463 UL7_14_VFD1:SI.In01Data UL7_14_EPC1_2 E-STOP PULLCORD MCM03
464 UL7_14_VFD1:SI.In02Data UL7_14_EPC2 E-STOP PULLCORD MCM03
465 UL7_14_VFD1:SI.In03Data UL7_14_EPC2_2 E-STOP PULLCORD MCM03
466 UL7_14_VFD1:SO.Out00Output SPARE MCM03
467 UL7_15_VFD1:I.In_0 UL7_15_VFD1_DISC DISCONNECT AUX MCM03
468 UL7_15_VFD1:I.In_1 UL7_15_ENC1 ENCODER MCM03
469 UL7_15_VFD1:I.In_2 UL7_15_TPE1 TRACKING PHOTOEYE MCM03
470 UL7_15_VFD1:I.In_3 SPARE MCM03
471 UL7_15_VFD1:I.IO_0 UL7_14_S1_PB START PUSHBUTTON MCM03
472 UL7_15_VFD1:O.IO_1 UL7_14_S1_PB_LT START PUSHBUTTON LIGHT MCM03
473 UL7_15_VFD1:SI.In00Data SPARE MCM03
474 UL7_15_VFD1:SI.In01Data SPARE MCM03
475 UL7_15_VFD1:SI.In02Data SPARE MCM03
476 UL7_15_VFD1:SI.In03Data SPARE MCM03
477 UL7_15_VFD1:SO.Out00Output SPARE MCM03
478 UL7_16_VFD1:I.In_0 UL7_16_VFD1_DISC DISCONNECT AUX MCM03
479 UL7_16_VFD1:I.In_1 UL7_16_ENC1 ENCODER MCM03
480 UL7_16_VFD1:I.In_2 UL7_16_TPE1 TRACKING PHOTOEYE MCM03
481 UL7_16_VFD1:I.In_3 SPARE MCM03
482 UL7_16_VFD1:I.IO_0 UL7_14_S2_PB START PUSHBUTTON MCM03
483 UL7_16_VFD1:O.IO_1 UL7_14_S2_PB_LT START PUSHBUTTON LIGHT MCM03
484 UL7_16_VFD1:SI.In00Data SPARE MCM03
485 UL7_16_VFD1:SI.In01Data SPARE MCM03
486 UL7_16_VFD1:SI.In02Data SPARE MCM03
487 UL7_16_VFD1:SI.In03Data SPARE MCM03
488 UL7_16_VFD1:SO.Out00Output SPARE MCM03
489 UL7_17_VFD1:I.In_0 UL7_17_VFD1_DISC DISCONNECT AUX MCM03
490 UL7_17_VFD1:I.In_1 UL7_17_ENC1 ENCODER MCM03
491 UL7_17_VFD1:I.In_2 UL7_17_TPE1 TRACKING PHOTOEYE MCM03
492 UL7_17_VFD1:I.In_3 SPARE MCM03
493 UL7_17_VFD1:I.IO_0 SPARE MCM03
494 UL7_17_VFD1:I.IO_1 SPARE MCM03
495 UL7_17_VFD1:SI.In00Data SPARE MCM03
496 UL7_17_VFD1:SI.In01Data SPARE MCM03
497 UL7_17_VFD1:SI.In02Data SPARE MCM03
498 UL7_17_VFD1:SI.In03Data SPARE MCM03
499 UL7_17_VFD1:SO.Out00Output SPARE MCM03
500 UL7_19_VFD1:I.In_0 UL7_19_VFD1_DISC DISCONNECT AUX MCM03
501 UL7_19_VFD1:I.In_1 UL7_19_ENC1 ENCODER MCM03
502 UL7_19_VFD1:I.In_2 UL7_19_TPE1 TRACKING PHOTOEYE MCM03
503 UL7_19_VFD1:I.In_3 UL7_19_TPE2 TRACKING PHOTOEYE MCM03
504 UL7_19_VFD1:I.IO_0 SPARE MCM03
505 UL7_19_VFD1:I.IO_1 SPARE MCM03
506 UL7_19_VFD1:SI.In00Data SPARE MCM03
507 UL7_19_VFD1:SI.In01Data SPARE MCM03
508 UL7_19_VFD1:SI.In02Data SPARE MCM03
509 UL7_19_VFD1:SI.In03Data SPARE MCM03
510 UL7_19_VFD1:SO.Out00Output SPARE MCM03
511 NCP1_4_VFD1:I.In_0 NCP1_4_VFD1_DISC DISCONNECT AUX MCM03
512 NCP1_4_VFD1:I.In_1 NCP1_3_TPE3 TRACKING PHOTOEYE MCM03
513 NCP1_4_VFD1:I.In_2 NCP1_3_TPE4 TRACKING PHOTOEYE MCM03
514 NCP1_4_VFD1:I.In_3 NCP1_3_TPE5 TRACKING PHOTOEYE MCM03
515 NCP1_4_VFD1:I.IO_0 NCP1_3_TPE6 TRACKING PHOTOEYE MCM03
516 NCP1_4_VFD1:I.IO_1 NCP1_3_TPE7 TRACKING PHOTOEYE MCM03
517 NCP1_4_VFD1:SI.In00Data SPARE MCM03
518 NCP1_4_VFD1:SI.In01Data SPARE MCM03
519 NCP1_4_VFD1:SI.In02Data SPARE MCM03
520 NCP1_4_VFD1:SI.In03Data SPARE MCM03
521 NCP1_4_VFD1:SO.Out00Output SPARE MCM03
522 NCP1_6_VFD1:I.In_0 NCP1_6_VFD1_DISC DISCONNECT AUX MCM03
523 NCP1_6_VFD1:I.In_1 SPARE MCM03
524 NCP1_6_VFD1:I.In_2 NCP1_6_TPE1 TRACKING PHOTOEYE MCM03
525 NCP1_6_VFD1:I.In_3 SPARE MCM03
526 NCP1_6_VFD1:I.IO_0 NCP1_8_S2_PB START PUSHBUTTON MCM03
527 NCP1_6_VFD1:O.IO_1 NCP1_8_S2_PB_LT START PUSHBUTTON LIGHT MCM03
528 NCP1_6_VFD1:SI.In00Data SPARE MCM03
529 NCP1_6_VFD1:SI.In01Data SPARE MCM03
530 NCP1_6_VFD1:SI.In02Data SPARE MCM03
531 NCP1_6_VFD1:SI.In03Data SPARE MCM03
532 NCP1_6_VFD1:SO.Out00Output SPARE MCM03
533 UL11_18_VFD1:I.In_0 UL11_18_VFD1_DISC DISCONNECT AUX MCM03
534 UL11_18_VFD1:I.In_1 UL11_18_ENC1 ENCODER MCM03
535 UL11_18_VFD1:I.In_2 SPARE MCM03
536 UL11_18_VFD1:I.In_3 SPARE MCM03
537 UL11_18_VFD1:I.IO_0 SPARE MCM03
538 UL11_18_VFD1:I.IO_1 SPARE MCM03
539 UL11_18_VFD1:SI.In00Data SPARE MCM03
540 UL11_18_VFD1:SI.In01Data SPARE MCM03
541 UL11_18_VFD1:SI.In02Data SPARE MCM03
542 UL11_18_VFD1:SI.In03Data SPARE MCM03
543 UL11_18_VFD1:SO.Out00Output SPARE MCM03
544 UL13_17_VFD1:I.In_0 UL13_17_VFD1_DISC DISCONNECT AUX MCM03
545 UL13_17_VFD1:I.In_1 UL13_17_ENC1 ENCODER MCM03
546 UL13_17_VFD1:I.In_2 SPARE MCM03
547 UL13_17_VFD1:I.In_3 SPARE MCM03
548 UL13_17_VFD1:I.IO_0 SPARE MCM03
549 UL13_17_VFD1:I.IO_1 SPARE MCM03
550 UL13_17_VFD1:SI.In00Data SPARE MCM03
551 UL13_17_VFD1:SI.In01Data SPARE MCM03
552 UL13_17_VFD1:SI.In02Data SPARE MCM03
553 UL13_17_VFD1:SI.In03Data SPARE MCM03
554 UL13_17_VFD1:SO.Out00Output SPARE MCM03
555 UL18_21_VFD1:I.In_0 UL18_21_VFD1_DISC DISCONNECT AUX MCM03
556 UL18_21_VFD1:I.In_1 UL18_21_ENC1 ENCODER MCM03
557 UL18_21_VFD1:I.In_2 SPARE MCM03
558 UL18_21_VFD1:I.In_3 SPARE MCM03
559 UL18_21_VFD1:I.IO_0 SPARE MCM03
560 UL18_21_VFD1:I.IO_1 SPARE MCM03
561 UL18_21_VFD1:SI.In00Data SPARE MCM03
562 UL18_21_VFD1:SI.In01Data SPARE MCM03
563 UL18_21_VFD1:SI.In02Data SPARE MCM03
564 UL18_21_VFD1:SI.In03Data SPARE MCM03
565 UL18_21_VFD1:SO.Out00Output SPARE MCM03
566 UL1_18_VFD1:I.In_0 UL1_18_VFD1_DISC DISCONNECT AUX MCM03
567 UL1_18_VFD1:I.In_1 UL1_18_ENC1 ENCODER MCM03
568 UL1_18_VFD1:I.In_2 SPARE MCM03
569 UL1_18_VFD1:I.In_3 SPARE MCM03
570 UL1_18_VFD1:I.IO_0 SPARE MCM03
571 UL1_18_VFD1:I.IO_1 SPARE MCM03
572 UL1_18_VFD1:SI.In00Data SPARE MCM03
573 UL1_18_VFD1:SI.In01Data SPARE MCM03
574 UL1_18_VFD1:SI.In02Data SPARE MCM03
575 UL1_18_VFD1:SI.In03Data SPARE MCM03
576 UL1_18_VFD1:SO.Out00Output SPARE MCM03
577 UL21_22_VFD1:I.In_0 UL21_22_VFD1_DISC DISCONNECT AUX MCM03
578 UL21_22_VFD1:I.In_1 UL21_22_ENC1 ENCODER MCM03
579 UL21_22_VFD1:I.In_2 SPARE MCM03
580 UL21_22_VFD1:I.In_3 SPARE MCM03
581 UL21_22_VFD1:I.IO_0 SPARE MCM03
582 UL21_22_VFD1:I.IO_1 SPARE MCM03
583 UL21_22_VFD1:SI.In00Data SPARE MCM03
584 UL21_22_VFD1:SI.In01Data SPARE MCM03
585 UL21_22_VFD1:SI.In02Data SPARE MCM03
586 UL21_22_VFD1:SI.In03Data SPARE MCM03
587 UL21_22_VFD1:SO.Out00Output SPARE MCM03
588 UL4_18_VFD1:I.In_0 UL4_18_VFD1_DISC DISCONNECT AUX MCM03
589 UL4_18_VFD1:I.In_1 UL4_18_ENC1 ENCODER MCM03
590 UL4_18_VFD1:I.In_2 SPARE MCM03
591 UL4_18_VFD1:I.In_3 SPARE MCM03
592 UL4_18_VFD1:I.IO_0 SPARE MCM03
593 UL4_18_VFD1:I.IO_1 SPARE MCM03
594 UL4_18_VFD1:SI.In00Data SPARE MCM03
595 UL4_18_VFD1:SI.In01Data SPARE MCM03
596 UL4_18_VFD1:SI.In02Data SPARE MCM03
597 UL4_18_VFD1:SI.In03Data SPARE MCM03
598 UL4_18_VFD1:SO.Out00Output SPARE MCM03
599 UL7_18_VFD1:I.In_0 UL7_18_VFD1_DISC DISCONNECT AUX MCM03
600 UL7_18_VFD1:I.In_1 UL7_18_ENC1 ENCODER MCM03
601 UL7_18_VFD1:I.In_2 SPARE MCM03
602 UL7_18_VFD1:I.In_3 SPARE MCM03
603 UL7_18_VFD1:I.IO_0 SPARE MCM03
604 UL7_18_VFD1:I.IO_1 SPARE MCM03
605 UL7_18_VFD1:SI.In00Data SPARE MCM03
606 UL7_18_VFD1:SI.In01Data SPARE MCM03
607 UL7_18_VFD1:SI.In02Data SPARE MCM03
608 UL7_18_VFD1:SI.In03Data SPARE MCM03
609 UL7_18_VFD1:SO.Out00Output SPARE MCM03
610 NCP1_1_VFD1:I.In_0 NCP1_1_VFD1_DISC DISCONNECT AUX MCM03
611 NCP1_1_VFD1:I.In_1 NCP1_1_ENC1 ENCODER MCM03
612 NCP1_1_VFD1:I.In_2 NCP1_1_TPE1 TRACKING PHOTOEYE MCM03
613 NCP1_1_VFD1:I.In_3 NCP1_1_TPE2 TRACKING PHOTOEYE MCM03
614 NCP1_1_VFD1:O.IO_0 NCP1_1_BCN2_A AMBER BEACON LIGHT MCM03
615 NCP1_1_VFD1:O.IO_1 NCP1_1_BCN2_R RED BEACON LIGHT MCM03
616 NCP1_1_VFD1:SI.In00Data NCP1_1_EPC1 E-STOP PULLCORD MCM03
617 NCP1_1_VFD1:SI.In01Data NCP1_1_EPC1_2 E-STOP PULLCORD MCM03
618 NCP1_1_VFD1:SI.In02Data NCP1_1_EPC2 E-STOP PULLCORD MCM03
619 NCP1_1_VFD1:SI.In03Data NCP1_1_EPC2_2 E-STOP PULLCORD MCM03
620 NCP1_1_VFD1:SO.Out00Output SPARE MCM03
621 NCP1_2_VFD1:I.In_0 NCP1_2_VFD1_DISC DISCONNECT AUX MCM03
622 NCP1_2_VFD1:I.In_1 NCP1_2_ENC1 ENCODER MCM03
623 NCP1_2_VFD1:I.In_2 NCP1_2_TPE1 TRACKING PHOTOEYE MCM03
624 NCP1_2_VFD1:I.In_3 NCP1_2_TPE2 TRACKING PHOTOEYE MCM03
625 NCP1_2_VFD1:I.IO_0 NCP1_1_JR1_PB JAM RESET PUSHBUTTON MCM03
626 NCP1_2_VFD1:O.IO_1 NCP1_1_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT MCM03
627 NCP1_2_VFD1:SI.In00Data NCP1_2_EPC1 E-STOP PULLCORD MCM03
628 NCP1_2_VFD1:SI.In01Data NCP1_2_EPC1_2 E-STOP PULLCORD MCM03
629 NCP1_2_VFD1:SI.In02Data NCP1_2_EPC2 E-STOP PULLCORD MCM03
630 NCP1_2_VFD1:SI.In03Data NCP1_2_EPC2_2 E-STOP PULLCORD MCM03
631 NCP1_2_VFD1:SO.Out00Output SPARE MCM03
632 NCP1_3_VFD1:I.In_0 NCP1_3_VFD1_DISC DISCONNECT AUX MCM03
633 NCP1_3_VFD1:I.In_1 NCP1_3_ENC1 ENCODER MCM03
634 NCP1_3_VFD1:I.In_2 NCP1_3_TPE1 TRACKING PHOTOEYE MCM03
635 NCP1_3_VFD1:I.In_3 NCP1_3_TPE2 TRACKING PHOTOEYE MCM03
636 NCP1_3_VFD1:I.IO_0 SPARE MCM03
637 NCP1_3_VFD1:I.IO_1 SPARE MCM03
638 NCP1_3_VFD1:SI.In00Data NCP1_3_EPC1 E-STOP PULLCORD MCM03
639 NCP1_3_VFD1:SI.In01Data NCP1_3_EPC1_2 E-STOP PULLCORD MCM03
640 NCP1_3_VFD1:SI.In02Data NCP1_3_EPC2 E-STOP PULLCORD MCM03
641 NCP1_3_VFD1:SI.In03Data NCP1_3_EPC2_2 E-STOP PULLCORD MCM03
642 NCP1_3_VFD1:SO.Out00Output SPARE MCM03
643 NCP1_5_VFD1:I.In_0 NCP1_5_VFD1_DISC DISCONNECT AUX MCM03
644 NCP1_5_VFD1:I.In_1 SPARE MCM03
645 NCP1_5_VFD1:I.In_2 NCP1_5_TPE1 TRACKING PHOTOEYE MCM03
646 NCP1_5_VFD1:I.In_3 NCP1_5_TPE2 TRACKING PHOTOEYE MCM03
647 NCP1_5_VFD1:I.IO_0 SPARE MCM03
648 NCP1_5_VFD1:I.IO_1 SPARE MCM03
649 NCP1_5_VFD1:SI.In00Data SPARE MCM03
650 NCP1_5_VFD1:SI.In01Data SPARE MCM03
651 NCP1_5_VFD1:SI.In02Data SPARE MCM03
652 NCP1_5_VFD1:SI.In03Data SPARE MCM03
653 NCP1_5_VFD1:SO.Out00Output SPARE MCM03
654 NCP1_7_VFD1:I.In_0 NCP1_7_VFD1_DISC DISCONNECT AUX MCM03
655 NCP1_7_VFD1:I.In_1 SPARE MCM03
656 NCP1_7_VFD1:I.In_2 NCP1_7_TPE1 TRACKING PHOTOEYE MCM03
657 NCP1_7_VFD1:I.In_3 SPARE MCM03
658 NCP1_7_VFD1:I.IO_0 NCP1_8_S1_PB START PUSHBUTTON MCM03
659 NCP1_7_VFD1:O.IO_1 NCP1_8_S1_PB_LT START PUSHBUTTON LIGHT MCM03
660 NCP1_7_VFD1:SI.In00Data SPARE MCM03
661 NCP1_7_VFD1:SI.In01Data SPARE MCM03
662 NCP1_7_VFD1:SI.In02Data SPARE MCM03
663 NCP1_7_VFD1:SI.In03Data SPARE MCM03
664 NCP1_7_VFD1:SO.Out00Output SPARE MCM03
665 NCP1_8_VFD1:I.In_0 NCP1_8_VFD1_DISC DISCONNECT AUX MCM03
666 NCP1_8_VFD1:I.In_1 SPARE MCM03
667 NCP1_8_VFD1:I.In_2 NCP1_8_TPE1 TRACKING PHOTOEYE MCM03
668 NCP1_8_VFD1:I.In_3 SPARE MCM03
669 NCP1_8_VFD1:O.IO_0 NCP1_8_BCN1_R RED BEACON LIGHT MCM03
670 NCP1_8_VFD1:I.IO_1 SPARE MCM03
671 NCP1_8_VFD1:SI.In00Data NCP1_8_EPC1 E-STOP PULLCORD MCM03
672 NCP1_8_VFD1:SI.In01Data NCP1_8_EPC1_2 E-STOP PULLCORD MCM03
673 NCP1_8_VFD1:SI.In02Data NCP1_8_EPC2 E-STOP PULLCORD MCM03
674 NCP1_8_VFD1:SI.In03Data NCP1_8_EPC2_2 E-STOP PULLCORD MCM03
675 NCP1_8_VFD1:SO.Out00Output SPARE MCM03
676 NCP1_1_FIO1:O.Pt00.Data NCP1_1_BCN1_R RED BEACON LIGHT MCM03
677 NCP1_1_FIO1:I.Pt01.Data SPARE MCM03
678 NCP1_1_FIO1:O.Pt10.Data NCP1_1_BCN3_A AMBER BEACON LIGHT MCM03
679 NCP1_1_FIO1:O.Pt11.Data NCP1_1_BCN3_H ALARM HORN MCM03
680 NCP1_1_FIO1:I.Pt12.Data NCP1_1_TPE4 TRACKING PHOTOEYE MCM03
681 NCP1_1_FIO1:O.Pt13.Data SPARE MCM03
682 NCP1_1_FIO1:I.Pt14.Data SPARE MCM03
683 NCP1_1_FIO1:O.Pt15.Data SPARE MCM03
684 NCP1_1_FIO1:I.Pt02.Data NCP1_1_S1_PB START PUSHBUTTON MCM03
685 NCP1_1_FIO1:O.Pt03.Data NCP1_1_S1_PB_LT START PUSHBUTTON LIGHT MCM03
686 NCP1_1_FIO1:I.Pt04.Data NCP1_1_S2_PB START PUSHBUTTON MCM03
687 NCP1_1_FIO1:O.Pt05.Data NCP1_1_S2_PB_LT START PUSHBUTTON LIGHT MCM03
688 NCP1_1_FIO1:I.Pt06.Data NCP1_1_TPE3 TRACKING PHOTOEYE MCM03
689 NCP1_1_FIO1:O.Pt07.Data SPARE MCM03
690 NCP1_1_FIO1:I.Pt08.Data NCP1_1_TPE5 TRACKING PHOTOEYE MCM03
691 NCP1_1_FIO1:I.Pt09.Data SPARE MCM03
692 NCP1_2_FIO1:O.Pt00.Data NCP1_2_BCN2_A AMBER BEACON LIGHT MCM03
693 NCP1_2_FIO1:O.Pt01.Data NCP1_2_BCN2_R RED BEACON LIGHT MCM03
694 NCP1_2_FIO1:I.Pt10.Data NCP1_2_TPE3 TRACKING PHOTOEYE MCM03
695 NCP1_2_FIO1:I.Pt11.Data NCP1_2_TPE4 TRACKING PHOTOEYE MCM03
696 NCP1_2_FIO1:I.Pt12.Data NCP1_2_TPE5 TRACKING PHOTOEYE MCM03
697 NCP1_2_FIO1:O.Pt13.Data SPARE MCM03
698 NCP1_2_FIO1:I.Pt14.Data SPARE MCM03
699 NCP1_2_FIO1:O.Pt15.Data SPARE MCM03
700 NCP1_2_FIO1:O.Pt02.Data NCP1_2_BCN1_R RED BEACON LIGHT MCM03
701 NCP1_2_FIO1:O.Pt03.Data NCP1_2_BCN3_A AMBER BEACON LIGHT MCM03
702 NCP1_2_FIO1:I.Pt04.Data NCP1_2_JR1_PB JAM RESET PUSHBUTTON MCM03
703 NCP1_2_FIO1:O.Pt05.Data NCP1_2_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT MCM03
704 NCP1_2_FIO1:I.Pt06.Data NCP1_2_S1_PB START PUSHBUTTON MCM03
705 NCP1_2_FIO1:O.Pt07.Data NCP1_2_S1_PB_LT START PUSHBUTTON LIGHT MCM03
706 NCP1_2_FIO1:I.Pt08.Data NCP1_2_S2_PB START PUSHBUTTON MCM03
707 NCP1_2_FIO1:O.Pt09.Data NCP1_2_S2_PB_LT START PUSHBUTTON LIGHT MCM03
708 NCP1_3_FIO1:O.Pt00.Data NCP1_3_BCN2_A AMBER BEACON LIGHT MCM03
709 NCP1_3_FIO1:O.Pt01.Data NCP1_3_BCN2_R RED BEACON LIGHT MCM03
710 NCP1_3_FIO1:I.Pt10.Data NCP1_3_JR3_PB JAM RESET PUSHBUTTON MCM03
711 NCP1_3_FIO1:O.Pt11.Data NCP1_3_JR3_PB_LT JAM RESET PUSHBUTTON LIGHT MCM03
712 NCP1_3_FIO1:I.Pt12.Data NCP1_3_S1_PB START PUSHBUTTON MCM03
713 NCP1_3_FIO1:O.Pt13.Data NCP1_3_S1_PB_LT START PUSHBUTTON LIGHT MCM03
714 NCP1_3_FIO1:I.Pt14.Data NCP1_3_S2_PB START PUSHBUTTON MCM03
715 NCP1_3_FIO1:O.Pt15.Data NCP1_3_S2_PB_LT START PUSHBUTTON LIGHT MCM03
716 NCP1_3_FIO1:O.Pt02.Data NCP1_3_BCN1_R RED BEACON LIGHT MCM03
717 NCP1_3_FIO1:O.Pt03.Data NCP1_3_BCN3_A AMBER BEACON LIGHT MCM03
718 NCP1_3_FIO1:O.Pt04.Data NCP1_3_BCN4_A AMBER BEACON LIGHT MCM03
719 NCP1_3_FIO1:O.Pt05.Data SPARE MCM03
720 NCP1_3_FIO1:I.Pt06.Data NCP1_3_JR1_PB JAM RESET PUSHBUTTON MCM03
721 NCP1_3_FIO1:O.Pt07.Data NCP1_3_JR1_PB_LT JAM RESET PUSHBUTTON LIGHT MCM03
722 NCP1_3_FIO1:I.Pt08.Data NCP1_3_JR2_PB JAM RESET PUSHBUTTON MCM03
723 NCP1_3_FIO1:O.Pt09.Data NCP1_3_JR2_PB_LT JAM RESET PUSHBUTTON LIGHT MCM03
724 NCP1_8_FIO1:O.Pt00.Data NCP1_8_BCN2_R RED BEACON LIGHT MCM03
725 NCP1_8_FIO1:O.Pt01.Data NCP1_8_BCN2_H HORN MCM03
726 NCP1_8_FIO1:I.Pt10.Data SPARE MCM03
727 NCP1_8_FIO1:I.Pt11.Data SPARE MCM03
728 NCP1_8_FIO1:I.Pt12.Data SPARE MCM03
729 NCP1_8_FIO1:O.Pt13.Data SPARE MCM03
730 NCP1_8_FIO1:I.Pt14.Data SPARE MCM03
731 NCP1_8_FIO1:O.Pt15.Data SPARE MCM03
732 NCP1_8_FIO1:I.Pt02.Data NCP1_8_S1_PB START PUSHBUTTON MCM03
733 NCP1_8_FIO1:O.Pt03.Data NCP1_8_S1_PB_LT START PUSHBUTTON LIGHT MCM03
734 NCP1_8_FIO1:I.Pt04.Data NCP1_8_S2_PB START PUSHBUTTON MCM03
735 NCP1_8_FIO1:O.Pt05.Data NCP1_8_S2_PB_LT START PUSHBUTTON LIGHT MCM03
736 NCP1_8_FIO1:I.Pt06.Data SPARE MCM03
737 NCP1_8_FIO1:O.Pt07.Data SPARE MCM03
738 NCP1_8_FIO1:I.Pt08.Data SPARE MCM03
739 NCP1_8_FIO1:I.Pt09.Data SPARE MCM03
740 PDP5_FIO1:I.Pt00.Data PDP5_CB1 CIRCUIT BREAKER MONITORING MCM03
741 PDP5_FIO1:I.Pt01.Data PDP5_CB2 CIRCUIT BREAKER MONITORING MCM03
742 PDP5_FIO1:I.Pt10.Data PDP5_CB9 CIRCUIT BREAKER MONITORING MCM03
743 PDP5_FIO1:I.Pt11.Data PDP5_CB10 CIRCUIT BREAKER MONITORING MCM03
744 PDP5_FIO1:I.Pt12.Data PDP5_PWM1 PDP5_PHASE MONITOR MCM03
745 PDP5_FIO1:O.Pt13.Data SPARE MCM03
746 PDP5_FIO1:O.Pt15.Data SPARE MCM03
747 PDP5_FIO1:I.Pt02.Data PDP5_CB3 CIRCUIT BREAKER MONITORING MCM03
748 PDP5_FIO1:I.Pt03.Data PDP5_CB4 CIRCUIT BREAKER MONITORING MCM03
749 PDP5_FIO1:I.Pt04.Data PDP5_CB5 CIRCUIT BREAKER MONITORING MCM03
750 PDP5_FIO1:O.Pt05.Data SPARE MCM03
751 PDP5_FIO1:I.Pt06.Data PDP5_CB6 CIRCUIT BREAKER MONITORING MCM03
752 PDP5_FIO1:O.Pt07.Data SPARE MCM03
753 PDP5_FIO1:I.Pt08.Data PDP5_CB7 CIRCUIT BREAKER MONITORING MCM03
754 PDP5_FIO1:I.Pt09.Data PDP5_CB8 CIRCUIT BREAKER MONITORING MCM03
755 PDP5_FIOH1:I.ProcessDataIn.Connector_7_A_Pin_4 PDP5_CB11 CIRCUIT BREAKER MONITORING MCM03
756 PDP5_FIOH1:I.ProcessDataIn.Connector_7_B_Pin_2 PDP5_CB12 CIRCUIT BREAKER MONITORING MCM03
757 PDP5_FIOH1:I.ProcessDataIn.Connector_6_A_Pin_4 PDP5_CB21 CIRCUIT BREAKER MONITORING MCM03
758 PDP5_FIOH1:I.ProcessDataIn.Connector_6_B_Pin_2 PDP5_CB22 CIRCUIT BREAKER MONITORING MCM03
759 PDP5_FIOH1:I.ProcessDataIn.Connector_4_A_Pin_4 PDP5_CB23 CIRCUIT BREAKER MONITORING MCM03
760 PDP5_FIOH1:I.ProcessDataIn.Connector_4_B_Pin_2 PDP5_CB24 CIRCUIT BREAKER MONITORING MCM03
761 PDP5_FIOH1:I.ProcessDataIn.Connector_2_A_Pin_4 PDP5_CB25 CIRCUIT BREAKER MONITORING MCM03
762 PDP5_FIOH1:I.ProcessDataIn.Connector_2_B_Pin_2 PDP5_CB26 CIRCUIT BREAKER MONITORING MCM03
763 PDP5_FIOH1:I.ProcessDataIn.Connector_5_A_Pin_4 PDP5_CB13 CIRCUIT BREAKER MONITORING MCM03
764 PDP5_FIOH1:I.ProcessDataIn.Connector_5_B_Pin_2 PDP5_CB14 CIRCUIT BREAKER MONITORING MCM03
765 PDP5_FIOH1:I.ProcessDataIn.Connector_3_A_Pin_4 PDP5_CB15 CIRCUIT BREAKER MONITORING MCM03
766 PDP5_FIOH1:I.ProcessDataIn.Connector_3_B_Pin_2 PDP5_CB16 CIRCUIT BREAKER MONITORING MCM03
767 PDP5_FIOH1:I.ProcessDataIn.Connector_1_A_Pin_4 PDP5_CB17 CIRCUIT BREAKER MONITORING MCM03
768 PDP5_FIOH1:I.ProcessDataIn.Connector_1_B_Pin_2 PDP5_CB18 CIRCUIT BREAKER MONITORING MCM03
769 PDP5_FIOH1:I.ProcessDataIn.Connector_8_A_Pin_4 PDP5_CB19 CIRCUIT BREAKER MONITORING MCM03
770 PDP5_FIOH1:I.ProcessDataIn.Connector_8_B_Pin_2 PDP5_CB20 CIRCUIT BREAKER MONITORING MCM03

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,31 @@
import pandas as pd
import re
def classify_signal(desca, tagname, descb=None):
def _is_hub_tagname_pattern(tagname: str) -> bool:
"""Check if TAGNAME matches hub patterns like FIO1H, FIO2H3, FIOH1, etc."""
# Match patterns like FIO1H, FIO2H3, FIOH1, etc.
hub_pattern = re.compile(r'FIO(\d+)?H\d*', re.IGNORECASE)
return bool(hub_pattern.search(tagname))
def _is_master_tagname_pattern(tagname: str) -> bool:
"""Check if TAGNAME matches master patterns like FIO2M1, FIO3M, etc."""
# Match patterns like FIO2M1, FIO3M, etc.
master_pattern = re.compile(r'FIO\d+M\d*', re.IGNORECASE)
return bool(master_pattern.search(tagname))
def _is_hub_desca_pattern(desca: str) -> bool:
"""Check if DESCA matches hub patterns like FIO1H1, FIO2H3, etc."""
# Match patterns like FIO1H1, FIO2H3, etc. in DESCA
hub_pattern = re.compile(r'FIO\d+H\d+', re.IGNORECASE)
return bool(hub_pattern.search(desca))
def classify_signal(desca, tagname, descb=None, excel_filename=None):
"""
Classify signal based on DESCA content, TAGNAME, and DESCB
Classify signal based on DESCA content, TAGNAME, DESCB, and Excel filename
Priority order matters: PB_LT before PB, FIOH before FIO, SOL+DIVERT before SOL
Special rules:
- If Excel filename contains MCM05, SOL signals are classified as 'O' instead of 'IOLink'
"""
if pd.isna(desca):
return 'UNKNOWN'
@ -13,6 +34,11 @@ def classify_signal(desca, tagname, descb=None):
tagname_str = str(tagname).upper()
descb_str = str(descb).upper() if pd.notna(descb) else ''
# Check if Excel filename contains MCM05 (special rule for solenoids)
is_mcm05 = False
if excel_filename:
is_mcm05 = 'MCM05' in str(excel_filename).upper()
# Check for SPARE first
if re.search(r'SPARE', desca_str):
return 'SPARE'
@ -33,21 +59,20 @@ def classify_signal(desca, tagname, descb=None):
elif re.search(r'_H', desca_str):
return 'O'
# IOLink patterns (check FIOH before FIO due to priority)
# IOLink patterns (check these first before general I patterns to avoid conflicts)
elif re.search(r'SOL', desca_str) and re.search(r'DIVERT', descb_str):
# MCM05 rule: SOL signals should be 'O', not 'IOLink'
if is_mcm05:
return 'O'
return 'IOLink'
elif re.search(r'LPE', desca_str):
return 'IOLink'
elif re.search(r'FIOH', desca_str):
return 'IOLink'
elif re.search(r'BCN', desca_str) and 'FIO' in tagname_str:
elif re.search(r'LPE', desca_str): # LPE must be checked before PE patterns
return 'IOLink'
# Signal O patterns continued (SOL without DIVERT)
elif re.search(r'SOL', desca_str):
return 'O'
# Signal I patterns
# Signal I patterns (check these after IOLink patterns to avoid conflicts)
elif re.search(r'TS\d*|BDS\d*', desca_str): # TS and BDS patterns
return 'I'
elif re.search(r'LRPE', desca_str): # LRPE patterns
return 'I'
elif re.search(r'PWM', desca_str):
return 'I'
elif re.search(r'CB', desca_str):
@ -62,12 +87,27 @@ def classify_signal(desca, tagname, descb=None):
return 'I'
elif re.search(r'PX', desca_str):
return 'I'
elif re.search(r'PE\d*', desca_str): # PE patterns (moved after LPE check)
return 'I'
elif re.search(r'PB', desca_str): # PB patterns (already had this but moved up)
return 'I'
# Check SOL patterns first (before general FIOH patterns)
elif re.search(r'SOL', desca_str):
# SOL signals are always 'O' (including MCM05 rule)
return 'O'
# Remaining IOLink patterns
elif re.search(r'FIOH', desca_str):
return 'IOLink'
elif _is_hub_desca_pattern(desca_str): # Check for FIO1H1, FIO2H3 etc patterns in DESCA
return 'IOLink'
elif _is_hub_tagname_pattern(tagname_str): # Check for FIO1H, FIO2H3 etc patterns (lower priority)
return 'IOLink'
elif re.search(r'BCN', desca_str) and 'FIO' in tagname_str:
return 'IOLink'
elif re.search(r'DISC', desca_str):
return 'I'
elif re.search(r'PE', desca_str):
return 'I'
elif re.search(r'PB', desca_str): # This comes after PB_LT check
return 'I'
elif re.search(r'ESTOP', desca_str):
return 'I'
elif 'IB16' in tagname_str or 'IB16S' in tagname_str:
@ -85,6 +125,10 @@ def get_device_type(tagname):
return 'APF'
elif 'FIOH' in tagname_str:
return 'Hub'
elif _is_hub_tagname_pattern(tagname_str): # Check for FIO1H, FIO2H3 etc patterns
return 'Hub'
elif _is_master_tagname_pattern(tagname_str): # Check for FIO2M1, FIO3M etc patterns
return 'M12DR'
elif 'FIO' in tagname_str:
return 'M12DR'
elif 'SIO' in tagname_str:

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -31,17 +31,18 @@ def post_process_io_data(input_file, output_file):
df = df.reset_index(drop=True)
# ------------------------------------------------------------------
# Remove SPARE rows that directly follow a FIOH row
# Remove SPARE rows that directly follow a FIO[number]H row
# ------------------------------------------------------------------
rows_to_remove_spare_after_fioh = []
fioh_mask_initial = df['DESCA'].astype(str).str.contains(r'FIOH', case=False, na=False)
# Match FIO followed by any number and then H (e.g., FIO1H, FIO2H, etc.)
fioh_mask_initial = df['DESCA'].astype(str).str.contains(r'FIO\d+H', case=False, na=False)
for idx in df[fioh_mask_initial].index:
if idx + 1 < len(df):
next_desc = str(df.at[idx + 1, 'DESC']).strip().upper()
if next_desc == 'SPARE':
rows_to_remove_spare_after_fioh.append(idx + 1)
if rows_to_remove_spare_after_fioh:
print(f"Removed {len(rows_to_remove_spare_after_fioh)} SPARE rows following FIOH entries")
print(f"Removed {len(rows_to_remove_spare_after_fioh)} SPARE rows following FIO[number]H entries")
df = df.drop(rows_to_remove_spare_after_fioh).reset_index(drop=True)
# ------------------------------------------------------------------
@ -65,10 +66,14 @@ def post_process_io_data(input_file, output_file):
for idx in range(len(df) - 1):
try:
current_signal = str(df.at[idx, 'SIGNAL']).strip()
current_iopath = str(df.at[idx, 'IO_PATH']).strip()
current_desca = str(df.at[idx, 'DESCA']).strip().upper()
next_desc = str(df.at[idx + 1, 'DESC']).strip().upper()
if (current_signal == 'IOLink' and
# Check both SIGNAL column and IO_PATH column for IOLink
is_iolink = (current_signal == 'IOLink' or 'IOLink' in current_iopath)
if (is_iolink and
'SOL' in current_desca and
next_desc == 'SPARE'):
rows_to_remove_spare_after_iolink_sol.append(idx + 1)
@ -91,6 +96,10 @@ def post_process_io_data(input_file, output_file):
beacon3_rows = df[beacon3_mask].copy()
beacon2_rows = df[beacon2_mask].copy()
# Identify solenoid IOLINK rows (for expansion before removal)
solenoid_mask = iolink_mask & df['DESCA'].str.contains(r'SOL', case=False, na=False)
solenoid_rows = df[solenoid_mask].copy()
# Remove ALL IOLink rows (not just beacon ones)
removed_iolink_count = iolink_mask.sum()
df = df[~iolink_mask]
@ -129,6 +138,25 @@ def post_process_io_data(input_file, output_file):
print(f"Added {len(new_rows)} rows for beacon lights")
df = pd.concat([df, pd.DataFrame(new_rows)], ignore_index=True)
# Generate solenoid valve entries for each SOL IOLINK
sol_new_rows = []
for _, row in solenoid_rows.iterrows():
base_identifier = str(row['DESCA']).strip()
base_path = f"{base_identifier}:O.ProcessDataOut"
# Generate 8 valves with 2 solenoids each (12 and 14)
for valve_num in range(1, 9):
for solenoid_num, direction in [(12, "LEFT"), (14, "RIGHT")]:
new_row = row.copy()
new_row['IO_PATH'] = f"{base_path}.Valve_{valve_num}_solenoid_{solenoid_num}"
new_row['DESC'] = f"{base_identifier} DIVERT MODULE {valve_num} {direction}"
new_row['SIGNAL'] = 'O'
sol_new_rows.append(new_row)
if sol_new_rows:
print(f"Added {len(sol_new_rows)} rows for solenoid valves")
df = pd.concat([df, pd.DataFrame(sol_new_rows)], ignore_index=True)
# Add subsystem to all rows
subsystem_match = re.search(r'(MCM\d+)', input_file)
subsystem = subsystem_match.group(1) if subsystem_match else 'UNKNOWN'

View File

@ -7,6 +7,14 @@ from classifiers import classify_signal, get_device_type
from utils import normalize_vfd_name, normalize_io_path, assign_partnumber, combine_desc
from io_paths import get_io_path
def _is_hub_module(tagname):
"""Check if a TAGNAME represents a hub module (FIO1H1, FIO2H3, etc.)"""
import re
tagname_str = str(tagname).upper()
# Match patterns like FIO1H1, FIO2H3, FIOH1, etc.
hub_pattern = re.compile(r'FIO(\d+)?H\d+', re.IGNORECASE)
return bool(hub_pattern.search(tagname_str))
def process_data(desc_df, network_df, original_file, apf_df, m12dr_df, hub_df, sorter_hub_df, sio_df, ib16_df, ob16e_df, ib16s_df):
validation_errors = []
@ -40,12 +48,31 @@ def process_data(desc_df, network_df, original_file, apf_df, m12dr_df, hub_df, s
result_df['DESCA'] = result_df['DESCA'].fillna('SPARE')
result_df.loc[result_df['DESCA'] == '', 'DESCA'] = 'SPARE'
result_df['IP'] = result_df['NORMALIZED_TAGNAME'].map(network_mapping)
result_df['PARTNUMBER'] = result_df['NORMALIZED_TAGNAME'].map(part_number_mapping)
# Map IP and PARTNUMBER, but skip hub modules (they connect via IO-Link to parent masters)
def get_ip_for_device(normalized_tagname, tagname):
# Hub modules don't have their own IP addresses
if _is_hub_module(tagname):
return ''
return network_mapping.get(normalized_tagname, '')
def get_partnumber_for_device(normalized_tagname, tagname):
# Hub modules don't get part numbers from network sheet
if _is_hub_module(tagname):
return ''
return part_number_mapping.get(normalized_tagname, '')
result_df['IP'] = result_df.apply(lambda row: get_ip_for_device(row['NORMALIZED_TAGNAME'], row['TAGNAME']), axis=1)
result_df['PARTNUMBER'] = result_df.apply(lambda row: get_partnumber_for_device(row['NORMALIZED_TAGNAME'], row['TAGNAME']), axis=1)
# Add DPM column mapping for FIOM-DPM relationships (skip hub modules)
def get_dpm_for_device(normalized_tagname, tagname):
# Hub modules don't have DPM relationships
if _is_hub_module(tagname):
return ''
return dpm_to_devices_mapping.get(normalized_tagname, '')
# Add DPM column mapping for FIOM-DPM relationships
dpm_to_devices_mapping = dict(zip(network_df['NORMALIZED_NAME'], network_df['DPM']))
result_df['DPM'] = result_df['NORMALIZED_TAGNAME'].map(dpm_to_devices_mapping)
result_df['DPM'] = result_df.apply(lambda row: get_dpm_for_device(row['NORMALIZED_TAGNAME'], row['TAGNAME']), axis=1)
result_df['PARTNUMBER'] = result_df.apply(assign_partnumber, axis=1)
@ -55,7 +82,7 @@ def process_data(desc_df, network_df, original_file, apf_df, m12dr_df, hub_df, s
print("\nClassifying signals and adding IO paths...")
# Add signal classification column
result_df['SIGNAL'] = result_df.apply(lambda row: classify_signal(row['DESCA'], row['TAGNAME'], row['DESCB']), axis=1)
result_df['SIGNAL'] = result_df.apply(lambda row: classify_signal(row['DESCA'], row['TAGNAME'], row['DESCB'], original_file), axis=1)
# Add device type column
result_df['DEVICE_TYPE'] = result_df['TAGNAME'].apply(get_device_type)
@ -146,8 +173,8 @@ def process_data(desc_df, network_df, original_file, apf_df, m12dr_df, hub_df, s
missing_desc_rows = desc_df[desc_df['NORMALIZED_TAGNAME'].isin(missing_in_network_norm)]
original_missing_tagnames = set(missing_desc_rows['TAGNAME'].unique())
# Filter out FIOH-containing names for logging
missing_in_network_filtered = {name for name in original_missing_tagnames if 'FIOH' not in str(name).upper()}
# Filter out hub modules (FIOH and FIO1H1, FIO2H2 patterns) for logging
missing_in_network_filtered = {name for name in original_missing_tagnames if not _is_hub_module(name)}
if missing_in_network_filtered:
print(f"\nFound {len(missing_in_network_filtered)} TAGNAMEs present in DESC but not in NETWORK_PLC.")
for name in sorted(list(missing_in_network_filtered)):

View File

@ -1,6 +1,12 @@
import pandas as pd
import re
def _is_hub_pattern(tagname):
"""Check if TAGNAME matches hub patterns like FIO1H1, FIO2H3, etc."""
# Match patterns like FIO1H1, FIO2H3, etc.
hub_pattern = re.compile(r'FIO(\d+)?H\d+', re.IGNORECASE)
return bool(hub_pattern.search(tagname))
def normalize_io_term(term):
"""Handle IO term variations like IO1 vs IO01"""
if pd.isna(term):
@ -56,8 +62,8 @@ def assign_partnumber(row):
return existing_partnumber
# Only assign default part numbers if no existing part number
# FIOH devices
if 'FIOH' in tagname:
# Hub devices (FIOH or FIO1H1, FIO2H3 patterns)
if 'FIOH' in tagname or _is_hub_pattern(tagname):
return 'TBIL-M1-16DXP'
# DPM devices (only if contains DPM but NOT FIO)
elif 'DPM' in tagname and 'FIO' not in tagname:

View File

@ -1 +1 @@
MCM_S_PB=SFT_MCM_S_PB, PS5_1_S1_PB=SFT_PS5_1_S1_PB, PS5_1_S2_PB=SFT_PS5_1_S2_PB, PS6_1_S1_PB=SFT_PS6_1_S1_PB, PS6_1_S2_PB=SFT_PS6_1_S2_PB, PS7_1_S1_PB=SFT_PS7_1_S1_PB, PS7_1_S2_PB=SFT_PS7_1_S2_PB, PS7_9_S1_PB=SFT_PS7_9_S1_PB, PS7_9_S2_PB=SFT_PS7_9_S2_PB, UL13_1_SS1_SPB=SFT_UL13_1_SS1_SPB, UL13_4_S1_PB=SFT_UL13_4_S1_PB, UL13_4_S2_PB=SFT_UL13_4_S2_PB, UL13_8_S1_PB=SFT_UL13_8_S1_PB, UL13_8_S2_PB=SFT_UL13_8_S2_PB, UL14_3_S1_PB=SFT_UL14_3_S1_PB, UL14_3_S2_PB=SFT_UL14_3_S2_PB, UL14_4_S1_PB=SFT_UL14_4_S1_PB, UL14_4_S2_PB=SFT_UL14_4_S2_PB, UL15_3_S1_PB=SFT_UL15_3_S1_PB, UL15_3_S2_PB=SFT_UL15_3_S2_PB, UL15_4_S1_PB=SFT_UL15_4_S1_PB, UL15_4_S2_PB=SFT_UL15_4_S2_PB, UL16_1_SS1_SPB=SFT_UL16_1_SS1_SPB, UL16_2_S1_PB=SFT_UL16_2_S1_PB, UL16_2_S2_PB=SFT_UL16_2_S2_PB, UL17_3_S1_PB=SFT_UL17_3_S1_PB, UL17_3_S2_PB=SFT_UL17_3_S2_PB, UL17_4_S1_PB=SFT_UL17_4_S1_PB, UL17_4_S2_PB=SFT_UL17_4_S2_PB, UL18_10_S1_PB=SFT_UL18_10_S1_PB, UL18_10_S2_PB=SFT_UL18_10_S2_PB, UL18_3_S1_PB=SFT_UL18_3_S1_PB, UL18_3_S2_PB=SFT_UL18_3_S2_PB, UL18_4_S1_PB=SFT_UL18_4_S1_PB, UL18_4_S2_PB=SFT_UL18_4_S2_PB, UL19_1_SS1_SPB=SFT_UL19_1_SS1_SPB, UL19_2_S1_PB=SFT_UL19_2_S1_PB, UL19_2_S2_PB=SFT_UL19_2_S2_PB, UL20_3_S1_PB=SFT_UL20_3_S1_PB, UL20_3_S2_PB=SFT_UL20_3_S2_PB, UL20_4_S1_PB=SFT_UL20_4_S1_PB, UL20_4_S2_PB=SFT_UL20_4_S2_PB, UL21_11_S1_PB=SFT_UL21_11_S1_PB, UL21_11_S2_PB=SFT_UL21_11_S2_PB, UL21_13_S1_PB=SFT_UL21_13_S1_PB, UL21_13_S2_PB=SFT_UL21_13_S2_PB, UL21_3_S1_PB=SFT_UL21_3_S1_PB, UL21_3_S2_PB=SFT_UL21_3_S2_PB, UL21_4_S1_PB=SFT_UL21_4_S1_PB, UL21_4_S2_PB=SFT_UL21_4_S2_PB
MCM_S_PB=SFT_MCM_S_PB, NCP1_15_S1_PB=SFT_NCP1_15_S1_PB, NCP1_15_S2_PB=SFT_NCP1_15_S2_PB, NCP1_21_S1_PB=SFT_NCP1_21_S1_PB, NCP1_21_S2_PB=SFT_NCP1_21_S2_PB, NCP1_9_S1_PB=SFT_NCP1_9_S1_PB, NCP1_9_S2_PB=SFT_NCP1_9_S2_PB, NCS1_4_S1_PB=SFT_NCS1_4_S1_PB, NCS1_4_S2_PB=SFT_NCS1_4_S2_PB, NCS2_2_S1_PB=SFT_NCS2_2_S1_PB, NCS2_2_S2_PB=SFT_NCS2_2_S2_PB

View File

@ -345,7 +345,7 @@ def run_l5x_to_acd_compiler(paths: dict, project_name: str, safety_only: bool =
project_type = "MCM04"
options['enable_feeder_optimization'] = True
# Setup compilation with wipe and dynamic generation
# Setup compilation with smart replacement (no wiping)
# Always run quietly and suppress tool output; caller prints step OK/FAIL
_buf = io.StringIO()
with contextlib.redirect_stdout(_buf), contextlib.redirect_stderr(_buf):
@ -353,7 +353,8 @@ def run_l5x_to_acd_compiler(paths: dict, project_name: str, safety_only: bool =
source_l5x=complete_l5x,
project_name=project_name or complete_l5x.stem,
compilation_options=options,
wipe_existing=True
wipe_existing=False, # Use smart replacement instead of wiping
replace_mode=True
)
if verbose:
_append_log(log_file, "Step 4: L5X2ACD Compiler output", _buf.getvalue())
@ -445,7 +446,7 @@ def main() -> None:
"""Main entry point for complete workflow."""
parser = argparse.ArgumentParser(description="Complete PLC generation workflow from raw Excel to ACD")
parser.add_argument('--excel-file', type=Path, help='Raw Excel file to process')
parser.add_argument('--excel-file', type=str, help='Raw Excel file to process')
# Project selection
parser.add_argument('--project', help='Project prefix (e.g., MTN6, SAT9, CNO8) - automatically selects config files')
@ -538,6 +539,12 @@ def main() -> None:
parser.print_help()
sys.exit(1)
# Normalize the Excel file path to handle Windows-style paths in WSL
excel_file_path = Path(args.excel_file.replace('\\', '/'))
if not excel_file_path.is_absolute():
excel_file_path = paths['project_root'] / excel_file_path
args.excel_file = excel_file_path
# Setup enhanced logging
from src.logging_config import setup_logging, get_logger
ts = datetime.now().strftime('%Y%m%d_%H%M%S')

View File

@ -92,6 +92,12 @@ class ExtractionConfig:
jpe_include_tokens: list[str] = field(default_factory=lambda: ['JPE', '_2_PE'])
jpe_exclude_tokens: list[str] = field(default_factory=lambda: ['3CH_PE'])
jpe_input_default: str = 'In_2'
# JPE lane-based JR station mappings for when automatic detection fails
# Format: {"lane_prefix": {"start": "UL1_1", "stop": "UL1_13", "jr_station": "UL1_9_JR1_PB"}}
jpe_lane_jr_mappings: dict[str, dict[str, str]] = field(default_factory=dict)
# JPE lane-based beacon mappings for when automatic detection fails
# Format: {"lane_prefix": {"start": "UL1_1", "stop": "UL1_13", "beacon_output": "UL1_9_FIOH1:O.ProcessDataOut.Connector_1_A_Pin_4"}}
jpe_lane_beacon_mappings: dict[str, dict[str, str]] = field(default_factory=dict)
fpe_include_tokens: list[str] = field(default_factory=lambda: ['FPE', '3CH_PE'])
# FLOW_CTRL generation controls
@ -115,6 +121,9 @@ class ExtractionConfig:
flow_ctrl_select_vfds_by_name: bool = True
# Lane grouping: number of leading underscore-separated tokens to use as lane key (e.g., 3 -> UL5_3_VFD1 base UL5_3_VFD)
flow_ctrl_lane_tokens: int = 3
# Cross-lane interlock mappings (source_vfd -> list of target_vfds)
# Format: {"UL1_9_VFD1": ["UL2_10_VFD1", "UL3_9_VFD1"]}
flow_ctrl_cross_lane_interlocks: dict[str, list[str]] = field(default_factory=dict)
@dataclass
class RoutineConfig:
@ -205,10 +214,14 @@ class RoutineConfig:
'pb_chute': 'R043_PB_CHUTE',
'station_jr_chute': 'R044_STATION_JR_CHUTE',
'station_jr_pb': 'R090_STATION_JR_PB',
'station_s_pb': 'R095_STATION_S_PB',
'station_ss_pb': 'R096_STATION_SS_PB',
'station_epc': 'R097_STATION_EPC',
'jpe': 'R100_JPE',
'fpe': 'R101_FPE',
'pmm': 'R060_PMM',
'cb_monitor': 'R070_CB_MONITOR',
'encoder': 'R080_ENCODER',
'rack': 'R011_RACK',
'mcm': 'R010_MCM',
'inputs': 'R010_INPUTS',
@ -216,6 +229,8 @@ class RoutineConfig:
'resets': 'R012_RESETS',
'estops': 'R020_ESTOPS',
'zones': 'R030_ZONES',
'taching_belts': 'ZZZ_Taching_Belts',
'belt_tracking': 'ZZZ_BeltTracking',
})
@dataclass

View File

@ -145,7 +145,7 @@ class DataLoader:
# Make path relative to project root if needed
if not zones_file.is_absolute():
zones_file = Path(__file__).parent.parent.parent / zones_file
zones_df = pd.DataFrame(columns=['name', 'start', 'stop', 'interlock'])
zones_df = pd.DataFrame(columns=['name', 'start', 'stop', 'interlock', 'ranges'])
try:
with open(zones_file, 'r', encoding='utf-8') as f:
data = json.load(f)
@ -191,11 +191,16 @@ class DataLoader:
entries = data.get('DEFAULT') or []
_log.debug("Zones: using DEFAULT group", default_count=len(entries))
zones_df = pd.DataFrame(entries, columns=['name', 'start', 'stop', 'interlock'])
# Convert to DataFrame preserving all fields including ranges
zones_df = pd.DataFrame(entries)
# Ensure required columns exist
for col in ['name', 'start', 'stop', 'interlock', 'ranges']:
if col not in zones_df.columns:
zones_df[col] = None
_log.debug("Zones: loaded", rows=len(zones_df))
except Exception:
# Keep empty
zones_df = pd.DataFrame(columns=['name', 'start', 'stop', 'interlock'])
zones_df = pd.DataFrame(columns=['name', 'start', 'stop', 'interlock', 'ranges'])
self._cache['zones'] = zones_df
return zones_df
@ -249,29 +254,14 @@ class DataLoader:
# Exclusion patterns for push buttons to exclude
rst_desca_exclude_patterns = (ex_cfg.rst_desca_exclude_patterns if ex_cfg else ['GS1'])
# Filter by DESC column
desc_mask = desc_ip['DESC'].str.contains('|'.join(rst_desc_contains), case=False, na=False)
exclude_mask = desc_ip['DESC'].str.contains('|'.join(rst_desc_excludes), case=False, na=False)
desc_filtered = desc_ip[desc_mask & ~exclude_mask]
# Filter by DESCB column - must contain 'START' and NOT contain 'LIGHT'
# Only include SPB (start pushbuttons), exclude STPB (stop pushbuttons) and _LT (lights)
start_mask = desc_ip['DESCB'].str.contains('START', case=False, na=False)
light_mask = desc_ip['DESCB'].str.contains('LIGHT', case=False, na=False)
desc_filtered = desc_ip[start_mask & ~light_mask]
# Filter by DESCA column patterns
desca_pattern_mask = desc_ip['DESCA'].str.contains('|'.join(rst_desca_patterns), case=False, na=False)
desca_ending_mask = desc_ip['DESCA'].str.endswith(tuple(rst_desca_endings), na=False)
desca_filtered = desc_ip[desca_pattern_mask | desca_ending_mask]
# Apply exclusion patterns to remove unwanted push buttons (GS1)
if rst_desca_exclude_patterns:
exclude_pattern = '|'.join(rst_desca_exclude_patterns)
# Filter out excluded patterns from both filtered datasets
desc_exclude_mask = desc_filtered['DESCA'].str.contains(exclude_pattern, case=False, na=False)
desca_exclude_mask = desca_filtered['DESCA'].str.contains(exclude_pattern, case=False, na=False)
desc_filtered = desc_filtered[~desc_exclude_mask]
desca_filtered = desca_filtered[~desca_exclude_mask]
# Combine results and remove duplicates
rst_df = pd.concat([desc_filtered, desca_filtered]).drop_duplicates()
return rst_df
# Simple filtering complete - return the DESCB filtered results
return desc_filtered
def _extract_sto(self) -> pd.DataFrame:
"""Extract STO (Safety Output) data from DESC_IP based on defined rules."""
@ -495,6 +485,34 @@ class DataLoader:
self._cache['station_jr_pb_data'] = self._extract_station_jr_pb_data()
return self._cache['station_jr_pb_data']
@property
def station_s_pb_data(self) -> dict:
"""Extract STATION_S_PB data from DESC_IP."""
if 'station_s_pb_data' not in self._cache:
self._cache['station_s_pb_data'] = self._extract_station_s_pb_data()
return self._cache['station_s_pb_data']
@property
def station_ss_pb_data(self) -> dict:
"""Extract STATION_SS_PB data from DESC_IP."""
if 'station_ss_pb_data' not in self._cache:
self._cache['station_ss_pb_data'] = self._extract_station_ss_pb_data()
return self._cache['station_ss_pb_data']
@property
def encoder_data(self) -> dict:
"""Extract ENCODER data from DESC_IP."""
if 'encoder_data' not in self._cache:
self._cache['encoder_data'] = self._extract_encoder_data()
return self._cache['encoder_data']
@property
def station_epc_data(self) -> dict:
"""Extract STATION_EPC data from DESC_IP."""
if 'station_epc_data' not in self._cache:
self._cache['station_epc_data'] = self._extract_station_epc_data()
return self._cache['station_epc_data']
@property
def jpe_data(self) -> dict:
"""Extract JPE data from DESC_IP."""
@ -728,6 +746,368 @@ class DataLoader:
return jr_pb_configs
def _extract_station_s_pb_data(self) -> dict:
"""Extract STATION_S_PB data by pairing S*_PB with matching S*_PB_LT entries."""
import re
desc_ip = self.desc_ip
network = self.network
s_pb_configs: dict[str, dict[str, str]] = {}
seen: set[str] = set()
# Regex to capture S_PB entries (e.g., PS1_1_S1_PB)
pb_regex = re.compile(r'^(?P<base>.+)_S(?P<num>\d+)_PB$', re.IGNORECASE)
for _, row in desc_ip.iterrows():
desca = str(row.get('DESCA', '')).strip()
if not desca:
continue
# Match S_PB pattern
m = pb_regex.match(desca.split()[0]) # Get first word only
if not m:
continue
base = m.group('base') # e.g., PS1_1
s_num = m.group('num') # e.g., 1
s_pb_name = f"{base}_S{s_num}_PB" # e.g., PS1_1_S1_PB
if s_pb_name in seen:
continue
# Locate PB row (input)
pb_row = desc_ip[desc_ip['DESCA'].str.startswith(s_pb_name, na=False)]
if pb_row.empty:
continue
input_path = str(pb_row.iloc[0].get('IO_PATH', '') or '')
if not input_path:
continue
# Find corresponding light (S*_PB_LT)
lt_desca = f"{s_pb_name}_LT"
lt_row = desc_ip[desc_ip['DESCA'].str.startswith(lt_desca, na=False)]
if lt_row.empty:
continue
output_path = str(lt_row.iloc[0].get('IO_PATH', '') or '')
if not output_path:
continue
# Find associated VFD with same base
vfd_mask = network['Name'].astype(str).str.contains(f'{base}_VFD', case=False, na=False)
vfd_rows = network[vfd_mask]
if vfd_rows.empty:
print(f" [WARNING] No VFD found for {s_pb_name} with base {base}")
continue
vfd_name = vfd_rows.iloc[0]['Name']
vfd_ctrl = f"{vfd_name}.CTRL"
s_pb_configs[s_pb_name] = {
'input_path': input_path,
'output_path': output_path,
'vfd_ctrl': vfd_ctrl
}
seen.add(s_pb_name)
print(f" Found STATION_S_PB config for {s_pb_name}")
return s_pb_configs
def _extract_station_ss_pb_data(self) -> dict:
"""Extract STATION_SS_PB data by finding SS*_SPB, SS*_SPB_LT, and SS*_STPB entries."""
import re
desc_ip = self.desc_ip
network = self.network
ss_pb_configs: dict[str, dict[str, str]] = {}
seen: set[str] = set()
# Regex to capture SS_SPB entries (e.g., UL3_1_SS1_SPB)
spb_regex = re.compile(r'^(?P<base>.+)_SS(?P<num>\d+)_SPB$', re.IGNORECASE)
for _, row in desc_ip.iterrows():
desca = str(row.get('DESCA', '')).strip()
if not desca:
continue
# Match SS_SPB pattern (start pushbutton)
m = spb_regex.match(desca.split()[0]) # Get first word only
if not m:
continue
base = m.group('base') # e.g., UL3_1
ss_num = m.group('num') # e.g., 1
ss_pb_name = f"{base}_SS{ss_num}" # e.g., UL3_1_SS1
if ss_pb_name in seen:
continue
# Find start pushbutton (SS*_SPB)
start_desca = f"{ss_pb_name}_SPB"
start_row = desc_ip[desc_ip['DESCA'].str.startswith(start_desca, na=False)]
if start_row.empty:
continue
start_input_path = str(start_row.iloc[0].get('IO_PATH', '') or '')
if not start_input_path:
continue
# Find start pushbutton light (SS*_SPB_LT)
light_desca = f"{start_desca}_LT"
light_row = desc_ip[desc_ip['DESCA'].str.startswith(light_desca, na=False)]
if light_row.empty:
continue
light_output_path = str(light_row.iloc[0].get('IO_PATH', '') or '')
if not light_output_path:
continue
# Find stop pushbutton (SS*_STPB)
stop_desca = f"{ss_pb_name}_STPB"
stop_row = desc_ip[desc_ip['DESCA'].str.startswith(stop_desca, na=False)]
if stop_row.empty:
continue
stop_input_path = str(stop_row.iloc[0].get('IO_PATH', '') or '')
if not stop_input_path:
continue
# Find associated VFD with same base
vfd_mask = network['Name'].astype(str).str.contains(f'{base}_VFD', case=False, na=False)
vfd_rows = network[vfd_mask]
if vfd_rows.empty:
print(f" [WARNING] No VFD found for {ss_pb_name} with base {base}")
continue
vfd_name = vfd_rows.iloc[0]['Name']
vfd_ctrl = f"{vfd_name}.CTRL"
# Get FIO connection fault from the TAGNAME of any of the components
fio_tagname = start_row.iloc[0].get('TAGNAME', '')
if not fio_tagname:
fio_tagname = light_row.iloc[0].get('TAGNAME', '')
if not fio_tagname:
fio_tagname = stop_row.iloc[0].get('TAGNAME', '')
fio_connection_fault = f"{fio_tagname}:I.ConnectionFaulted" if fio_tagname else "?"
ss_pb_configs[ss_pb_name] = {
'start_input_path': start_input_path,
'light_output_path': light_output_path,
'stop_input_path': stop_input_path,
'vfd_ctrl': vfd_ctrl,
'fio_connection_fault': fio_connection_fault
}
seen.add(ss_pb_name)
print(f" Found STATION_SS_PB config for {ss_pb_name}")
return ss_pb_configs
def _extract_encoder_data(self) -> dict:
"""Extract ENCODER data by finding ENC* entries and determining upstream/downstream VFDs."""
import re
desc_ip = self.desc_ip
network = self.network
encoder_configs: dict[str, dict[str, str]] = {}
# Find all encoder entries (DESCA contains ENC and DESCB contains ENCODER)
encoder_mask = (desc_ip['DESCA'].astype(str).str.contains('ENC', case=False, na=False) &
desc_ip['DESCB'].astype(str).str.contains('ENCODER', case=False, na=False))
encoder_entries = desc_ip[encoder_mask]
# Regex to extract base name and position from encoder DESCA (e.g., UL1_3_ENC1 -> UL1, 3)
enc_regex = re.compile(r'^(?P<lane>[A-Z]+\d+)_(?P<pos>\d+)_ENC\d*', re.IGNORECASE)
for _, row in encoder_entries.iterrows():
desca = str(row.get('DESCA', '')).strip()
if not desca:
continue
# Extract lane and position from encoder name
m = enc_regex.match(desca.split()[0])
if not m:
continue
lane = m.group('lane') # e.g., UL1
position = int(m.group('pos')) # e.g., 3
encoder_name = f"{lane}_{position}_ENCODER"
base_name = f"{lane}_{position}"
# Find current VFD
vfd_name = f"{base_name}_VFD1"
vfd_mask = network['Name'].astype(str) == vfd_name
vfd_rows = network[vfd_mask]
if vfd_rows.empty:
print(f" [WARNING] No VFD found for encoder {encoder_name} with name {vfd_name}")
continue
vfd_ctrl = f"{vfd_name}.CTRL"
# Find upstream VFD (position - 1)
upstream_pos = position - 1
upstream_vfd_name = f"{lane}_{upstream_pos}_VFD1"
upstream_mask = network['Name'].astype(str) == upstream_vfd_name
upstream_rows = network[upstream_mask]
if upstream_rows.empty:
upstream_vfd = "NO_UPSTREAM"
else:
upstream_vfd = f"{upstream_vfd_name}.CTRL"
# Find downstream VFD (position + 1)
downstream_pos = position + 1
downstream_vfd_name = f"{lane}_{downstream_pos}_VFD1"
downstream_mask = network['Name'].astype(str) == downstream_vfd_name
downstream_rows = network[downstream_mask]
if downstream_rows.empty:
downstream_vfd = "NO_DOWNSTREAM"
else:
downstream_vfd = f"{downstream_vfd_name}.CTRL"
# Connection fault and input path from current VFD
connection_fault = f"{vfd_name}:I.ConnectionFaulted"
input_path = row.get('IO_PATH', f"{vfd_name}:I.In_1")
encoder_configs[encoder_name] = {
'vfd_ctrl': vfd_ctrl,
'upstream_vfd': upstream_vfd,
'downstream_vfd': downstream_vfd,
'connection_fault': connection_fault,
'input_path': input_path
}
print(f" Found ENCODER config for {encoder_name} (upstream: {upstream_vfd}, downstream: {downstream_vfd})")
return encoder_configs
def _extract_station_epc_data(self) -> dict:
"""Extract STATION_EPC data by finding EPC1/EPC1_2 and EPC2/EPC2_2 pairs with their red beacon lights."""
import re
desc_ip = self.desc_ip
epc_configs: dict[str, dict[str, str]] = {}
# Process both EPC1 and EPC2 channels
for epc_channel in ['EPC1', 'EPC2']:
# Determine SI terminal mapping: EPC1 uses SI0/SI1, EPC2 uses SI2/SI3
if epc_channel == 'EPC1':
main_term = 'SI0'
secondary_term = 'SI1'
else: # EPC2
main_term = 'SI2'
secondary_term = 'SI3'
# Find all EPC entries for this channel (main terminal)
epc_mask = (desc_ip['DESCA'].astype(str).str.contains(f'_{epc_channel}$', case=False, na=False, regex=True) &
desc_ip['TERM'].astype(str).str.startswith(main_term, na=False))
epc_entries = desc_ip[epc_mask]
# Regex to extract base name from EPC DESCA (e.g., UL1_4_EPC1 -> UL1_4)
epc_regex = re.compile(rf'^(?P<base>[A-Z]+\d+_\d+)_{epc_channel}$', re.IGNORECASE)
for _, epc_row in epc_entries.iterrows():
desca = str(epc_row.get('DESCA', '')).strip()
if not desca:
continue
# Extract base name from EPC
m = epc_regex.match(desca.split()[0])
if not m:
continue
base = m.group('base') # e.g., UL1_4
epc_name = f"{base}_{epc_channel}"
# Find main EPC input (SI0 for EPC1, SI2 for EPC2)
epc_main_input = epc_row.get('IO_PATH', '')
if not epc_main_input:
continue
# Find secondary EPC input (SI1 for EPC1, SI3 for EPC2) - same TAGNAME, different TERM
tagname = epc_row.get('TAGNAME', '')
epc_secondary_mask = (desc_ip['TAGNAME'].astype(str) == tagname) & \
(desc_ip['TERM'].astype(str).str.startswith(secondary_term, na=False)) & \
(desc_ip['DESCA'].astype(str).str.contains(f'{base}_{epc_channel}_2', case=False, na=False))
epc_secondary_entries = desc_ip[epc_secondary_mask]
if epc_secondary_entries.empty:
continue
epc_secondary_input = epc_secondary_entries.iloc[0].get('IO_PATH', '')
if not epc_secondary_input:
continue
# Find red beacon light (BCN*_R)
beacon_mask = desc_ip['DESCA'].astype(str).str.contains(f'{base}_BCN.*_R$', case=False, na=False, regex=True)
beacon_entries = desc_ip[beacon_mask]
beacon_red_output = None
if not beacon_entries.empty:
beacon_red_output = beacon_entries.iloc[0].get('IO_PATH', '')
if not beacon_red_output:
# Try to construct from VFD if no explicit beacon found
vfd_name = f"{base}_VFD1"
beacon_red_output = f"{vfd_name}:O.IO_1" # Default red beacon output
# Find S_PB or SS_PB station controller for this base
s_pb_station_ctrl = self._find_station_ctrl_for_base(base, desc_ip)
# VFD connection fault
vfd_name = f"{base}_VFD1"
connection_fault = f"{vfd_name}:I.ConnectionFaulted"
epc_configs[epc_name] = {
'epc_main_input': epc_main_input,
'epc_secondary_input': epc_secondary_input,
'beacon_red_output': beacon_red_output,
's_pb_station_ctrl': s_pb_station_ctrl,
'connection_fault': connection_fault
}
print(f" Found STATION_EPC config for {epc_name}")
return epc_configs
def _find_station_ctrl_for_base(self, base: str, desc_ip: pd.DataFrame) -> str:
"""Find the appropriate station controller (S*_PB or SS*_PB) for a given base name.
Args:
base: Base name like 'UL1_4', 'PS3_2', etc.
desc_ip: DESC_IP DataFrame
Returns:
Station controller tag like 'UL1_4_S1_PB_STATION.CTRL' or fallback
"""
# Look for S*_PB patterns first (S1_PB, S2_PB, etc.)
s_pb_mask = desc_ip['DESCA'].astype(str).str.contains(f'{re.escape(base)}_S\\d+_PB$', case=False, na=False, regex=True)
s_pb_entries = desc_ip[s_pb_mask]
if not s_pb_entries.empty:
# Extract the S number from the first match
desca = s_pb_entries.iloc[0]['DESCA']
s_match = re.search(r'_S(\d+)_PB$', desca, re.IGNORECASE)
if s_match:
s_num = s_match.group(1)
return f"{base}_S{s_num}_PB_STATION.CTRL"
# Look for SS*_PB patterns (SS1_SPB, SS2_SPB, etc.)
ss_pb_mask = desc_ip['DESCA'].astype(str).str.contains(f'{re.escape(base)}_SS\\d+_SPB$', case=False, na=False, regex=True)
ss_pb_entries = desc_ip[ss_pb_mask]
if not ss_pb_entries.empty:
# Extract the SS number from the first match
desca = ss_pb_entries.iloc[0]['DESCA']
ss_match = re.search(r'_SS(\d+)_SPB$', desca, re.IGNORECASE)
if ss_match:
ss_num = ss_match.group(1)
return f"{base}_SS{ss_num}_STATION.CTRL"
# Fallback to S1_PB pattern if nothing found
return f"{base}_S1_PB_STATION.CTRL"
def _extract_jpe_data(self) -> dict:
"""Extract JPE data from DESC_IP sheet."""
import re
@ -788,8 +1168,13 @@ class DataLoader:
station_ctrl = f"{station_desca}.CTRL"
break
# If no station found, try to find one using lane-based config mapping
if not station_ctrl:
continue
station_ctrl = self._find_jr_station_from_config(base_name, cfg)
# Use placeholder if still no station found
if not station_ctrl:
station_ctrl = "?"
# Find parent communication fault
parent_comm_fault = None
@ -837,8 +1222,13 @@ class DataLoader:
pin = 'Connector_1_A_Pin_4'
beacon_output = f"{fioh_name}:O.ProcessDataOut.{pin}"
# If no beacon found, try to find one using lane-based config mapping
if not beacon_output:
continue
beacon_output = self._find_beacon_from_config(base_name, cfg)
# Use placeholder if still no beacon found
if not beacon_output:
beacon_output = "?"
jpe_configs[jpe_name] = {
'conveyor_ctrl': conveyor_ctrl,
@ -847,10 +1237,145 @@ class DataLoader:
'input_path': input_path,
'beacon_output': beacon_output
}
print(f" Found JPE config for {jpe_name}")
# Add a note if placeholders were used or config mapping was applied
notes = []
if station_ctrl == "?":
notes.append("missing station")
elif station_ctrl and not station_entries.empty:
# Station found automatically
pass
elif station_ctrl and station_entries.empty:
# Station found via config mapping
notes.append("station from config")
if beacon_output == "?":
notes.append("missing beacon")
elif beacon_output and beacon_entries.empty and not fioh_entries.empty:
# Beacon found via FIOH automatically
pass
elif beacon_output and beacon_entries.empty and fioh_entries.empty:
# Beacon found via config mapping
notes.append("beacon from config")
if notes:
print(f" Found JPE config for {jpe_name} ({', '.join(notes)})")
else:
print(f" Found JPE config for {jpe_name}")
return jpe_configs
def _find_jr_station_from_config(self, base_name: str, cfg) -> str | None:
"""Find JR station for a base name using configuration lane mappings.
Args:
base_name: Base name like 'UL1_3', 'FL2_5', etc.
cfg: Configuration object
Returns:
JR station control tag like 'UL1_9_JR1_PB.CTRL' or None if not found
"""
if not cfg or not hasattr(cfg, 'extraction'):
return None
lane_mappings = getattr(cfg.extraction, 'jpe_lane_jr_mappings', {})
if not lane_mappings:
return None
# Extract lane prefix from base_name (e.g., 'UL1' from 'UL1_3')
parts = base_name.split('_')
if len(parts) < 2:
return None
lane_prefix = parts[0] # e.g., 'UL1'
try:
position = int(parts[1]) # e.g., 3 from 'UL1_3'
except (ValueError, IndexError):
return None
# Check if this lane prefix has a mapping
if lane_prefix not in lane_mappings:
return None
mapping = lane_mappings[lane_prefix]
# Check if the base_name falls within the configured range
try:
start_parts = mapping['start'].split('_')
stop_parts = mapping['stop'].split('_')
if len(start_parts) < 2 or len(stop_parts) < 2:
return None
start_pos = int(start_parts[1])
stop_pos = int(stop_parts[1])
# Check if position falls within range
if start_pos <= position <= stop_pos:
jr_station = mapping['jr_station']
return f"{jr_station}.CTRL"
except (KeyError, ValueError, IndexError):
return None
return None
def _find_beacon_from_config(self, base_name: str, cfg) -> str | None:
"""Find beacon output for a base name using configuration lane mappings.
Args:
base_name: Base name like 'UL1_3', 'FL2_5', etc.
cfg: Configuration object
Returns:
Beacon output path like 'UL1_9_FIOH1:O.ProcessDataOut.Connector_1_A_Pin_4' or None if not found
"""
if not cfg or not hasattr(cfg, 'extraction'):
return None
beacon_mappings = getattr(cfg.extraction, 'jpe_lane_beacon_mappings', {})
if not beacon_mappings:
return None
# Extract lane prefix from base_name (e.g., 'UL1' from 'UL1_3')
parts = base_name.split('_')
if len(parts) < 2:
return None
lane_prefix = parts[0] # e.g., 'UL1'
try:
position = int(parts[1]) # e.g., 3 from 'UL1_3'
except (ValueError, IndexError):
return None
# Check if this lane prefix has a mapping
if lane_prefix not in beacon_mappings:
return None
mapping = beacon_mappings[lane_prefix]
# Check if the base_name falls within the configured range
try:
start_parts = mapping['start'].split('_')
stop_parts = mapping['stop'].split('_')
if len(start_parts) < 2 or len(stop_parts) < 2:
return None
start_pos = int(start_parts[1])
stop_pos = int(stop_parts[1])
# Check if position falls within range
if start_pos <= position <= stop_pos:
beacon_output = mapping['beacon_output']
return beacon_output
except (KeyError, ValueError, IndexError):
return None
return None
def _extract_fpe_data(self) -> Dict[str, Dict[str, str]]:
"""Extract FPE (Full Photo Eye) data."""
self._logger.debug("Extracting FPE data", stage="data_extraction", type="FPE")

View File

@ -0,0 +1,122 @@
"""
ZZZ_BeltTracking routine generator.
Generates belt tracking AOI calls for every VFD in network:
zzz_BeltTracking(zzz_UL1_3Tracking,UL1_3_VFD1:I,UL1_3_VFD1:O);
"""
import xml.etree.ElementTree as ET
from typing import List
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_belt_tracking_routine(data_loader) -> ET.Element:
"""Generate the ZZZ_BeltTracking routine XML element."""
# Get all VFDs from network data
network = data_loader.network
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('belt_tracking', 'ZZZ_BeltTracking')
except Exception:
routine_name = 'ZZZ_BeltTracking'
# Create routine XML structure
routine = ET.Element("Routine")
routine.set("Name", routine_name)
routine.set("Type", "RLL")
rll_content = ET.SubElement(routine, "RLLContent")
# Get VFDs from network sheet (filter by Name ending with _VFD1)
if network.empty or 'Name' not in network.columns:
return routine
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
if vfd_entries.empty:
return routine
# Sort VFDs by name for deterministic output
vfd_entries = vfd_entries.sort_values('Name', key=lambda x: [natural_sort_key(name) for name in x])
# Rung 0: Comment rung
rung0 = ET.SubElement(rll_content, "Rung")
rung0.set("Number", "0")
rung0.set("Type", "N")
comment = ET.SubElement(rung0, "Comment")
comment.text = """Belt Tracking AOI Calls
Generates zzz_BeltTracking AOI calls for each VFD in the network.
Each VFD gets its own tracking tag and AOI instantiation."""
text0 = ET.SubElement(rung0, "Text")
text0.text = "NOP();"
rung_number = 1
# Generate AOI call for each VFD
for _, vfd_row in vfd_entries.iterrows():
vfd_name = str(vfd_row['Name']).strip()
if not vfd_name:
continue
# Extract base name from VFD name (e.g., UL1_3 from UL1_3_VFD1)
if vfd_name.endswith('_VFD1'):
base_name = vfd_name[:-5] # Remove '_VFD1'
else:
# Fallback - shouldn't happen with our filter
base_name = vfd_name.replace('_VFD', '')
# Create tracking tag name (zzz_UL1_3Tracking)
tracking_tag = f"zzz_{base_name}Tracking"
# Create rung for this VFD
rung = ET.SubElement(rll_content, "Rung")
rung.set("Number", str(rung_number))
rung.set("Type", "N")
text = ET.SubElement(rung, "Text")
# Generate AOI call: zzz_BeltTracking(zzz_UL1_3Tracking,UL1_3_VFD1:I,UL1_3_VFD1:O);
aoi_call = f"zzz_BeltTracking({tracking_tag},{vfd_name}:I,{vfd_name}:O);"
text.text = aoi_call
print(f" Belt tracking for {vfd_name} -> {tracking_tag}")
rung_number += 1
print(f" - Added {rung_number - 1} belt tracking AOI calls")
return routine
def append_belt_tracking_routine(routines_element: ET.Element, data_loader):
"""Append belt tracking routine to routines element."""
routine_element = generate_belt_tracking_routine(data_loader)
routines_element.append(routine_element)
class BeltTrackingRoutinePlugin(RoutinePlugin):
name = "belt_tracking"
description = "Generates the ZZZ_BeltTracking routine"
category = "device"
def can_generate(self) -> bool:
# Check if there are any VFDs in the network data
network = self.context.data_loader.network
if network.empty or 'Name' not in network.columns:
return False
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
return not vfd_entries.empty
def generate(self) -> bool:
routine_element = generate_belt_tracking_routine(self.context.data_loader)
self.context.routines_element.append(routine_element)
return True
register_plugin(BeltTrackingRoutinePlugin)

View File

@ -0,0 +1,89 @@
"""
ENCODER routine generator.
Generates AOI_ENCODER calls for encoder devices with format:
AOI_ENCODER(tag.AOI, tag.HMI, tag.CTRL, VFD.CTRL, Upstream_VFD.CTRL, Downstream_VFD.CTRL, ConnectionFault, Input_Path);
Matches entries with DESCA patterns like:
- UL1_3_ENC1 (encoder at position 3)
And finds the corresponding VFDs:
- Current VFD: UL1_3_VFD1
- Upstream VFD: UL1_2_VFD1 (position - 1)
- Downstream VFD: UL1_4_VFD1 (position + 1)
Uses "NO_UPSTREAM" or "NO_DOWNSTREAM" when adjacent VFDs don't exist.
"""
import xml.etree.ElementTree as ET
from typing import Dict, Any
import pandas as pd
import re
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_encoder_routine(data_loader) -> ET.Element:
"""Generate the ENCODER routine XML element."""
encoder_data = data_loader.encoder_data
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('encoder', 'R080_ENCODER')
except Exception:
routine_name = 'R080_ENCODER'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Encoder Control Routine'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Generate rungs for each ENCODER configuration
rung_number = 0
for encoder_name, config in sorted(encoder_data.items()):
# Build AOI call
aoi_params = [
f"{encoder_name}.AOI",
f"{encoder_name}.HMI",
f"{encoder_name}.CTRL",
config['vfd_ctrl'], # Current VFD controller
config['upstream_vfd'], # Upstream VFD controller or NO_UPSTREAM
config['downstream_vfd'], # Downstream VFD controller or NO_DOWNSTREAM
config['input_path'], # Encoder input path
config['connection_fault'] # VFD connection fault
]
# Create rung
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"Encoder Control for {encoder_name}"
text = ET.SubElement(rung, 'Text')
text.text = f"AOI_ENCODER({','.join(aoi_params)});"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
class EncoderRoutinePlugin(RoutinePlugin):
name = "encoder"
description = "Generates the ENCODER routine"
category = "device"
def can_generate(self) -> bool:
return bool(self.context.data_loader.encoder_data)
def generate(self) -> bool:
elem = generate_encoder_routine(self.context.data_loader)
if elem is None:
return False
self.context.routines_element.append(elem)
return True
register_plugin(EncoderRoutinePlugin)

View File

@ -91,7 +91,7 @@ FIOMs are ethernet network devices that have an IP address and connect directly
mcm_ctrl = get_config().routines.mcm_ctrl_tag
except Exception:
mcm_ctrl = 'MCM.CTRL'
aoi_call = f"AOI_IO_BLOCK({fiom_name}.AOI,{fiom_name}.HMI,{fiom_name}.CTRL,{mcm_ctrl},{dpm_name}.CTRL,{fiom_name}:I.ConnectionFaulted);"
aoi_call = f"AOI_IO_BLOCK({fiom_name}.AOI,{fiom_name}.HMI,{fiom_name}.CTRL,{mcm_ctrl},{dpm_name}.CTRL.STS.Communication_Faulted,{fiom_name}:I.ConnectionFaulted);"
text.text = aoi_call
rung_number += 1

View File

@ -11,158 +11,134 @@ from ..plugin_system import RoutinePlugin, register_plugin
def generate_flow_control_routine(data_loader) -> ET.Element:
"""Generate the R050_FLOW_CTRL routine XML element."""
flow_ctrl_data = data_loader.flow_ctrl_data
"""Generate the R050_FLOW_CTRL routine XML element.
Uses simple nn-1 interlock logic:
- VFD at position n enables VFD at position n-1 (upstream)
- If no n-1 exists, just enable n unconditionally
- Pattern: XIC(PS3_2_VFD1.CTRL.STS.Enabled)OTE(PS3_1_VFD1.CTRL.CMD.Interlock);
"""
# Get all VFDs from network data and extract base names using same logic as encoder
network = data_loader.network
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('flow_ctrl', 'R050_FLOW_CTRL')
except Exception:
routine_name = 'R050_FLOW_CTRL'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Flow Control Routine - VFD Interlock Logic'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Start at rung 0 with no NOP/comment rungs
rung_number = 0
for dpm_name in sorted(flow_ctrl_data.keys(), key=natural_sort_key):
config = flow_ctrl_data[dpm_name]
devices = config['devices']
# Find all VFD entries
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
# No comment/NOP rung per group
if vfd_entries.empty:
# No VFDs found, create empty routine
rung = ET.SubElement(rll_content, 'Rung', Number='0', Type='N')
text = ET.SubElement(rung, 'Text')
text.text = 'NOP();'
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
# Partition devices
extendos = [d for d in devices if d.get('type') == 'EXTENDO']
vfds = [d for d in devices if d.get('type') == 'VFD']
# Extract base names and positions from VFD names (e.g., PS3_2_VFD1 -> PS3, 2)
import re
vfd_regex = re.compile(r'^(?P<lane>[A-Z]+\d+)_(?P<pos>\d+)_VFD1$', re.IGNORECASE)
# Sort per config: lane-based numeric sort or natural
try:
from ..config import get_config
cfg = get_config()
name_regex = getattr(cfg.extraction, 'flow_ctrl_vfd_name_regex', None)
chain_order = getattr(cfg.extraction, 'flow_ctrl_chain_order', 'lane')
enable_extendo = bool(getattr(cfg.extraction, 'flow_ctrl_enable_extendo_interlocks', True))
emit_first_vfd = bool(getattr(cfg.extraction, 'flow_ctrl_emit_first_vfd_ote', True))
chain_dir = getattr(cfg.extraction, 'flow_ctrl_chain_direction', 'downstream_to_upstream')
emit_last_vfd = bool(getattr(cfg.extraction, 'flow_ctrl_emit_last_vfd_ote', False))
except Exception:
name_regex = None
chain_order = 'lane'
enable_extendo = True
emit_first_vfd = True
chain_dir = 'downstream_to_upstream'
emit_last_vfd = False
# Group VFDs by lane and position
lane_vfds: Dict[str, Dict[int, str]] = {}
import re
extendos.sort(key=lambda x: natural_sort_key(x['name']))
if chain_order == 'lane' and name_regex:
rx = re.compile(name_regex)
def vfd_order_key(d):
m = rx.match(d['name'])
if not m:
return (natural_sort_key(d['name']),)
lane = m.group('lane')
pos = int(m.group('pos')) if m.group('pos').isdigit() else 0
return (natural_sort_key(lane), pos)
vfds.sort(key=vfd_order_key)
else:
vfds.sort(key=lambda x: natural_sort_key(x['name']))
for _, vfd_row in vfd_entries.iterrows():
vfd_name = str(vfd_row['Name'])
m = vfd_regex.match(vfd_name)
if not m:
continue
# 1) Chain VFDs per lane: do not cross lanes when building pairs
if vfds:
# Group VFDs by lane using the same regex
lane_groups: dict[str, list[str]] = {}
if name_regex:
rx_lane = re.compile(name_regex)
for v in vfds:
nm = v['name']
m = rx_lane.match(nm)
lane = m.group('lane') if m else ''
lane_groups.setdefault(lane, []).append(nm)
else:
# Fallback: single group with all names
lane_groups[''] = [v['name'] for v in vfds]
lane = m.group('lane') # e.g., PS3
position = int(m.group('pos')) # e.g., 2
for lane, names in lane_groups.items():
# names are already ordered per above sorting
if len(names) == 0:
continue
# Build chain pairs based on direction, within this lane only
if chain_dir == 'downstream_to_upstream':
pairs = [(names[i], names[i-1]) for i in range(1, len(names))]
first_name = names[0]
last_name = names[-1]
else:
pairs = [(names[i-1], names[i]) for i in range(1, len(names))]
first_name = names[-1]
last_name = names[0]
if lane not in lane_vfds:
lane_vfds[lane] = {}
lane_vfds[lane][position] = vfd_name
for src, dst in pairs:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({src}.CTRL.STS.Enabled)OTE({dst}.CTRL.CMD.Interlock);"
rung_number += 1
# Generate interlocks: n enables n-1 (upstream)
for lane in sorted(lane_vfds.keys(), key=natural_sort_key):
positions = sorted(lane_vfds[lane].keys())
# Optional unconditional OTE for first/last VFD in lane
if emit_first_vfd:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"OTE({first_name}.CTRL.CMD.Interlock);"
rung_number += 1
for i, pos in enumerate(positions):
current_vfd = lane_vfds[lane][pos]
if emit_last_vfd:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"OTE({last_name}.CTRL.CMD.Interlock);"
rung_number += 1
# Check if there's a previous position (n-1) to interlock
if i > 0:
prev_pos = positions[i - 1]
prev_vfd = lane_vfds[lane][prev_pos]
# 2) EXTENDO interlocks: VFD.Enabled -> EXTENDO.Interlock using explicit depends_on if present
# Use data_loader-provided mapping from VFD to extendo when available
if enable_extendo:
extendo_set = {e['name'] for e in extendos}
for vfd in vfds:
dep = vfd.get('depends_on')
if dep and dep in extendo_set:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({vfd['name']}.CTRL.STS.Enabled)OTE({dep}.CTRL.CMD.Interlock);"
rung_number += 1
# Create interlock rung: n enables n-1 (upstream)
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({current_vfd}.CTRL.STS.Enabled)OTE({prev_vfd}.CTRL.CMD.Interlock);"
rung_number += 1
# Always interlock last EXTENDO per lane if configured
try:
from ..config import get_config as _gc
cfg2 = _gc()
emit_last_ext = bool(getattr(cfg2.extraction, 'flow_ctrl_emit_last_extendo_ote', True))
except Exception:
emit_last_ext = True
# Get cross-lane interlocks from config first to avoid duplicate OTE rungs
cross_lane_interlocks = {}
try:
from ..config import get_config
cfg = get_config()
cross_lane_interlocks = getattr(cfg.extraction, 'flow_ctrl_cross_lane_interlocks', {})
except Exception:
pass
if emit_last_ext and extendos:
# Group extendos by lane using extendo regex
try:
from ..config import get_config as _gc2
ext_rx_pat = getattr(_gc2().extraction, 'flow_ctrl_extendo_name_regex', None)
except Exception:
ext_rx_pat = None
import re as _re
ext_rx = _re.compile(ext_rx_pat) if ext_rx_pat else None
lane_to_ext = {}
for e in extendos:
nm = e['name']
lane = ''
if ext_rx:
m = ext_rx.match(nm)
if m:
lane = m.group('lane')
lane_to_ext.setdefault(lane, []).append(nm)
# Cross-lane interlocks from config (e.g., UL1_9_VFD1 enables [UL2_10_VFD1, UL3_9_VFD1])
for source_vfd, target_vfds in cross_lane_interlocks.items():
# Ensure target_vfds is a list
if isinstance(target_vfds, str):
target_vfds = [target_vfds]
elif not isinstance(target_vfds, list):
continue
for lane, names in lane_to_ext.items():
# names already sorted by natural
last_ext = names[-1]
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"OTE({last_ext}.CTRL.CMD.Interlock);"
rung_number += 1
# Verify source VFD exists
source_exists = any(source_vfd in vfds.values() for vfds in lane_vfds.values())
if not source_exists:
continue
for target_vfd in target_vfds:
# Verify target VFD exists
target_exists = any(target_vfd in vfds.values() for vfds in lane_vfds.values())
if target_exists:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({source_vfd}.CTRL.STS.Enabled)OTE({target_vfd}.CTRL.CMD.Interlock);"
rung_number += 1
# Enable the last VFD in each lane unconditionally, UNLESS it's a source OR target in cross-lane interlocks
cross_lane_sources = set(cross_lane_interlocks.keys())
cross_lane_targets = set()
for target_list in cross_lane_interlocks.values():
if isinstance(target_list, list):
cross_lane_targets.update(target_list)
elif isinstance(target_list, str):
cross_lane_targets.add(target_list)
for lane in sorted(lane_vfds.keys(), key=natural_sort_key):
positions = sorted(lane_vfds[lane].keys())
if positions:
last_pos = positions[-1]
last_vfd = lane_vfds[lane][last_pos]
# Only add unconditional OTE if this VFD is not a source OR target in cross-lane interlocks
if last_vfd not in cross_lane_sources and last_vfd not in cross_lane_targets:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"OTE({last_vfd}.CTRL.CMD.Interlock);"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
@ -176,7 +152,13 @@ class FlowCtrlRoutinePlugin(RoutinePlugin):
category = "device"
def can_generate(self) -> bool:
return bool(self.context.data_loader.flow_ctrl_data)
# Check if there are any VFDs in the network data
try:
network = self.context.data_loader.network
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
return not vfd_entries.empty
except Exception:
return False
def generate(self) -> bool:
elem = generate_flow_control_routine(self.context.data_loader)

View File

@ -81,6 +81,8 @@ class MainRoutinePlugin(RoutinePlugin):
nm.get('jpe', 'R100_JPE'),
nm.get('fpe', 'R101_FPE'),
nm.get('estop_check', 'R120_ESTOP_CHECK'),
nm.get('taching_belts', 'ZZZ_Taching_Belts'),
nm.get('belt_tracking', 'ZZZ_BeltTracking'),
]
calls = [c for c in defaults if c]

View File

@ -67,6 +67,74 @@ def create_outputs_routine(routines: ET.Element, zones_df: pd.DataFrame, sto_df:
cell = base_to_outputs.setdefault(base, set())
cell.update(outputs_for_tag)
# Helper to process range data from zones (same as zones.py)
def get_zone_candidates(zone_row) -> list[str]:
"""Extract all device candidates from a zone (supporting both old start/stop and new ranges format)."""
candidates = []
# Check if zone has ranges field (new format)
ranges_data = zone_row.get('ranges')
if ranges_data and isinstance(ranges_data, list) and len(ranges_data) > 0:
# Process multiple ranges
for range_item in ranges_data:
start_tok = str(range_item.get('start', '')).strip()
stop_tok = str(range_item.get('stop', '')).strip()
# Skip empty ranges
if not start_tok:
continue
# Handle single device case (start == stop or only start provided)
if not stop_tok or start_tok == stop_tok:
candidates.append(start_tok)
continue
# Handle range case (start != stop)
bounds_s = parse_ul_token(start_tok)
bounds_e = parse_ul_token(stop_tok)
if bounds_s and bounds_e and bounds_s[0] == bounds_e[0]:
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
candidates.extend([f"{prefix}_{i}" for i in range(lo, hi + 1)])
else:
# If parsing fails, add both tokens individually
candidates.append(start_tok)
if stop_tok != start_tok:
candidates.append(stop_tok)
else:
# Fallback to old start/stop format
start_tok = str(zone_row.get('start', '')).strip()
stop_tok = str(zone_row.get('stop', '')).strip()
if start_tok and stop_tok:
if start_tok == stop_tok:
# Single device
candidates.append(start_tok)
else:
# Range
bounds_s = parse_ul_token(start_tok)
bounds_e = parse_ul_token(stop_tok)
if bounds_s and bounds_e and bounds_s[0] == bounds_e[0]:
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
candidates.extend([f"{prefix}_{i}" for i in range(lo, hi + 1)])
else:
# If parsing fails, add both tokens
candidates.append(start_tok)
candidates.append(stop_tok)
elif start_tok:
# Only start token provided
candidates.append(start_tok)
# Remove duplicates while preserving order
seen = set()
unique_candidates = []
for candidate in candidates:
if candidate not in seen:
seen.add(candidate)
unique_candidates.append(candidate)
return unique_candidates
# Order zones: ensure parents before children
rows: list[dict] = []
for _, zr in zones_df.iterrows():
@ -79,7 +147,8 @@ def create_outputs_routine(routines: ET.Element, zones_df: pd.DataFrame, sto_df:
'start': str(zr.get('start', '')).strip(),
'stop': str(zr.get('stop', '')).strip(),
'interlock': str(zr.get('interlock', '')).strip(),
'interlock_norm': norm_zone(zr.get('interlock', '')) if str(zr.get('interlock', '')).strip() else ''
'interlock_norm': norm_zone(zr.get('interlock', '')) if str(zr.get('interlock', '')).strip() else '',
'zone_row': zr # Store the full row for range processing
})
ordered: list[dict] = []
@ -103,27 +172,18 @@ def create_outputs_routine(routines: ET.Element, zones_df: pd.DataFrame, sto_df:
# Emit one rung per zone - sort zones naturally
rung_num = 0
for r in sorted(ordered, key=lambda x: natural_sort_key(x['name'])):
bounds_s = parse_ul_token(r['start'])
bounds_e = parse_ul_token(r['stop'])
if not bounds_s or not bounds_e or bounds_s[0] != bounds_e[0]:
# Skip ranges that span different prefixes; config should keep a single prefix per zone
continue
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
# Get zone candidates using the new ranges-aware logic
zone_candidates = get_zone_candidates(r['zone_row'])
# Collect outputs whose base falls within [lo, hi] for this prefix
# Collect outputs for all candidates in this zone
selected_outputs: set[str] = set()
for base, outs in base_to_outputs.items():
if not base.startswith(prefix + '_'):
continue
try:
num_part = base.split('_')[1]
digits = ''.join(ch for ch in num_part if ch.isdigit())
idx = int(digits)
except Exception:
continue
if lo <= idx <= hi:
selected_outputs.update(outs)
for candidate in zone_candidates:
# Extract base name (e.g., ULC1_3 from ULC1_3_VFD1)
parts = candidate.split('_')
if len(parts) >= 2:
base = f"{parts[0]}_{parts[1]}"
if base in base_to_outputs:
selected_outputs.update(base_to_outputs[base])
if not selected_outputs:
continue

View File

@ -42,7 +42,7 @@ class RackRoutinePlugin(RoutinePlugin):
rung1 = ET.SubElement(rll_content, "Rung", Number="1", Type="N")
text1 = ET.SubElement(rung1, "Text")
text1.text = (
"AOI_RACK(Rack.AOI,Rack.HMI,SLOT2_EN4TR,SLOT5_IB16,SLOT6_OB16E,SLOT7_IB16S);"
"AOI_RACK(Rack.AOI,Rack.HMI,Rack.CTRL,SLOT2_EN4TR,SLOT5_IB16,SLOT6_OB16E,SLOT7_IB16S);"
)
return True

View File

@ -53,9 +53,9 @@ def create_resets_routine(routines: ET.Element, rst_df: pd.DataFrame, epc_df: pd
# First try to find the specific pushbutton for this EPC
if group_info["epc_num"] == "1":
specific_patterns = ["S1_PB", "SS1_SPB"]
specific_patterns = ["S1_PB", "SS1_STPB"]
else:
specific_patterns = ["S2_PB", "SS2_SPB"]
specific_patterns = ["S2_PB", "SS2_STPB"]
for _, rst_row in rst_df.iterrows():
# Skip GS1 patterns

View File

@ -53,26 +53,38 @@ class SafetyTagMapRoutinePlugin(RoutinePlugin):
rst_df: pd.DataFrame = self.context.data_loader.rst
push_button_mappings = []
# Debug: log RST data info
from ..logging_config import get_logger
logger = get_logger(__name__)
logger.debug(f"Safety tag map: RST data has {len(rst_df)} rows")
for _, row in rst_df.iterrows():
desca = row.get('DESCA')
io_path = row.get('IO_PATH')
descb = row.get('DESCB', '')
if not isinstance(desca, str) or not isinstance(io_path, (str,)):
continue
# Skip GS1 and lights
if 'GS1' in desca:
continue
if (('S1_PB' in desca) or ('S2_PB' in desca) or desca.endswith('SPB')) and not desca.endswith('_LT'):
# Simple filtering: DESCB contains 'START' and does NOT contain 'LIGHT'
# Only include SPB (start pushbuttons), exclude STPB (stop pushbuttons) and _LT (lights)
descb_upper = str(descb).upper()
if ('START' in descb_upper and 'LIGHT' not in descb_upper):
push_button_mappings.append((desca, io_path))
logger.debug(f"Added safety tag mapping: {desca} -> {io_path}")
# Sort by OTE tag name naturally
push_button_mappings.sort(key=lambda x: natural_sort_key(x[0]))
# Generate rungs in sorted order
logger.debug(f"Safety tag map: Generating {len(push_button_mappings)} rungs")
for desca, io_path in push_button_mappings:
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_num), Type='N')
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({io_path})OTE({desca});"
rung_num += 1
logger.debug(f"Generated rung {rung_num-1}: XIC({io_path})OTE({desca});")
logger.debug(f"Safety tag map: Generated {rung_num-1} total rungs")
return True

View File

@ -0,0 +1,93 @@
"""
STATION_EPC routine generator.
Generates AOI_STATION_EPC calls for EPC (E-Stop Pull Cord) stations with format:
AOI_STATION_EPC(tag.AOI, MCM.CTRL, tag.HMI, S_PB_STATION.CTRL, ConnectionFault, EPC1_Input, EPC1_2_Input, Beacon_Red_Output);
Matches entries with patterns like:
- UL1_4_EPC1 (SI0 terminal)
- UL1_4_EPC1_2 (SI1 terminal)
- UL1_4_BCN*_R (red beacon light)
And finds the corresponding VFD and S_PB station based on the base name.
"""
import xml.etree.ElementTree as ET
from typing import Dict, Any
import pandas as pd
import re
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_station_epc_routine(data_loader) -> ET.Element:
"""Generate the STATION_EPC routine XML element."""
station_epc_data = data_loader.station_epc_data
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('station_epc', 'R097_STATION_EPC')
except Exception:
routine_name = 'R097_STATION_EPC'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Station EPC (E-Stop Pull Cord) Control Routine'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Generate rungs for each STATION_EPC configuration
rung_number = 0
for epc_name, config in sorted(station_epc_data.items()):
# Build AOI call
try:
from ..config import get_config
mcm_ctrl = get_config().routines.mcm_ctrl_tag
except Exception:
mcm_ctrl = 'MCM.CTRL'
aoi_params = [
f"{epc_name}_STATION.AOI",
mcm_ctrl, # MCM controller
f"{epc_name}_STATION.HMI",
config['s_pb_station_ctrl'], # S_PB station controller
config['connection_fault'], # VFD connection fault
config['epc_main_input'], # EPC main input (SI0 for EPC1, SI2 for EPC2)
config['epc_secondary_input'], # EPC secondary input (SI1 for EPC1, SI3 for EPC2)
config['beacon_red_output'] # Red beacon output
]
# Create rung
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"Station EPC Control for {epc_name}"
text = ET.SubElement(rung, 'Text')
text.text = f"AOI_STATION_EPC({','.join(aoi_params)});"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
class StationEpcRoutinePlugin(RoutinePlugin):
name = "station_epc"
description = "Generates the STATION_EPC routine"
category = "safety"
def can_generate(self) -> bool:
return bool(self.context.data_loader.station_epc_data)
def generate(self) -> bool:
elem = generate_station_epc_routine(self.context.data_loader)
if elem is None:
return False
self.context.routines_element.append(elem)
return True
register_plugin(StationEpcRoutinePlugin)

View File

@ -0,0 +1,84 @@
"""
STATION_S_PB routine generator.
Generates AOI_STATION_S_PB calls for station push buttons with format:
AOI_STATION_S_PB(tag.AOI, tag.HMI, tag.CTRL, VFD.CTRL, input_path, output_path);
Matches entries with DESCA patterns like:
- PS1_1_S1_PB (input)
- PS1_1_S1_PB_LT (output light)
And finds the corresponding VFD based on the base name (PS1_1_VFD1).
"""
import xml.etree.ElementTree as ET
from typing import Dict, Any
import pandas as pd
import re
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_station_s_pb_routine(data_loader) -> ET.Element:
"""Generate the STATION_S_PB routine XML element."""
station_s_pb_data = data_loader.station_s_pb_data
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('station_s_pb', 'R095_STATION_S_PB')
except Exception:
routine_name = 'R095_STATION_S_PB'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Station S Push Button Control Routine'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Generate rungs for each STATION_S_PB configuration
rung_number = 0
for s_pb_name, config in sorted(station_s_pb_data.items()):
# Build AOI call
aoi_params = [
f"{s_pb_name}_STATION.AOI",
f"{s_pb_name}_STATION.HMI",
f"{s_pb_name}_STATION.CTRL",
config['vfd_ctrl'], # VFD controller
config['input_path'], # S_PB input path
config['output_path'] # S_PB_LT output path
]
# Create rung
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"Station S Push Button Control for {s_pb_name}"
text = ET.SubElement(rung, 'Text')
text.text = f"AOI_STATION_S_PB({','.join(aoi_params)});"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
class StationSPbRoutinePlugin(RoutinePlugin):
name = "station_s_pb"
description = "Generates the STATION_S_PB routine"
category = "device"
def can_generate(self) -> bool:
return bool(self.context.data_loader.station_s_pb_data)
def generate(self) -> bool:
elem = generate_station_s_pb_routine(self.context.data_loader)
if elem is None:
return False
self.context.routines_element.append(elem)
return True
register_plugin(StationSPbRoutinePlugin)

View File

@ -0,0 +1,87 @@
"""
STATION_SS_PB routine generator.
Generates AOI_STATION_SS_PB calls for station SS (Start/Stop) push buttons with format:
AOI_STATION_SS_PB(tag.AOI, tag.HMI, tag.CTRL, VFD.CTRL, FIO_ConnectionFault, Start_Input, Stop_Input, Light_Output);
Matches entries with DESCA patterns like:
- UL3_1_SS1_SPB (start pushbutton)
- UL3_1_SS1_SPB_LT (start pushbutton light)
- UL3_1_SS1_STPB (stop pushbutton)
And finds the corresponding VFD and FIO based on the base name.
"""
import xml.etree.ElementTree as ET
from typing import Dict, Any
import pandas as pd
import re
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_station_ss_pb_routine(data_loader) -> ET.Element:
"""Generate the STATION_SS_PB routine XML element."""
station_ss_pb_data = data_loader.station_ss_pb_data
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('station_ss_pb', 'R096_STATION_SS_PB')
except Exception:
routine_name = 'R096_STATION_SS_PB'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Station SS (Start/Stop) Push Button Control Routine'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Generate rungs for each STATION_SS_PB configuration
rung_number = 0
for ss_pb_name, config in sorted(station_ss_pb_data.items()):
# Build AOI call
aoi_params = [
f"{ss_pb_name}_STATION.AOI",
f"{ss_pb_name}_STATION.HMI",
f"{ss_pb_name}_STATION.CTRL",
config['vfd_ctrl'], # VFD controller
config['fio_connection_fault'], # FIO connection fault
config['start_input_path'], # SS1_SPB start input path
config['stop_input_path'], # SS1_STPB stop input path
config['light_output_path'] # SS1_SPB_LT light output path
]
# Create rung
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"Station SS Push Button Control for {ss_pb_name}"
text = ET.SubElement(rung, 'Text')
text.text = f"AOI_STATION_SS_PB({','.join(aoi_params)});"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
class StationSsPbRoutinePlugin(RoutinePlugin):
name = "station_ss_pb"
description = "Generates the STATION_SS_PB routine"
category = "device"
def can_generate(self) -> bool:
return bool(self.context.data_loader.station_ss_pb_data)
def generate(self) -> bool:
elem = generate_station_ss_pb_routine(self.context.data_loader)
if elem is None:
return False
self.context.routines_element.append(elem)
return True
register_plugin(StationSsPbRoutinePlugin)

View File

@ -0,0 +1,112 @@
"""
ZZZ_Taching_Belts routine generator.
Generates taching belts control logic with 3 rungs per VFD:
1. F2 button to Start: XIC(VFD:I.KeypadButtonF2)OTE(VFD:O.Start);
2. F1 button to Stop: XIC(VFD:I.KeypadButtonF1)OTE(VFD:O.Stop);
3. CommandedVelocity move: MOVE(VFD:O.CommandedVelocity,VFD:O.CommandedVelocity);
"""
import xml.etree.ElementTree as ET
from typing import List
from ..utils.common import format_xml_to_match_original, natural_sort_key
from ..plugin_system import RoutinePlugin, register_plugin
def generate_taching_belts_routine(data_loader) -> ET.Element:
"""Generate the ZZZ_Taching_Belts routine XML element."""
# Get all VFDs from network data
network = data_loader.network
# Config-driven routine name
try:
from ..config import get_config
routine_name = get_config().routines.name_map.get('taching_belts', 'ZZZ_Taching_Belts')
except Exception:
routine_name = 'ZZZ_Taching_Belts'
routine = ET.Element('Routine', Name=routine_name, Type='RLL')
desc = ET.SubElement(routine, 'Description')
desc.text = 'Taching Belts Control Routine - Manual VFD Control via Keypad'
# Create RLLContent
rll_content = ET.SubElement(routine, 'RLLContent')
# Find all VFD entries from NETWORK_PLC sheet
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
if vfd_entries.empty:
# No VFDs found, create empty routine with NOP
rung = ET.SubElement(rll_content, 'Rung', Number='0', Type='N')
text = ET.SubElement(rung, 'Text')
text.text = 'NOP();'
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
# Get sorted list of VFD names for consistent output
vfd_names = []
for _, vfd_row in vfd_entries.iterrows():
vfd_name = str(vfd_row['Name'])
vfd_names.append(vfd_name)
# Sort VFD names naturally
vfd_names.sort(key=natural_sort_key)
rung_number = 0
# Generate 3 rungs for each VFD
for vfd_name in vfd_names:
# Rung 1: F2 button to Start
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"{vfd_name} - F2 Start"
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({vfd_name}:I.KeypadButtonF2)OTE({vfd_name}:O.Start);"
rung_number += 1
# Rung 2: F1 button to Stop
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"{vfd_name} - F1 Stop"
text = ET.SubElement(rung, 'Text')
text.text = f"XIC({vfd_name}:I.KeypadButtonF1)OTE({vfd_name}:O.Stop);"
rung_number += 1
# Rung 3: CommandedVelocity move
rung = ET.SubElement(rll_content, 'Rung', Number=str(rung_number), Type='N')
comment = ET.SubElement(rung, 'Comment')
comment.text = f"{vfd_name} - CommandedVelocity"
text = ET.SubElement(rung, 'Text')
text.text = f"MOVE({vfd_name}:O.CommandedVelocity,{vfd_name}:O.CommandedVelocity);"
rung_number += 1
# Convert to string and format
xml_str = ET.tostring(routine, encoding='unicode')
formatted_xml = format_xml_to_match_original(xml_str)
return ET.fromstring(formatted_xml)
class TachingBeltsRoutinePlugin(RoutinePlugin):
name = "taching_belts"
description = "Generates the ZZZ_Taching_Belts routine"
category = "device"
def can_generate(self) -> bool:
# Check if there are any VFDs in the network data
try:
network = self.context.data_loader.network
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
return not vfd_entries.empty
except Exception:
return False
def generate(self) -> bool:
elem = generate_taching_belts_routine(self.context.data_loader)
if elem is None:
return False
self.context.routines_element.append(elem)
return True
register_plugin(TachingBeltsRoutinePlugin)

View File

@ -91,10 +91,14 @@ def create_zones_routine(routines: ET.Element, zones_df: pd.DataFrame, epc_df: p
present.add(eb)
if present:
available_dcs[base_name] = present
except Exception:
logger.debug(f"Found DCS controllers for {base_name}: {present}")
except Exception as e:
# If anything goes wrong, leave available_dcs empty (no rungs will be emitted)
logger.warning(f"Failed to build available DCS controllers: {e}")
available_dcs = {}
logger.debug(f"Available DCS controllers: {available_dcs}")
# Generate rungs using available EPC DCS tags only
rung_num = 0
# We no longer aggregate top-level zone OKs into EStop_MCM_OK; that is driven by MCM_EPB_DCS_CTRL.O1
@ -136,34 +140,72 @@ def create_zones_routine(routines: ET.Element, zones_df: pd.DataFrame, epc_df: p
for range_item in ranges_data:
start_tok = str(range_item.get('start', '')).strip()
stop_tok = str(range_item.get('stop', '')).strip()
# Skip empty ranges
if not start_tok:
continue
# Handle single device case (start == stop or only start provided)
if not stop_tok or start_tok == stop_tok:
candidates.append(start_tok)
continue
# Handle range case (start != stop)
bounds_s = parse_ul(start_tok)
bounds_e = parse_ul(stop_tok)
if bounds_s and bounds_e and bounds_s[0] == bounds_e[0]:
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
candidates.extend([f"{prefix}_{i}" for i in range(lo, hi + 1)])
else:
# If parsing fails, add both tokens individually
candidates.append(start_tok)
if stop_tok != start_tok:
candidates.append(stop_tok)
else:
# Fallback to old start/stop format
start_tok = str(zone_row.get('start', '')).strip()
stop_tok = str(zone_row.get('stop', '')).strip()
bounds_s = parse_ul(start_tok)
bounds_e = parse_ul(stop_tok)
if bounds_s and bounds_e and bounds_s[0] == bounds_e[0]:
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
candidates.extend([f"{prefix}_{i}" for i in range(lo, hi + 1)])
if start_tok and stop_tok:
if start_tok == stop_tok:
# Single device
candidates.append(start_tok)
else:
# Range
bounds_s = parse_ul(start_tok)
bounds_e = parse_ul(stop_tok)
if bounds_s and bounds_e and bounds_s[0] == bounds_e[0]:
prefix = bounds_s[0]
lo, hi = sorted([bounds_s[1], bounds_e[1]])
candidates.extend([f"{prefix}_{i}" for i in range(lo, hi + 1)])
else:
# If parsing fails, add both tokens
candidates.append(start_tok)
candidates.append(stop_tok)
elif start_tok:
# Only start token provided
candidates.append(start_tok)
return candidates
# Remove duplicates while preserving order
seen = set()
unique_candidates = []
for candidate in candidates:
if candidate not in seen:
seen.add(candidate)
unique_candidates.append(candidate)
return unique_candidates
# For each zone, assemble the DCS XICs - sort zones naturally
for r in sorted(ordered, key=lambda x: natural_sort_key(x['name'])):
zone_name = r['name']
if zone_name == 'MCM01':
if zone_name.upper().startswith('MCM'):
# root marker; skip rung here, we'll compute master later
continue
zone_row = zones_df[zones_df['name'] == zone_name].iloc[0]
candidates = get_zone_candidates(zone_row)
logger.debug(f"Zone {zone_name} candidates: {candidates}")
# Build XIC chain for EPC1/EPC2 DCS outputs that actually exist per ESTOPS
xic_parts: List[str] = []
@ -171,10 +213,15 @@ def create_zones_routine(routines: ET.Element, zones_df: pd.DataFrame, epc_df: p
# Sort candidates naturally and then sort labels naturally within each base
for base in sorted(candidates, key=natural_sort_key):
dc_set = available_dcs.get(base, set())
for label in sorted(dc_set, key=natural_sort_key): # natural sort order
dcs_ref = f"{base}_{label}_DCS_CTRL.O1"
xic_parts.append(f"XIC({dcs_ref})")
included_dcs.append(dcs_ref)
if dc_set:
for label in sorted(dc_set, key=natural_sort_key): # natural sort order
dcs_ref = f"{base}_{label}_DCS_CTRL.O1"
xic_parts.append(f"XIC({dcs_ref})")
included_dcs.append(dcs_ref)
else:
# If no DCS set found for this base, check if it should be included anyway
# This handles cases where the device exists but wasn't properly categorized
logger.debug(f"No DCS controllers found for base {base} in zone {zone_name}")
ok_tag = f"EStop_{zone_name.replace('-', '_')}_OK"
rung = ET.SubElement(rll, "Rung", Number=str(rung_num), Type="N")

View File

@ -193,6 +193,36 @@ def _create_station_jr_pb_tag_from_boilerplate(name: str) -> ET.Element:
return _create_module_tag(name, 'UDT_AOI_STATION_JR_PB')
def _create_station_s_pb_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified STATION_S_PB tag without L5K data."""
return _create_module_tag(name, 'UDT_AOI_STATION_S_PB')
def _create_station_ss_pb_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified STATION_SS_PB tag without L5K data."""
return _create_module_tag(name, 'UDT_AOI_STATION_SS_PB')
def _create_station_epc_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified STATION_EPC tag without L5K data."""
return _create_module_tag(name, 'UDT_AOI_STATION_EPC')
def _create_encoder_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified ENCODER tag without L5K data."""
return _create_module_tag(name, 'UDT_AOI_ENCODER')
def _create_vfd_ctrl_tag(name: str) -> ET.Element:
"""Create a VFD controller tag without L5K data."""
return _create_module_tag(name, 'UDT_CTRL_VFD')
def _create_station_ctrl_tag(name: str) -> ET.Element:
"""Create a station controller tag without L5K data."""
return _create_module_tag(name, 'UDT_CTRL_STATION')
def _create_jpe_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified JPE tag without L5K data."""
return _create_module_tag(name, 'UDT_AOI_JPE')
@ -213,6 +243,11 @@ def _create_cb_monitor_tag_from_boilerplate(name: str) -> ET.Element:
return _create_module_tag(name, 'UDT_AOI_CB_MONITOR')
def _create_belt_tracking_tag_from_boilerplate(name: str) -> ET.Element:
"""Create a simplified belt tracking tag without L5K data."""
return _create_module_tag(name, 'zzz_BeltTracking')
def _format_tag_xml(tag_element: ET.Element) -> str:
"""Format a tag XML element with proper CDATA sections."""
xml_str = ET.tostring(tag_element, encoding='unicode')
@ -348,10 +383,15 @@ def create_limited_tag_xml_elements(
'pb_chute': 'PB_CHUTE',
'station_jr_chute': 'STATION_JR_CHUTE',
'station_jr_pb': 'STATION_JR_PB',
'station_s_pb': 'STATION_S_PB',
'station_ss_pb': 'STATION_SS_PB',
'station_epc': 'STATION_EPC',
'encoder': 'ENCODER',
'jpe': 'JPE',
'fpe': 'FPE',
'pmm': 'PMM',
'cb_monitor': 'CB_MONITOR'
'cb_monitor': 'CB_MONITOR',
'belt_tracking': 'BELT_TRACKING'
}
module_name = plugin_to_module_map.get(entry.plugin)
@ -535,6 +575,33 @@ def create_limited_tag_xml_elements(
for jr_name in sorted(station_jr_pb_data.keys()):
module_tags.append(_create_station_jr_pb_tag_from_boilerplate(jr_name))
# Load STATION_S_PB data and add STATION_S_PB module tags
if program_toggles.get('STATION_S_PB', True):
station_s_pb_data = data_loader.station_s_pb_data if data_loader else loader.station_s_pb_data
for s_pb_name in sorted(station_s_pb_data.keys()):
station_tag_name = f"{s_pb_name}_STATION"
module_tags.append(_create_station_s_pb_tag_from_boilerplate(station_tag_name))
# Load STATION_SS_PB data and add STATION_SS_PB module tags
if program_toggles.get('STATION_SS_PB', True):
station_ss_pb_data = data_loader.station_ss_pb_data if data_loader else loader.station_ss_pb_data
for ss_pb_name in sorted(station_ss_pb_data.keys()):
station_tag_name = f"{ss_pb_name}_STATION"
module_tags.append(_create_station_ss_pb_tag_from_boilerplate(station_tag_name))
# Load STATION_EPC data and add STATION_EPC module tags
if program_toggles.get('STATION_EPC', True):
station_epc_data = data_loader.station_epc_data if data_loader else loader.station_epc_data
for epc_name in sorted(station_epc_data.keys()):
station_tag_name = f"{epc_name}_STATION"
module_tags.append(_create_station_epc_tag_from_boilerplate(station_tag_name))
# Load ENCODER data and add ENCODER module tags
if program_toggles.get('ENCODER', True):
encoder_data = data_loader.encoder_data if data_loader else loader.encoder_data
for encoder_name in sorted(encoder_data.keys()):
module_tags.append(_create_encoder_tag_from_boilerplate(encoder_name))
# Load JPE data and add JPE module tags
if program_toggles.get('JPE', True):
jpe_data = data_loader.jpe_data if data_loader else loader.jpe_data
@ -558,12 +625,36 @@ def create_limited_tag_xml_elements(
cb_monitor_data = data_loader.cb_monitor_data if data_loader else loader.cb_monitor_data
for pdp_name in sorted(cb_monitor_data.keys(), key=_natural_sort_key):
module_tags.append(_create_cb_monitor_tag_from_boilerplate(pdp_name))
# Load Belt Tracking data and add belt tracking module tags
if program_toggles.get('BELT_TRACKING', True):
# Get all VFDs from network data to create belt tracking tags
network = data_loader.network if data_loader else loader.network
if not network.empty and 'Name' in network.columns:
vfd_entries = network[network['Name'].astype(str).str.endswith('_VFD1', na=False)]
for _, vfd_row in vfd_entries.iterrows():
vfd_name = str(vfd_row['Name']).strip()
if vfd_name and vfd_name.endswith('_VFD1'):
# Extract base name from VFD name (e.g., UL1_3 from UL1_3_VFD1)
base_name = vfd_name[:-5] # Remove '_VFD1'
# Create tracking tag name (zzz_UL1_3Tracking)
tracking_tag = f"zzz_{base_name}Tracking"
module_tags.append(_create_belt_tracking_tag_from_boilerplate(tracking_tag))
# Add system module tags based on configuration
if program_toggles.get('RACK', True): # Default to enabled for backward compatibility
tags.append(_create_rack_tag_from_boilerplate("Rack"))
if program_toggles.get('MCM', True): # Default to enabled for backward compatibility
tags.append(_create_mcm_tag_from_boilerplate("MCM"))
# Always create placeholder tags for missing upstream/downstream/partner references
tags.append(_create_vfd_ctrl_tag("NO_UPSTREAM"))
tags.append(_create_vfd_ctrl_tag("NO_DOWNSTREAM"))
tags.append(_create_station_ctrl_tag("NO_PARTNER"))
# Create YES boolean tag used in AOI calls
tags.append(_create_bool_tag("YES", "Standard"))
# Append discovered module tags
tags.extend(module_tags)
@ -634,7 +725,7 @@ def create_tag_xml_elements(excel_file: str | Path) -> Tuple[List[ET.Element], S
epb_status_tag = getattr(_cfg.routines, 'mcm_epb_status_tag', 'MCM_EPB_STATUS')
tags.append(_create_bool_tag(epb_status_tag, "Safety"))
tags.append(_create_bool_tag(f"{safety_prefix}{mcm_tag}", "Safety"))
top_ok = getattr(_cfg.routines, 'top_level_estop_ok_tag', f"EStop_{subsystem}_OK")
top_ok = getattr(_cfg.routines, 'top_level_estop_ok_tag', "EStop_MCM_OK")
tags.append(_create_bool_tag(top_ok, "Safety"))
tags.append(_create_bool_tag(mcm_tag, "Standard"))
try:

327
SAT9_generator_config.json Normal file
View File

@ -0,0 +1,327 @@
{
"files": {
"excel_file": "DESC_IP_MERGED.xlsx",
"output_dir": ".",
"zones_file": "SAT9_zones.json",
"safety_l5x": "SafetyProgram_Generated.L5X",
"main_l5x": "MainProgram_Generated.L5X",
"mapping_txt": "SafetyTagMapping.txt"
},
"filters": {
"global": {},
"per_routine": {}
},
"routine_plan": [
{
"name": "main_routine",
"plugin": "main_routine",
"enabled": true,
"program": "MainProgram",
"order": 10,
"params": {}
},
{
"name": "mcm",
"plugin": "mcm",
"enabled": true,
"program": "MainProgram",
"order": 22,
"params": {}
},
{
"name": "rack",
"plugin": "rack",
"enabled": true,
"program": "MainProgram",
"order": 25,
"params": {}
},
{
"name": "dpm",
"plugin": "dpm",
"enabled": true,
"program": "MainProgram",
"order": 40,
"params": {}
},
{
"name": "fiom",
"plugin": "fiom",
"enabled": false,
"program": "MainProgram",
"order": 50,
"params": {}
},
{
"name": "fioh",
"plugin": "fioh",
"enabled": false,
"program": "MainProgram",
"order": 60,
"params": {}
},
{
"name": "apf",
"plugin": "apf",
"enabled": true,
"program": "MainProgram",
"order": 70,
"params": {}
},
{
"name": "extendo",
"plugin": "extendo",
"enabled": false,
"program": "MainProgram",
"order": 80,
"params": {}
},
{
"name": "flow_ctrl",
"plugin": "flow_ctrl",
"enabled": false,
"program": "MainProgram",
"order": 90,
"params": {}
},
{
"name": "speed_ctrl",
"plugin": "speed_ctrl",
"enabled": false,
"program": "MainProgram",
"order": 100,
"params": {}
},
{
"name": "d2c_chute",
"plugin": "d2c_chute",
"enabled": false,
"program": "MainProgram",
"order": 110,
"params": {}
},
{
"name": "pb_chute",
"plugin": "pb_chute",
"enabled": false,
"program": "MainProgram",
"order": 120,
"params": {}
},
{
"name": "station_jr_chute",
"plugin": "station_jr_chute",
"enabled": false,
"program": "MainProgram",
"order": 130,
"params": {}
},
{
"name": "station_jr_pb",
"plugin": "station_jr_pb",
"enabled": false,
"program": "MainProgram",
"order": 140,
"params": {}
},
{
"name": "jpe",
"plugin": "jpe",
"enabled": false,
"program": "MainProgram",
"order": 150,
"params": {}
},
{
"name": "fpe",
"plugin": "fpe",
"enabled": false,
"program": "MainProgram",
"order": 160,
"params": {}
},
{
"name": "pmm",
"plugin": "pmm",
"enabled": false,
"program": "MainProgram",
"order": 170,
"params": {}
},
{
"name": "cb_monitor",
"plugin": "cb_monitor",
"enabled": false,
"program": "MainProgram",
"order": 180,
"params": {}
},
{
"name": "inputs",
"plugin": "inputs",
"enabled": true,
"program": "SafetyProgram",
"order": 10,
"params": {}
},
{
"name": "outputs",
"plugin": "outputs",
"enabled": true,
"program": "SafetyProgram",
"order": 11,
"params": {}
},
{
"name": "resets",
"plugin": "resets",
"enabled": true,
"program": "SafetyProgram",
"order": 12,
"params": {}
},
{
"name": "zones",
"plugin": "zones",
"enabled": true,
"program": "SafetyProgram",
"order": 13,
"params": {}
},
{
"name": "estops",
"plugin": "estops",
"enabled": true,
"program": "SafetyProgram",
"order": 20,
"params": {}
},
{
"name": "estop_check",
"plugin": "estop_check",
"enabled": true,
"program": "MainProgram",
"order": 120,
"params": {}
},
{
"name": "safety_tag_map",
"plugin": "safety_tag_map",
"enabled": true,
"program": "MainProgram",
"order": 130,
"params": {}
},
{
"name": "taching_belts",
"plugin": "taching_belts",
"enabled": true,
"program": "MainProgram",
"order": 200,
"params": {}
},
{
"name": "belt_tracking",
"plugin": "belt_tracking",
"enabled": true,
"program": "MainProgram",
"order": 210,
"params": {}
}
],
"xml": {
"schema_revision": "1.0",
"software_revision": "36.00",
"controller_name": "MTN6_MCM04_CHUTE_LOAD",
"target_class": "Standard",
"export_options": "References NoRawData L5KData DecoratedData Context Dependencies ForceProtectedEncoding AllProjDocTrans"
},
"routines": {
"safety_tag_prefix": "SFT_",
"mcm_input_address": "Local:5:I.Data.0",
"mcm_epb_status_inputs": ["Local:7:I.Pt02.Status", "Local:7:I.Pt03.Status"],
"mcm_epb_dcs_inputs": ["Local:7:I.Pt02.Data", "Local:7:I.Pt03.Data"],
"mcm_epb_dcs_tag_name": "MCM_EPB_DCS_CTRL",
"mcm_safety_tag": "MCM_S_PB",
"speed_ctrl_setpoint_tag": "Speed_350_FPM",
"speed_ctrl_setpoint_value": 350,
"no_horn_tag_name": "NO_Horn",
"mcm_base_tag": "MCM",
"mcm_ctrl_tag": "MCM.CTRL",
"rack_fault_tag": "Rack.AOI.Slot2_EN4TR_Faulted",
"mcm_epb_status_tag": "MCM_EPB_STATUS",
"top_level_estop_ok_tag": "EStop_MCM_OK",
"station_ctrl_tag": "Station.CTRL",
"apf_input_default": "In_0",
"mcm_aoi_input_args": [
"Local:5:I.Data.2",
"Local:5:I.Data.5",
"Local:5:I.Data.4",
"Local:5:I.Data.0",
"Local:5:I.Data.3",
"Local:7:I.Pt02.Data",
"Local:7:I.Pt03.Data",
"Local:5:I.Data.1",
"Local:7:I.Pt00.Data",
"Local:5:I.Data.7",
"Local:5:I.Data.8",
"Local:5:I.Data.6",
"Local:5:I.Data.9"
],
"mcm_aoi_output_args": [
"Local:6:O.Data.2",
"Local:6:O.Data.5",
"Local:6:O.Data.4",
"Local:6:O.Data.0",
"Local:6:O.Data.1",
"Local:6:O.Data.3"
]
},
"extraction": {
"rst_desc_contains": [ "START" ],
"rst_desc_excludes": [ "LIGHT" ],
"rst_desca_exclude_patterns": [ "GS1" ],
"rst_desca_patterns": [ "S1_PB", "S2_PB" ],
"rst_desca_endings": [ "SPB" ],
"dpm_partnumber_contains": [ "OS30-002404-2S" ],
"fiom_partnumber_contains": [ "5032-8IOLM12DR" ],
"fioh_partnumber_contains": [ "5032-8IOLM12DR" ],
"fioh_desca_contains": [ "FIOH" ],
"sto_tagname_patterns": [ "VFD" ],
"sto_desca_patterns": [ "STO" ],
"epc_desca_patterns": [ "EPC", "ESTOP" ],
"apf_partnumber_prefix": [ "35S" ],
"extendo_partnumber_exact": [ "CALJAN" ],
"pmm_partnumber_exact": [ "1420-V2-ENT" ],
"speed_ctrl_partnumber_prefix": [ "35S" ]
,
"cb_desca_include": [ "CB" ],
"cb_desca_exclude": [ "BCN" ],
"s0_prefix": "S0",
"d2c_gs1_pb_token": "GS1_PB",
"d2c_gs1_pb_lt_token": "GS1_PB_LT",
"d2c_bcn_token": "BCN",
"d2c_zmx_suffix": "_ZMX",
"pb_chute_components": [ "PE1", "PE2", "PR1", "SOL1" ],
"fioh_token": "FIOH",
"bcn_token": "BCN",
"beacon_stack_3_tokens": [ "3-STACK", "3 STACK" ],
"beacon_segment_a_pin4": "Connector_1_A_Pin_4",
"beacon_segment_b_pin2": "Connector_1_B_Pin_2",
"jr1_pb_token": "JR1_PB",
"jr1_pb_lt_token": "JR1_PB_LT",
"jr2_token": "JR2_PB",
"jr2_pb_lt_token": "JR2_PB_LT",
"jr1_exclude_tokens": [],
"vfd_prefix_regex": "",
"vfd_suffix_default": "_VFD1",
"jpe_include_tokens": [ "TPE" ],
"jpe_exclude_tokens": [ ],
"jpe_input_default": "",
"fpe_include_tokens": [ "FPE", "3CH_PE" ],
"flow_ctrl_vfd_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_VFD\\d+",
"flow_ctrl_extendo_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+)_EX\\d+",
"flow_ctrl_chain_order": "natural",
"flow_ctrl_enable_extendo_interlocks": true
}
}

View File

@ -1,37 +1,4 @@
{
"MCM02": [
{
"name": "MCM02",
"start": "",
"stop": "",
"interlock": ""
},
{
"name": "ZONE_5",
"start": "PS2_1",
"stop": "PS2_7",
"interlock": "MCM02"
},
{
"name": "ZONE_6",
"start": "UL4_2",
"stop": "UL4_8",
"interlock": "MCM02"
},
{
"name": "ZONE_7",
"start": "UL5_2",
"stop": "UL5_9",
"interlock": "MCM02"
},
{
"name": "ZONE_8",
"start": "UL6_1",
"stop": "UL6_8",
"interlock": "MCM02"
}
],
"MCM01": [
{
"name": "MCM01",
@ -40,52 +7,240 @@
"interlock": ""
},
{
"name": "ZONE_1",
"start": "ULC1_3",
"stop": "ULC1_6",
"name": "01-01",
"start": "ULC1_1",
"stop": "ULC1_1",
"interlock": "MCM01"
},
{
"name": "ZONE_2",
"name": "01-02",
"start": "",
"stop": "",
"ranges": [
{"start": "ULC1_1", "stop": "ULC1_1"},
{"start": "ULC1_3", "stop": "ULC1_6"}
],
"interlock": "MCM01"
},
{
"name": "01-03",
"start": "ULC1_6",
"stop": "ULC1_12",
"interlock": "MCM01"
},
{
"name": "ZONE_3",
"start": "ULC2_3",
"stop": "ULC2_6",
"name": "01-04",
"start": "ULC2_1",
"stop": "ULC2_1",
"interlock": "MCM01"
},
{
"name": "ZONE_4",
"name": "01-05",
"start": "",
"stop": "",
"ranges": [
{"start": "ULC2_1", "stop": "ULC2_1"},
{"start": "ULC2_3", "stop": "ULC2_6"}
],
"interlock": "MCM01"
},
{
"name": "01-06",
"start": "ULC2_6",
"stop": "ULC2_12",
"interlock": "MCM01"
},
{
"name": "ZONE_5",
"start": "ULC3_3",
"stop": "ULC3_4",
"name": "01-07",
"start": "ULC3_1",
"stop": "ULC3_1",
"interlock": "MCM01"
},
{
"name": "ZONE_6",
"name": "01-08",
"start": "",
"stop": "",
"ranges": [
{"start": "ULC3_1", "stop": "ULC3_1"},
{"start": "ULC3_3", "stop": "ULC3_4"}
],
"interlock": "MCM01"
},
{
"name": "01-09",
"start": "ULC3_4",
"stop": "ULC3_6",
"interlock": "MCM01"
},
{
"name": "ZONE_7",
"start": "ULC4_3",
"stop": "ULC4_4",
"name": "01-10",
"start": "ULC4_1",
"stop": "ULC4_1",
"interlock": "MCM01"
},
{
"name": "ZONE_8",
"name": "01-11",
"start": "",
"stop": "",
"ranges": [
{"start": "ULC4_1", "stop": "ULC4_1"},
{"start": "ULC4_3", "stop": "ULC4_4"}
],
"interlock": "MCM01"
},
{
"name": "01-12",
"start": "ULC4_4",
"stop": "ULC4_6",
"interlock": "MCM01"
}
],
"MCM02": [
{
"name": "MCM02",
"start": "",
"stop": "",
"interlock": ""
},
{
"name": "02-01",
"start": "PS1_1",
"stop": "PS1_8",
"interlock": "MCM02"
},
{
"name": "02-02",
"start": "UL1_1",
"stop": "UL1_7",
"interlock": "MCM02"
},
{
"name": "02-03",
"start": "UL2_1",
"stop": "UL2_9",
"interlock": "MCM02"
},
{
"name": "02-04",
"start": "UL3_1",
"stop": "UL3_9",
"interlock": "MCM02"
},
{
"name": "02-05",
"start": "PS2_1",
"stop": "PS2_7",
"interlock": "MCM02"
},
{
"name": "02-06",
"start": "UL4_1",
"stop": "UL4_9",
"interlock": "MCM02"
},
{
"name": "02-07",
"start": "UL5_1",
"stop": "UL5_9",
"interlock": "MCM02"
},
{
"name": "02-08",
"start": "UL6_1",
"stop": "UL6_8",
"interlock": "MCM02"
}
],
"MCM03": [
{
"name": "MCM03",
"start": "",
"stop": "",
"interlock": ""
},
{
"name": "03-01",
"start": "PS3_1",
"stop": "PS3_7",
"interlock": "MCM03"
},
{
"name": "03-02",
"start": "UL7_1",
"stop": "UL7_7",
"interlock": "MCM03"
},
{
"name": "03-03",
"start": "UL8_1",
"stop": "UL8_9",
"interlock": "MCM03"
},
{
"name": "03-04",
"start": "UL9_1",
"stop": "UL9_9",
"interlock": "MCM03"
},
{
"name": "03-05",
"start": "PS4_1",
"stop": "PS4_7",
"interlock": "MCM03"
},
{
"name": "03-06",
"start": "UL10_1",
"stop": "UL10_8",
"interlock": "MCM03"
},
{
"name": "03-07",
"start": "UL11_1",
"stop": "UL11_9",
"interlock": "MCM03"
},
{
"name": "03-08",
"start": "UL12_1",
"stop": "UL12_9",
"interlock": "MCM03"
}
],
"MCM04": [
{
"name": "MCM04",
"start": "",
"stop": "",
"interlock": ""
},
{
"name": "04-01",
"start": "BYAB_2",
"stop": "BYAB_3",
"interlock": "MCM04"
},
{
"name": "04-02",
"start": "BYCB_2",
"stop": "BYCB_3",
"interlock": "MCM04"
}
],
"MCM05": [
{
"name": "MCM05",
"start": "",
"stop": "",
"interlock": ""
}
],
"DEFAULT": [
{
"name": "MCM",
"start": "",
"stop": "",
"interlock": ""
}
]
}

220
generator_config.json Normal file
View File

@ -0,0 +1,220 @@
{
"files": {
"excel_file": "DESC_IP_MERGED.xlsx",
"output_dir": ".",
"zones_file": "zones.json",
"safety_l5x": "SafetyProgram_Generated.L5X",
"main_l5x": "MainProgram_Generated.L5X",
"mapping_txt": "SafetyTagMapping.txt"
},
"xml": {
"schema_revision": "1.0",
"software_revision": "36.00",
"controller_name": "MTN6_MCM01",
"target_class": "Standard",
"export_options": "References NoRawData L5KData DecoratedData Context Dependencies ForceProtectedEncoding AllProjDocTrans"
},
"extraction": {
"rst_desc_contains": [
"START"
],
"rst_desc_excludes": [
"LIGHT"
],
"rst_desca_patterns": [
"S1_PB",
"S2_PB"
],
"rst_desca_endings": [
"SPB"
],
"rst_desca_exclude_patterns": [
"GS1"
],
"sto_tagname_patterns": [
"VFD"
],
"sto_desca_patterns": [
"STO"
],
"epc_desca_patterns": [
"EPC",
"ESTOP"
],
"dpm_partnumber_contains": [
"OS30-002404-2S"
],
"fiom_partnumber_contains": [
"5032-8IOLM12DR"
],
"fioh_partnumber_contains": [
"5032-8IOLM12DR"
],
"fioh_desca_contains": [
"FIOH"
],
"apf_partnumber_prefix": [
"35S"
],
"extendo_partnumber_exact": [
"CALJAN"
],
"pmm_partnumber_exact": [
"1420-V2-ENT"
],
"speed_ctrl_partnumber_prefix": [
"35S"
],
"cb_desca_include": [
"CB"
],
"cb_desca_exclude": [
"BCN"
],
"s0_prefix": "S0",
"d2c_gs1_pb_token": "GS1_PB",
"d2c_gs1_pb_lt_token": "GS1_PB_LT",
"d2c_bcn_token": "BCN",
"d2c_zmx_suffix": "_ZMX",
"pb_chute_components": [
"PE1",
"PE2",
"PR1",
"SOL1"
],
"fioh_token": "FIOH",
"bcn_token": "BCN",
"beacon_stack_3_tokens": [
"3-STACK",
"3 STACK"
],
"beacon_segment_a_pin4": "Connector_1_A_Pin_4",
"beacon_segment_b_pin2": "Connector_1_B_Pin_2",
"jr1_token": "JR1",
"jr1_pb_token": "JR1_PB",
"jr1_pb_lt_token": "JR1_PB_LT",
"jr2_token": "JR2",
"jr2_pb_token": "JR2_PB",
"jr2_pb_lt_token": "JR2_PB_LT",
"jr1_exclude_tokens": [
"FL",
"S0"
],
"vfd_prefix_regex": "(FL\\d+_\\d+)",
"vfd_suffix_default": "_VFD1",
"jpe_include_tokens": [
"JPE",
"_2_PE"
],
"jpe_exclude_tokens": [
"3CH_PE"
],
"jpe_input_default": "In_2",
"jpe_lane_jr_mappings": {},
"jpe_lane_beacon_mappings": {},
"fpe_include_tokens": [
"FPE",
"3CH_PE"
],
"flow_ctrl_vfd_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+[A-Za-z]?)_VFD\\d*",
"flow_ctrl_extendo_name_regex": "^(?P<lane>[^_]+)_(?P<pos>\\d+[A-Za-z]?)_EX\\d*",
"flow_ctrl_chain_order": "lane",
"flow_ctrl_enable_extendo_interlocks": true,
"flow_ctrl_emit_first_vfd_ote": true,
"flow_ctrl_chain_direction": "downstream_to_upstream",
"flow_ctrl_emit_last_vfd_ote": true,
"flow_ctrl_emit_last_extendo_ote": true,
"flow_ctrl_select_vfds_by_name": true,
"flow_ctrl_lane_tokens": 3,
"flow_ctrl_cross_lane_interlocks": {}
},
"routines": {
"main_routine_name": "MainRoutine",
"safety_tag_map_name": "R130_SAFETY_TAG_MAP",
"estop_check_name": "R120_ESTOP_CHECK",
"safety_tag_prefix": "SFT_",
"mcm_input_address": "Local:5:I.Data.0",
"mcm_base_tag": "MCM",
"mcm_ctrl_tag": "MCM.CTRL",
"rack_fault_tag": "Rack.AOI.Slot2_EN4TR_Faulted",
"mcm_epb_status_tag": "MCM_EPB_STATUS",
"top_level_estop_ok_tag": "EStop_MCM_OK",
"station_ctrl_tag": "Station.CTRL",
"mcm_epb_status_inputs": [
"Local:7:I.Pt02.Status",
"Local:7:I.Pt03.Status"
],
"mcm_epb_dcs_inputs": [
"Local:7:I.Pt02.Data",
"Local:7:I.Pt03.Data"
],
"mcm_epb_dcs_tag_name": "MCM_EPB_DCS_CTRL",
"inputs_routine": "R010_INPUTS",
"outputs_routine": "R011_OUTPUTS",
"resets_routine": "R012_RESETS",
"estops_routine": "R020_ESTOPS",
"zones_routine": "R030_ZONES",
"mcm_safety_tag": "MCM_S_PB",
"mcm_epb_tag": "MCM_EPB_DCS_CTRL.O1",
"speed_ctrl_setpoint_tag": "Speed_350_FPM",
"speed_ctrl_setpoint_value": 350,
"no_horn_tag_name": "NO_Horn",
"apf_input_default": "In_0",
"mcm_aoi_input_args": [
"Local:5:I.Data.2",
"Local:5:I.Data.5",
"Local:5:I.Data.4",
"Local:5:I.Data.0",
"Local:5:I.Data.3",
"Local:7:I.Pt02.Data",
"Local:7:I.Pt03.Data",
"Local:5:I.Data.1",
"Local:7:I.Pt00.Data",
"Local:5:I.Data.7",
"Local:5:I.Data.8",
"Local:5:I.Data.6",
"Local:5:I.Data.9"
],
"mcm_aoi_output_args": [
"Local:6:O.Data.2",
"Local:6:O.Data.5",
"Local:6:O.Data.4",
"Local:6:O.Data.0",
"Local:6:O.Data.1",
"Local:6:O.Data.3"
],
"name_map": {
"main_routine": "MainRoutine",
"safety_tag_map": "R130_SAFETY_TAG_MAP",
"estop_check": "R120_ESTOP_CHECK",
"dpm": "R020_DPM",
"fiom": "R030_FIOM",
"fioh": "R031_FIOH",
"apf": "R040_APF",
"extendo": "R041_EXTENDO",
"flow_ctrl": "R050_FLOW_CTRL",
"speed_ctrl": "R051_SPEED_CTRL",
"d2c_chute": "R042_D2C_CHUTE",
"pb_chute": "R043_PB_CHUTE",
"station_jr_chute": "R044_STATION_JR_CHUTE",
"station_jr_pb": "R090_STATION_JR_PB",
"station_s_pb": "R095_STATION_S_PB",
"station_ss_pb": "R096_STATION_SS_PB",
"station_epc": "R097_STATION_EPC",
"jpe": "R100_JPE",
"fpe": "R101_FPE",
"pmm": "R060_PMM",
"cb_monitor": "R070_CB_MONITOR",
"encoder": "R080_ENCODER",
"rack": "R011_RACK",
"mcm": "R010_MCM",
"inputs": "R010_INPUTS",
"outputs": "R011_OUTPUTS",
"resets": "R012_RESETS",
"estops": "R020_ESTOPS",
"zones": "R030_ZONES"
}
},
"routine_plan": [],
"tags": {}
}

View File

@ -0,0 +1,565 @@
{"level": "INFO", "message": "PLC Generation Workflow started", "timestamp": "2025-08-22T21:04:01.983675", "module": "__main__", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/data/CNO8_MCM05_fixed.xlsx", "project_name": "CNO8_MCM05"}
{"level": "INFO", "message": "Starting data processing step", "timestamp": "2025-08-22T21:04:01.984056", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 1: PLC Data Generator stdout ===
Loading IO path mappings...
Loaded IO path mappings:
APF: 11 rows
M12DR: 16 rows
Hub: 16 rows
SorterHub: 16 rows
SIO: 16 rows
IB16: 16 rows
OB16E: 16 rows
IB16S: 16 rows
Available sheets: ['NETWORK_PLC', 'DESC_PLC']
Found DESC sheet: DESC_PLC
Found NETWORK sheet: NETWORK_PLC
DESC columns: ['TAGNAME', 'TERM', 'DESCA', 'DESCB']
NETWORK columns: ['DPM', 'DPM_IP', 'Name', 'PartNumber', 'IP']
NOTE: Ignored 37 rows from DESC sheet with an empty TAGNAME.
Classifying signals and adding IO paths...
Signal classification results:
SPARE: 521
I: 418
IOLink: 158
O: 39
Device type distribution:
M12DR: 544
Hub: 544
IB16: 16
OB16E: 16
IB16S: 16
IO Path mapping results:
Successful mappings: 1136/1136 (100.0%)
Found 3 TAGNAMEs present in DESC but not in NETWORK_PLC.
Adding unique DPM names not present in DESC or NETWORK_PLC.Name: ['DPM01_VS01B', 'DPM01_VS01C']
================================================================================
WARNING: The following issues were found but processing will continue:
================================================================================
- TAGNAME 'SLOT5_IB16' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT6_OB16E' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT7_IB16S' from DESC sheet not found in NETWORK_PLC sheet.
================================================================================
Continuing with processing...
Normalizing TAGNAME, DESC, and IO_PATH columns for VFDs only in the final output...
Final result has 1141 rows
Sample of merged data:
TAGNAME TERM DESCA ... SIGNAL DEVICE_TYPE IO_PATH
0 SLOT5_IB16 I0 MCM05 ... I IB16 Local:5:I.Data.0
1 SLOT5_IB16 I1 MCM05 ... I IB16 Local:5:I.Data.1
2 SLOT5_IB16 I10 SPARE ... SPARE IB16 Local:5:I.Data.10
3 SLOT5_IB16 I11 SPARE ... SPARE IB16 Local:5:I.Data.11
4 SLOT5_IB16 I12 SPARE ... SPARE IB16 Local:5:I.Data.12
5 SLOT5_IB16 I13 SPARE ... SPARE IB16 Local:5:I.Data.13
6 SLOT5_IB16 I14 SPARE ... SPARE IB16 Local:5:I.Data.14
7 SLOT5_IB16 I15 SPARE ... SPARE IB16 Local:5:I.Data.15
8 SLOT5_IB16 I2 MCM05 ... I IB16 Local:5:I.Data.2
9 SLOT5_IB16 I3 MCM05 ... I IB16 Local:5:I.Data.3
[10 rows x 11 columns]
New Excel file created: MCM05_DESC_IP_MERGED.xlsx
The file contains all original sheets plus the new 'DESC_IP' sheet with merged data.
Reading input file: MCM05_DESC_IP_MERGED.xlsx
Removed 158 IOLink rows (including beacons, FIOH channels, and all other IOLink entries)
Added 283 rows for beacon lights
Removed 5 blank name/description rows
Saving output file: MCM05_OUTPUT.csv
Processing complete!
Created standard output file: DESC_IP_MERGED.xlsx
=== Step 1: PLC Data Generator stderr ===
{"level": "INFO", "message": "Data processing completed successfully", "timestamp": "2025-08-22T21:04:05.420911", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting routine generation step", "timestamp": "2025-08-22T21:04:05.421166", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_210401.log", "timestamp": "2025-08-22T21:04:07.209648", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== Generating All PLC Artifacts ===", "timestamp": "2025-08-22T21:04:07.211294", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating SafetyProgram L5X...", "timestamp": "2025-08-22T21:04:07.211502", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator", "timestamp": "2025-08-22T21:04:07.222286", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:04:07.222822", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating SafetyProgram XML structure", "timestamp": "2025-08-22T21:04:07.223012", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Registered plugin: main_routine (core)", "timestamp": "2025-08-22T21:04:07.233953", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: apf (device)", "timestamp": "2025-08-22T21:04:07.240179", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: cb_monitor (device)", "timestamp": "2025-08-22T21:04:07.244512", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: d2c_chute (device)", "timestamp": "2025-08-22T21:04:07.249251", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: dpm (device)", "timestamp": "2025-08-22T21:04:07.252794", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: encoder (device)", "timestamp": "2025-08-22T21:04:07.256401", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estops (safety)", "timestamp": "2025-08-22T21:04:07.263519", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estop_check (safety)", "timestamp": "2025-08-22T21:04:07.267670", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: extendo (device)", "timestamp": "2025-08-22T21:04:07.271040", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fioh (device)", "timestamp": "2025-08-22T21:04:07.275053", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fiom (device)", "timestamp": "2025-08-22T21:04:07.278259", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: flow_ctrl (device)", "timestamp": "2025-08-22T21:04:07.281876", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fpe (device)", "timestamp": "2025-08-22T21:04:07.285048", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: inputs (safety)", "timestamp": "2025-08-22T21:04:07.288535", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: jpe (device)", "timestamp": "2025-08-22T21:04:07.292330", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: mcm (core)", "timestamp": "2025-08-22T21:04:07.296118", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: outputs (safety)", "timestamp": "2025-08-22T21:04:07.299500", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pb_chute (device)", "timestamp": "2025-08-22T21:04:07.303012", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pmm (device)", "timestamp": "2025-08-22T21:04:07.306865", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: rack (core)", "timestamp": "2025-08-22T21:04:07.310680", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: resets (safety)", "timestamp": "2025-08-22T21:04:07.314950", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: safety_tag_map (core)", "timestamp": "2025-08-22T21:04:07.318605", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: speed_ctrl (device)", "timestamp": "2025-08-22T21:04:07.322422", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_epc (safety)", "timestamp": "2025-08-22T21:04:07.327246", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_chute (device)", "timestamp": "2025-08-22T21:04:07.331096", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_pb (device)", "timestamp": "2025-08-22T21:04:07.334753", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_ss_pb (device)", "timestamp": "2025-08-22T21:04:07.338388", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_s_pb (device)", "timestamp": "2025-08-22T21:04:07.342572", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: taching_belts (device)", "timestamp": "2025-08-22T21:04:07.347048", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: zones (safety)", "timestamp": "2025-08-22T21:04:07.351331", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "INFO", "message": "Generating safety routines...", "timestamp": "2025-08-22T21:04:07.351583", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin inputs cannot generate with current data", "timestamp": "2025-08-22T21:04:08.147996", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin outputs cannot generate with current data", "timestamp": "2025-08-22T21:04:08.151678", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin resets cannot generate with current data", "timestamp": "2025-08-22T21:04:08.151975", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:04:08.153763", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:04:08.153967", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:04:08.154140", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:04:08.154690", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "DEBUG", "message": "Generating routine: zones", "timestamp": "2025-08-22T21:04:08.154917", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Available DCS controllers: {}", "timestamp": "2025-08-22T21:04:08.155395", "module": "src.routines.zones", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: zones", "timestamp": "2025-08-22T21:04:08.155676", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estops cannot generate with current data", "timestamp": "2025-08-22T21:04:08.155964", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}", "timestamp": "2025-08-22T21:04:08.156173", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag map with 1 tags", "timestamp": "2025-08-22T21:04:08.162717", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (2): MainRoutine, R030_ZONES", "timestamp": "2025-08-22T21:04:08.162915", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);", "timestamp": "2025-08-22T21:04:08.163098", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];", "timestamp": "2025-08-22T21:04:08.163271", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:04:08.163452", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:04:08.165305", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:04:08.165572", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainProgram L5X...", "timestamp": "2025-08-22T21:04:08.165769", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator", "timestamp": "2025-08-22T21:04:08.165949", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:04:08.166128", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MainProgram XML structure", "timestamp": "2025-08-22T21:04:08.166292", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Adding controller tags...", "timestamp": "2025-08-22T21:04:08.166472", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:04:08.262934", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:04:08.263116", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:04:08.263238", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:04:08.263640", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "INFO", "message": "Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2", "timestamp": "2025-08-22T21:04:08.310450", "module": "src.writers.xml_tag_writer", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Added 15 controller tags", "timestamp": "2025-08-22T21:04:08.310781", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating main program routines...", "timestamp": "2025-08-22T21:04:08.310991", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: mcm", "timestamp": "2025-08-22T21:04:08.311167", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: mcm", "timestamp": "2025-08-22T21:04:08.311335", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: rack", "timestamp": "2025-08-22T21:04:08.311518", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: rack", "timestamp": "2025-08-22T21:04:08.311705", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: dpm", "timestamp": "2025-08-22T21:04:08.311891", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: dpm", "timestamp": "2025-08-22T21:04:08.313021", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin apf cannot generate with current data", "timestamp": "2025-08-22T21:04:08.313668", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estop_check cannot generate with current data", "timestamp": "2025-08-22T21:04:08.313891", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: safety_tag_map", "timestamp": "2025-08-22T21:04:08.314079", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: RST data has 1 rows", "timestamp": "2025-08-22T21:04:08.314262", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag mapping: MCM05 -> Local:5:I.Data.0", "timestamp": "2025-08-22T21:04:08.314505", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generating 1 rungs", "timestamp": "2025-08-22T21:04:08.314674", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);", "timestamp": "2025-08-22T21:04:08.314832", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generated 1 total rungs", "timestamp": "2025-08-22T21:04:08.314991", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: safety_tag_map", "timestamp": "2025-08-22T21:04:08.315197", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin taching_belts cannot generate with current data", "timestamp": "2025-08-22T21:04:08.315719", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: main_routine", "timestamp": "2025-08-22T21:04:08.315915", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainRoutine with JSR calls", "timestamp": "2025-08-22T21:04:08.316083", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated MainRoutine", "timestamp": "2025-08-22T21:04:08.316235", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: main_routine", "timestamp": "2025-08-22T21:04:08.316386", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}", "timestamp": "2025-08-22T21:04:08.316546", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP", "timestamp": "2025-08-22T21:04:08.316708", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R010_MCM: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:04:08.316863", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R011_RACK: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:04:08.317017", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R020_DPM: 3 rungs | example: NOP();", "timestamp": "2025-08-22T21:04:08.317172", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);", "timestamp": "2025-08-22T21:04:08.317375", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];", "timestamp": "2025-08-22T21:04:08.317557", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:04:08.317857", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernMainProgramGenerator to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:04:08.320002", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] MainProgram written to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:04:08.320174", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating safety tag mapping...", "timestamp": "2025-08-22T21:04:08.320337", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MappingWriter wrapper", "timestamp": "2025-08-22T21:04:08.320502", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating DataLoader instance", "timestamp": "2025-08-22T21:04:08.320664", "module": "src.container", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/DESC_IP_MERGED.xlsx"}
{"level": "INFO", "message": "[SUCCESS] Safety tag mapping written to SafetyTagMapping.txt", "timestamp": "2025-08-22T21:04:08.414377", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": " - Safety tags: 1", "timestamp": "2025-08-22T21:04:08.414591", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== All artifacts generated successfully! ===", "timestamp": "2025-08-22T21:04:08.415111", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 2: Routines Generator stdout ===
Created safety tag mapping file: SafetyTagMapping.txt
=== Step 2: Routines Generator stderr ===
[21:04:07] [INFO] [logging_config.py:128:_log_with_context] Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_210401.log
[21:04:07] [INFO] [logging_config.py:128:_log_with_context] === Generating All PLC Artifacts ===
[21:04:07] [INFO] [logging_config.py:128:_log_with_context] Generating SafetyProgram L5X...
[21:04:07] [WARNING] [logging_config.py:128:_log_with_context] LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator
[21:04:07] [INFO] [logging_config.py:128:_log_with_context] Starting ModernSafetyProgramGenerator generation
[21:04:07] [DEBUG] [logging_config.py:128:_log_with_context] Creating SafetyProgram XML structure
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: main_routine (core)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: apf (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: cb_monitor (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: d2c_chute (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: dpm (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: encoder (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estops (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estop_check (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: extendo (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fioh (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fiom (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: flow_ctrl (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fpe (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: inputs (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: jpe (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: mcm (core)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: outputs (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pb_chute (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pmm (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: rack (core)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: resets (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: safety_tag_map (core)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: speed_ctrl (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_epc (safety)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_chute (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_pb (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_ss_pb (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_s_pb (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: taching_belts (device)
[21:04:07] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: zones (safety)
[21:04:07] [INFO] [logging_config.py:128:_log_with_context] Generating safety routines...
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin inputs cannot generate with current data
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin outputs cannot generate with current data
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin resets cannot generate with current data
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: zones
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Available DCS controllers: {}
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: zones
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin estops cannot generate with current data
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag map with 1 tags
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] Routines created (2): MainRoutine, R030_ZONES
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernSafetyProgramGenerator generation
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Generating MainProgram L5X...
[21:04:08] [WARNING] [logging_config.py:128:_log_with_context] LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Starting ModernMainProgramGenerator generation
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Creating MainProgram XML structure
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Adding controller tags...
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Added 15 controller tags
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Generating main program routines...
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: mcm
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: mcm
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: rack
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: rack
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: dpm
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: dpm
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin apf cannot generate with current data
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin estop_check cannot generate with current data
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: safety_tag_map
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: RST data has 1 rows
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag mapping: MCM05 -> Local:5:I.Data.0
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generating 1 rungs
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generated 1 total rungs
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: safety_tag_map
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Plugin taching_belts cannot generate with current data
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: main_routine
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Generating MainRoutine with JSR calls
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated MainRoutine
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: main_routine
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - R010_MCM: 2 rungs | example: NOP();
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - R011_RACK: 2 rungs | example: NOP();
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - R020_DPM: 3 rungs | example: NOP();
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);
[21:04:08] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernMainProgramGenerator generation
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Written ModernMainProgramGenerator to MainProgram_Generated.L5X
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] MainProgram written to MainProgram_Generated.L5X
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] Generating safety tag mapping...
[21:04:08] [DEBUG] [logging_config.py:128:_log_with_context] Creating MappingWriter wrapper
[21:04:08] [DEBUG] [logging_config.py:126:_log_with_context] Creating DataLoader instance
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] Safety tag mapping written to SafetyTagMapping.txt
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] - Safety tags: 1
[21:04:08] [INFO] [logging_config.py:128:_log_with_context] === All artifacts generated successfully! ===
{"level": "INFO", "message": "Routine generation completed successfully", "timestamp": "2025-08-22T21:04:08.478350", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 3: IO Tree Generator stdout ===
Enhanced MCM Generator
- Project: CNO8_MCM05
- Excel: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/DESC_IP_MERGED.xlsx
- Boilerplate: CNO8_boilerplate
- Mode: Single file
--------------------------------------------------
Created 34 FIOH modules based on TERM analysis
Found 37 IOLM modules
Found 124 Beacon modules
Found 2 DPM modules
Created 37 IOLM modules with boilerplate selection:
VS01B_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM17 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM18 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM19 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM17 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM18 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT5_IB16_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT7_IB16S_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT6_OB16E_Module.L5X
Importing AOIs/DataTypes from base: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/IO Tree Configuration Generator/BaseProgram.L5X
Programs already exist (2 programs found), skipping empty program creation
OK: Generated project: generated_projects/CNO8_MCM05.L5X
Single file generation complete
- ['generated_projects/CNO8_MCM05.L5X']
=== Step 4: L5X2ACD Compiler output ===
🚀 Setting up compilation for project: CNO8_MCM05
📂 Compilation directory: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler
📄 Source L5X: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/IO Tree Configuration Generator/generated_projects/CNO8_MCM05.L5X
🔧 Mode: wipe_existing=False, replace_mode=True
🔄 Using SMART REPLACE mode - keeping current project files
🧹 Cleaning old project files...
✓ Removed old project file: compile_SAT9_MCM01.bat
⚠️ Could not remove SAT9_MCM01.ACD: [Errno 13] Permission denied: '/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/SAT9_MCM01.ACD'
✓ Removed old project file: SAT9_MCM01.L5X
✓ Removed file: SAT9_MCM01.LCIBATUMI.ilia.gurielidze.BAK000.acd
⚠️ Could not remove SAT9_MCM01.Sem: [Errno 13] Permission denied: '/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/SAT9_MCM01.Sem'
⚠️ Could not remove SAT9_MCM01.Wrk: [Errno 13] Permission denied: '/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/SAT9_MCM01.Wrk'
🧹 Cleanup complete: 3 files removed, 0 current files kept, 0 directories removed
📁 Copying L5X file: CNO8_MCM05.L5X → CNO8_MCM05.L5X
✓ Copied successfully (7.52 MB)
🔧 Generating batch file: compile_CNO8_MCM05.bat
✓ Generated successfully
✅ Compilation setup complete!
L5X File: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/CNO8_MCM05.L5X
Batch File: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/compile_CNO8_MCM05.bat
🪟 To compile on Windows:
1. Run: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/compile_CNO8_MCM05.bat
2. Or double-click: compile_CNO8_MCM05.bat

View File

@ -0,0 +1,534 @@
{"level": "INFO", "message": "PLC Generation Workflow started", "timestamp": "2025-08-22T21:18:17.053080", "module": "__main__", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/data/CNO8_MCM05_fixed.xlsx", "project_name": "CNO8_MCM05"}
{"level": "INFO", "message": "Starting data processing step", "timestamp": "2025-08-22T21:18:17.053461", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 1: PLC Data Generator stdout ===
Loading IO path mappings...
Loaded IO path mappings:
APF: 11 rows
M12DR: 16 rows
Hub: 16 rows
SorterHub: 16 rows
SIO: 16 rows
IB16: 16 rows
OB16E: 16 rows
IB16S: 16 rows
Available sheets: ['NETWORK_PLC', 'DESC_PLC']
Found DESC sheet: DESC_PLC
Found NETWORK sheet: NETWORK_PLC
DESC columns: ['TAGNAME', 'TERM', 'DESCA', 'DESCB']
NETWORK columns: ['DPM', 'DPM_IP', 'Name', 'PartNumber', 'IP']
NOTE: Ignored 37 rows from DESC sheet with an empty TAGNAME.
Classifying signals and adding IO paths...
Signal classification results:
SPARE: 521
I: 418
IOLink: 158
O: 39
Device type distribution:
M12DR: 544
Hub: 544
IB16: 16
OB16E: 16
IB16S: 16
IO Path mapping results:
Successful mappings: 1136/1136 (100.0%)
Found 3 TAGNAMEs present in DESC but not in NETWORK_PLC.
Adding unique DPM names not present in DESC or NETWORK_PLC.Name: ['DPM01_VS01B', 'DPM01_VS01C']
================================================================================
WARNING: The following issues were found but processing will continue:
================================================================================
- TAGNAME 'SLOT5_IB16' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT6_OB16E' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT7_IB16S' from DESC sheet not found in NETWORK_PLC sheet.
================================================================================
Continuing with processing...
Normalizing TAGNAME, DESC, and IO_PATH columns for VFDs only in the final output...
Final result has 1141 rows
Sample of merged data:
TAGNAME TERM DESCA ... SIGNAL DEVICE_TYPE IO_PATH
0 SLOT5_IB16 I0 MCM05 ... I IB16 Local:5:I.Data.0
1 SLOT5_IB16 I1 MCM05 ... I IB16 Local:5:I.Data.1
2 SLOT5_IB16 I10 SPARE ... SPARE IB16 Local:5:I.Data.10
3 SLOT5_IB16 I11 SPARE ... SPARE IB16 Local:5:I.Data.11
4 SLOT5_IB16 I12 SPARE ... SPARE IB16 Local:5:I.Data.12
5 SLOT5_IB16 I13 SPARE ... SPARE IB16 Local:5:I.Data.13
6 SLOT5_IB16 I14 SPARE ... SPARE IB16 Local:5:I.Data.14
7 SLOT5_IB16 I15 SPARE ... SPARE IB16 Local:5:I.Data.15
8 SLOT5_IB16 I2 MCM05 ... I IB16 Local:5:I.Data.2
9 SLOT5_IB16 I3 MCM05 ... I IB16 Local:5:I.Data.3
[10 rows x 11 columns]
New Excel file created: MCM05_DESC_IP_MERGED.xlsx
The file contains all original sheets plus the new 'DESC_IP' sheet with merged data.
Reading input file: MCM05_DESC_IP_MERGED.xlsx
Removed 158 IOLink rows (including beacons, FIOH channels, and all other IOLink entries)
Added 283 rows for beacon lights
Removed 5 blank name/description rows
Saving output file: MCM05_OUTPUT.csv
Processing complete!
Created standard output file: DESC_IP_MERGED.xlsx
=== Step 1: PLC Data Generator stderr ===
{"level": "INFO", "message": "Data processing completed successfully", "timestamp": "2025-08-22T21:18:21.053789", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting routine generation step", "timestamp": "2025-08-22T21:18:21.054017", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_211817.log", "timestamp": "2025-08-22T21:18:22.662500", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== Generating All PLC Artifacts ===", "timestamp": "2025-08-22T21:18:22.664355", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating SafetyProgram L5X...", "timestamp": "2025-08-22T21:18:22.664541", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator", "timestamp": "2025-08-22T21:18:22.674524", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:18:22.674793", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating SafetyProgram XML structure", "timestamp": "2025-08-22T21:18:22.674936", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Registered plugin: main_routine (core)", "timestamp": "2025-08-22T21:18:22.685688", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: apf (device)", "timestamp": "2025-08-22T21:18:22.690515", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: cb_monitor (device)", "timestamp": "2025-08-22T21:18:22.695436", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: d2c_chute (device)", "timestamp": "2025-08-22T21:18:22.699001", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: dpm (device)", "timestamp": "2025-08-22T21:18:22.702915", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: encoder (device)", "timestamp": "2025-08-22T21:18:22.707003", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estops (safety)", "timestamp": "2025-08-22T21:18:22.715626", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estop_check (safety)", "timestamp": "2025-08-22T21:18:22.719137", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: extendo (device)", "timestamp": "2025-08-22T21:18:22.722405", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fioh (device)", "timestamp": "2025-08-22T21:18:22.726256", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fiom (device)", "timestamp": "2025-08-22T21:18:22.730507", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: flow_ctrl (device)", "timestamp": "2025-08-22T21:18:22.734670", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fpe (device)", "timestamp": "2025-08-22T21:18:22.738198", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: inputs (safety)", "timestamp": "2025-08-22T21:18:22.741839", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: jpe (device)", "timestamp": "2025-08-22T21:18:22.745641", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: mcm (core)", "timestamp": "2025-08-22T21:18:22.748759", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: outputs (safety)", "timestamp": "2025-08-22T21:18:22.751841", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pb_chute (device)", "timestamp": "2025-08-22T21:18:22.755702", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pmm (device)", "timestamp": "2025-08-22T21:18:22.759228", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: rack (core)", "timestamp": "2025-08-22T21:18:22.762757", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: resets (safety)", "timestamp": "2025-08-22T21:18:22.766342", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: safety_tag_map (core)", "timestamp": "2025-08-22T21:18:22.769895", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: speed_ctrl (device)", "timestamp": "2025-08-22T21:18:22.773730", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_epc (safety)", "timestamp": "2025-08-22T21:18:22.777701", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_chute (device)", "timestamp": "2025-08-22T21:18:22.781012", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_pb (device)", "timestamp": "2025-08-22T21:18:22.784697", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_ss_pb (device)", "timestamp": "2025-08-22T21:18:22.788136", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_s_pb (device)", "timestamp": "2025-08-22T21:18:22.791355", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: taching_belts (device)", "timestamp": "2025-08-22T21:18:22.795291", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: zones (safety)", "timestamp": "2025-08-22T21:18:22.798525", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "INFO", "message": "Generating safety routines...", "timestamp": "2025-08-22T21:18:22.798723", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin inputs cannot generate with current data", "timestamp": "2025-08-22T21:18:23.558069", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin outputs cannot generate with current data", "timestamp": "2025-08-22T21:18:23.561281", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin resets cannot generate with current data", "timestamp": "2025-08-22T21:18:23.561535", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:18:23.563389", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:18:23.563559", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:18:23.563712", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:18:23.564248", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "DEBUG", "message": "Generating routine: zones", "timestamp": "2025-08-22T21:18:23.564420", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Available DCS controllers: {}", "timestamp": "2025-08-22T21:18:23.564864", "module": "src.routines.zones", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: zones", "timestamp": "2025-08-22T21:18:23.565164", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estops cannot generate with current data", "timestamp": "2025-08-22T21:18:23.565373", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}", "timestamp": "2025-08-22T21:18:23.565513", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag map with 1 tags", "timestamp": "2025-08-22T21:18:23.570695", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (2): MainRoutine, R030_ZONES", "timestamp": "2025-08-22T21:18:23.570844", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);", "timestamp": "2025-08-22T21:18:23.570960", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];", "timestamp": "2025-08-22T21:18:23.571079", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:18:23.571199", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:18:23.572827", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:18:23.573029", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainProgram L5X...", "timestamp": "2025-08-22T21:18:23.573172", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator", "timestamp": "2025-08-22T21:18:23.573453", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:18:23.573640", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MainProgram XML structure", "timestamp": "2025-08-22T21:18:23.573798", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Adding controller tags...", "timestamp": "2025-08-22T21:18:23.573948", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:18:23.664492", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:18:23.664682", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:18:23.664832", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:18:23.665283", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "INFO", "message": "Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2", "timestamp": "2025-08-22T21:18:23.710965", "module": "src.writers.xml_tag_writer", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Added 15 controller tags", "timestamp": "2025-08-22T21:18:23.711301", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating main program routines...", "timestamp": "2025-08-22T21:18:23.711478", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: mcm", "timestamp": "2025-08-22T21:18:23.711623", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: mcm", "timestamp": "2025-08-22T21:18:23.711918", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: rack", "timestamp": "2025-08-22T21:18:23.712107", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: rack", "timestamp": "2025-08-22T21:18:23.712259", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: dpm", "timestamp": "2025-08-22T21:18:23.712408", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: dpm", "timestamp": "2025-08-22T21:18:23.713428", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin apf cannot generate with current data", "timestamp": "2025-08-22T21:18:23.713988", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estop_check cannot generate with current data", "timestamp": "2025-08-22T21:18:23.714374", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: safety_tag_map", "timestamp": "2025-08-22T21:18:23.714626", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: RST data has 1 rows", "timestamp": "2025-08-22T21:18:23.714799", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag mapping: MCM05 -> Local:5:I.Data.0", "timestamp": "2025-08-22T21:18:23.715082", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generating 1 rungs", "timestamp": "2025-08-22T21:18:23.715242", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);", "timestamp": "2025-08-22T21:18:23.715483", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generated 1 total rungs", "timestamp": "2025-08-22T21:18:23.715716", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: safety_tag_map", "timestamp": "2025-08-22T21:18:23.715900", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin taching_belts cannot generate with current data", "timestamp": "2025-08-22T21:18:23.716348", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: main_routine", "timestamp": "2025-08-22T21:18:23.716539", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainRoutine with JSR calls", "timestamp": "2025-08-22T21:18:23.716692", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated MainRoutine", "timestamp": "2025-08-22T21:18:23.716822", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: main_routine", "timestamp": "2025-08-22T21:18:23.716929", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}", "timestamp": "2025-08-22T21:18:23.717034", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP", "timestamp": "2025-08-22T21:18:23.717149", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R010_MCM: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:18:23.717441", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R011_RACK: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:18:23.717755", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R020_DPM: 3 rungs | example: NOP();", "timestamp": "2025-08-22T21:18:23.717932", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);", "timestamp": "2025-08-22T21:18:23.718122", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];", "timestamp": "2025-08-22T21:18:23.718268", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:18:23.718403", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernMainProgramGenerator to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:18:23.720095", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] MainProgram written to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:18:23.720424", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating safety tag mapping...", "timestamp": "2025-08-22T21:18:23.720588", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MappingWriter wrapper", "timestamp": "2025-08-22T21:18:23.720752", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating DataLoader instance", "timestamp": "2025-08-22T21:18:23.720912", "module": "src.container", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/DESC_IP_MERGED.xlsx"}
{"level": "INFO", "message": "[SUCCESS] Safety tag mapping written to SafetyTagMapping.txt", "timestamp": "2025-08-22T21:18:23.812169", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": " - Safety tags: 1", "timestamp": "2025-08-22T21:18:23.812378", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== All artifacts generated successfully! ===", "timestamp": "2025-08-22T21:18:23.812534", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 2: Routines Generator stdout ===
Created safety tag mapping file: SafetyTagMapping.txt
=== Step 2: Routines Generator stderr ===
[21:18:22] [INFO] [logging_config.py:128:_log_with_context] Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_211817.log
[21:18:22] [INFO] [logging_config.py:128:_log_with_context] === Generating All PLC Artifacts ===
[21:18:22] [INFO] [logging_config.py:128:_log_with_context] Generating SafetyProgram L5X...
[21:18:22] [WARNING] [logging_config.py:128:_log_with_context] LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator
[21:18:22] [INFO] [logging_config.py:128:_log_with_context] Starting ModernSafetyProgramGenerator generation
[21:18:22] [DEBUG] [logging_config.py:128:_log_with_context] Creating SafetyProgram XML structure
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: main_routine (core)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: apf (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: cb_monitor (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: d2c_chute (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: dpm (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: encoder (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estops (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estop_check (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: extendo (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fioh (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fiom (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: flow_ctrl (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fpe (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: inputs (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: jpe (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: mcm (core)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: outputs (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pb_chute (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pmm (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: rack (core)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: resets (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: safety_tag_map (core)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: speed_ctrl (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_epc (safety)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_chute (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_pb (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_ss_pb (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_s_pb (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: taching_belts (device)
[21:18:22] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: zones (safety)
[21:18:22] [INFO] [logging_config.py:128:_log_with_context] Generating safety routines...
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin inputs cannot generate with current data
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin outputs cannot generate with current data
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin resets cannot generate with current data
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: zones
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Available DCS controllers: {}
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: zones
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin estops cannot generate with current data
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag map with 1 tags
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] Routines created (2): MainRoutine, R030_ZONES
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernSafetyProgramGenerator generation
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Generating MainProgram L5X...
[21:18:23] [WARNING] [logging_config.py:128:_log_with_context] LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Starting ModernMainProgramGenerator generation
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Creating MainProgram XML structure
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Adding controller tags...
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Added 15 controller tags
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Generating main program routines...
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: mcm
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: mcm
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: rack
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: rack
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: dpm
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: dpm
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin apf cannot generate with current data
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin estop_check cannot generate with current data
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: safety_tag_map
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: RST data has 1 rows
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag mapping: MCM05 -> Local:5:I.Data.0
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generating 1 rungs
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generated 1 total rungs
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: safety_tag_map
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Plugin taching_belts cannot generate with current data
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: main_routine
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Generating MainRoutine with JSR calls
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated MainRoutine
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: main_routine
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - R010_MCM: 2 rungs | example: NOP();
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - R011_RACK: 2 rungs | example: NOP();
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - R020_DPM: 3 rungs | example: NOP();
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);
[21:18:23] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernMainProgramGenerator generation
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Written ModernMainProgramGenerator to MainProgram_Generated.L5X
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] MainProgram written to MainProgram_Generated.L5X
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] Generating safety tag mapping...
[21:18:23] [DEBUG] [logging_config.py:128:_log_with_context] Creating MappingWriter wrapper
[21:18:23] [DEBUG] [logging_config.py:126:_log_with_context] Creating DataLoader instance
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] Safety tag mapping written to SafetyTagMapping.txt
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] - Safety tags: 1
[21:18:23] [INFO] [logging_config.py:128:_log_with_context] === All artifacts generated successfully! ===
{"level": "INFO", "message": "Routine generation completed successfully", "timestamp": "2025-08-22T21:18:23.863561", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 3: IO Tree Generator stdout ===
Enhanced MCM Generator
- Project: CNO8_MCM05
- Excel: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/DESC_IP_MERGED.xlsx
- Boilerplate: CNO8_boilerplate
- Mode: Single file
--------------------------------------------------
Created 34 FIOH modules based on TERM analysis
Found 37 IOLM modules
Found 124 Beacon modules
Found 2 DPM modules
Created 37 IOLM modules with boilerplate selection:
VS01B_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM17 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM18 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM19 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM17 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM18 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT5_IB16_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT7_IB16S_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT6_OB16E_Module.L5X
Importing AOIs/DataTypes from base: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/IO Tree Configuration Generator/BaseProgram.L5X
Programs already exist (2 programs found), skipping empty program creation
OK: Generated project: generated_projects/CNO8_MCM05.L5X
Single file generation complete
- ['generated_projects/CNO8_MCM05.L5X']

View File

@ -0,0 +1,560 @@
{"level": "INFO", "message": "PLC Generation Workflow started", "timestamp": "2025-08-22T21:27:04.134913", "module": "__main__", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/data/CNO8_MCM05_fixed.xlsx", "project_name": "CNO8_MCM05"}
{"level": "INFO", "message": "Starting data processing step", "timestamp": "2025-08-22T21:27:04.135213", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 1: PLC Data Generator stdout ===
Loading IO path mappings...
Loaded IO path mappings:
APF: 11 rows
M12DR: 16 rows
Hub: 16 rows
SorterHub: 16 rows
SIO: 16 rows
IB16: 16 rows
OB16E: 16 rows
IB16S: 16 rows
Available sheets: ['NETWORK_PLC', 'DESC_PLC']
Found DESC sheet: DESC_PLC
Found NETWORK sheet: NETWORK_PLC
DESC columns: ['TAGNAME', 'TERM', 'DESCA', 'DESCB']
NETWORK columns: ['DPM', 'DPM_IP', 'Name', 'PartNumber', 'IP']
NOTE: Ignored 37 rows from DESC sheet with an empty TAGNAME.
Classifying signals and adding IO paths...
Signal classification results:
SPARE: 521
I: 418
IOLink: 158
O: 39
Device type distribution:
M12DR: 544
Hub: 544
IB16: 16
OB16E: 16
IB16S: 16
IO Path mapping results:
Successful mappings: 1136/1136 (100.0%)
Found 3 TAGNAMEs present in DESC but not in NETWORK_PLC.
Adding unique DPM names not present in DESC or NETWORK_PLC.Name: ['DPM01_VS01B', 'DPM01_VS01C']
================================================================================
WARNING: The following issues were found but processing will continue:
================================================================================
- TAGNAME 'SLOT5_IB16' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT6_OB16E' from DESC sheet not found in NETWORK_PLC sheet.
- TAGNAME 'SLOT7_IB16S' from DESC sheet not found in NETWORK_PLC sheet.
================================================================================
Continuing with processing...
Normalizing TAGNAME, DESC, and IO_PATH columns for VFDs only in the final output...
Final result has 1141 rows
Sample of merged data:
TAGNAME TERM DESCA ... SIGNAL DEVICE_TYPE IO_PATH
0 SLOT5_IB16 I0 MCM05 ... I IB16 Local:5:I.Data.0
1 SLOT5_IB16 I1 MCM05 ... I IB16 Local:5:I.Data.1
2 SLOT5_IB16 I10 SPARE ... SPARE IB16 Local:5:I.Data.10
3 SLOT5_IB16 I11 SPARE ... SPARE IB16 Local:5:I.Data.11
4 SLOT5_IB16 I12 SPARE ... SPARE IB16 Local:5:I.Data.12
5 SLOT5_IB16 I13 SPARE ... SPARE IB16 Local:5:I.Data.13
6 SLOT5_IB16 I14 SPARE ... SPARE IB16 Local:5:I.Data.14
7 SLOT5_IB16 I15 SPARE ... SPARE IB16 Local:5:I.Data.15
8 SLOT5_IB16 I2 MCM05 ... I IB16 Local:5:I.Data.2
9 SLOT5_IB16 I3 MCM05 ... I IB16 Local:5:I.Data.3
[10 rows x 11 columns]
New Excel file created: MCM05_DESC_IP_MERGED.xlsx
The file contains all original sheets plus the new 'DESC_IP' sheet with merged data.
Reading input file: MCM05_DESC_IP_MERGED.xlsx
Removed 158 IOLink rows (including beacons, FIOH channels, and all other IOLink entries)
Added 283 rows for beacon lights
Removed 5 blank name/description rows
Saving output file: MCM05_OUTPUT.csv
Processing complete!
Created standard output file: DESC_IP_MERGED.xlsx
=== Step 1: PLC Data Generator stderr ===
{"level": "INFO", "message": "Data processing completed successfully", "timestamp": "2025-08-22T21:27:07.677531", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting routine generation step", "timestamp": "2025-08-22T21:27:07.677837", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_212704.log", "timestamp": "2025-08-22T21:27:09.504830", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== Generating All PLC Artifacts ===", "timestamp": "2025-08-22T21:27:09.506998", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating SafetyProgram L5X...", "timestamp": "2025-08-22T21:27:09.507184", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator", "timestamp": "2025-08-22T21:27:09.517667", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:27:09.517880", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating SafetyProgram XML structure", "timestamp": "2025-08-22T21:27:09.518038", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Registered plugin: main_routine (core)", "timestamp": "2025-08-22T21:27:09.529512", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: apf (device)", "timestamp": "2025-08-22T21:27:09.534277", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: cb_monitor (device)", "timestamp": "2025-08-22T21:27:09.537655", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: d2c_chute (device)", "timestamp": "2025-08-22T21:27:09.541828", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: dpm (device)", "timestamp": "2025-08-22T21:27:09.545050", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: encoder (device)", "timestamp": "2025-08-22T21:27:09.548530", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estops (safety)", "timestamp": "2025-08-22T21:27:09.556494", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: estop_check (safety)", "timestamp": "2025-08-22T21:27:09.560869", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: extendo (device)", "timestamp": "2025-08-22T21:27:09.565089", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fioh (device)", "timestamp": "2025-08-22T21:27:09.569732", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fiom (device)", "timestamp": "2025-08-22T21:27:09.573904", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: flow_ctrl (device)", "timestamp": "2025-08-22T21:27:09.577542", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: fpe (device)", "timestamp": "2025-08-22T21:27:09.581718", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: inputs (safety)", "timestamp": "2025-08-22T21:27:09.585942", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: jpe (device)", "timestamp": "2025-08-22T21:27:09.589963", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: mcm (core)", "timestamp": "2025-08-22T21:27:09.593879", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: outputs (safety)", "timestamp": "2025-08-22T21:27:09.598180", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pb_chute (device)", "timestamp": "2025-08-22T21:27:09.602381", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: pmm (device)", "timestamp": "2025-08-22T21:27:09.606475", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: rack (core)", "timestamp": "2025-08-22T21:27:09.611048", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: resets (safety)", "timestamp": "2025-08-22T21:27:09.614830", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: safety_tag_map (core)", "timestamp": "2025-08-22T21:27:09.618865", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: speed_ctrl (device)", "timestamp": "2025-08-22T21:27:09.622949", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_epc (safety)", "timestamp": "2025-08-22T21:27:09.627477", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_chute (device)", "timestamp": "2025-08-22T21:27:09.631612", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_jr_pb (device)", "timestamp": "2025-08-22T21:27:09.635476", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_ss_pb (device)", "timestamp": "2025-08-22T21:27:09.639394", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: station_s_pb (device)", "timestamp": "2025-08-22T21:27:09.643485", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: taching_belts (device)", "timestamp": "2025-08-22T21:27:09.648493", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "DEBUG", "message": "Registered plugin: zones (safety)", "timestamp": "2025-08-22T21:27:09.652727", "module": "src.plugin_system", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "plugin_discovery"}
{"level": "INFO", "message": "Generating safety routines...", "timestamp": "2025-08-22T21:27:09.652952", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin inputs cannot generate with current data", "timestamp": "2025-08-22T21:27:10.542943", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin outputs cannot generate with current data", "timestamp": "2025-08-22T21:27:10.547004", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin resets cannot generate with current data", "timestamp": "2025-08-22T21:27:10.547274", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:27:10.549607", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:27:10.549859", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:27:10.550090", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:27:10.550771", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "DEBUG", "message": "Generating routine: zones", "timestamp": "2025-08-22T21:27:10.551028", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Available DCS controllers: {}", "timestamp": "2025-08-22T21:27:10.551550", "module": "src.routines.zones", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: zones", "timestamp": "2025-08-22T21:27:10.551919", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estops cannot generate with current data", "timestamp": "2025-08-22T21:27:10.552209", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}", "timestamp": "2025-08-22T21:27:10.552391", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag map with 1 tags", "timestamp": "2025-08-22T21:27:10.559673", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (2): MainRoutine, R030_ZONES", "timestamp": "2025-08-22T21:27:10.559877", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);", "timestamp": "2025-08-22T21:27:10.560038", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];", "timestamp": "2025-08-22T21:27:10.560175", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernSafetyProgramGenerator generation", "timestamp": "2025-08-22T21:27:10.560311", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:27:10.562127", "module": "ModernSafetyProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X", "timestamp": "2025-08-22T21:27:10.562388", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainProgram L5X...", "timestamp": "2025-08-22T21:27:10.562572", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "WARNING", "message": "LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator", "timestamp": "2025-08-22T21:27:10.562729", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Starting ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:27:10.562944", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MainProgram XML structure", "timestamp": "2025-08-22T21:27:10.563141", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Adding controller tags...", "timestamp": "2025-08-22T21:27:10.563342", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Zones: subsystem key", "timestamp": "2025-08-22T21:27:10.663988", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "subsystem": "DEFAULT", "found": false}
{"level": "DEBUG", "message": "Zones: heuristic best match", "timestamp": "2025-08-22T21:27:10.664174", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "best_key": null, "score": -1}
{"level": "DEBUG", "message": "Zones: using DEFAULT group", "timestamp": "2025-08-22T21:27:10.664292", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "default_count": 1}
{"level": "DEBUG", "message": "Zones: loaded", "timestamp": "2025-08-22T21:27:10.664668", "module": "src.data_loader", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "rows": 1}
{"level": "INFO", "message": "Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2", "timestamp": "2025-08-22T21:27:10.710978", "module": "src.writers.xml_tag_writer", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Added 15 controller tags", "timestamp": "2025-08-22T21:27:10.711320", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating main program routines...", "timestamp": "2025-08-22T21:27:10.711523", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: mcm", "timestamp": "2025-08-22T21:27:10.711697", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: mcm", "timestamp": "2025-08-22T21:27:10.711828", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: rack", "timestamp": "2025-08-22T21:27:10.711968", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: rack", "timestamp": "2025-08-22T21:27:10.712087", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: dpm", "timestamp": "2025-08-22T21:27:10.712214", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: dpm", "timestamp": "2025-08-22T21:27:10.713228", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin apf cannot generate with current data", "timestamp": "2025-08-22T21:27:10.713974", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin estop_check cannot generate with current data", "timestamp": "2025-08-22T21:27:10.714181", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: safety_tag_map", "timestamp": "2025-08-22T21:27:10.714356", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: RST data has 1 rows", "timestamp": "2025-08-22T21:27:10.714572", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Added safety tag mapping: MCM05 -> Local:5:I.Data.0", "timestamp": "2025-08-22T21:27:10.714822", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generating 1 rungs", "timestamp": "2025-08-22T21:27:10.715006", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);", "timestamp": "2025-08-22T21:27:10.715155", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Safety tag map: Generated 1 total rungs", "timestamp": "2025-08-22T21:27:10.715301", "module": "src.routines.safety_tag_map", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: safety_tag_map", "timestamp": "2025-08-22T21:27:10.715449", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Plugin taching_belts cannot generate with current data", "timestamp": "2025-08-22T21:27:10.715848", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Generating routine: main_routine", "timestamp": "2025-08-22T21:27:10.716009", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating MainRoutine with JSR calls", "timestamp": "2025-08-22T21:27:10.716144", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated MainRoutine", "timestamp": "2025-08-22T21:27:10.716275", "module": "src.routines.main_routine_plugin.MainRoutinePlugin", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Successfully generated routine: main_routine", "timestamp": "2025-08-22T21:27:10.716394", "module": "src.plugin_system", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}", "timestamp": "2025-08-22T21:27:10.716507", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP", "timestamp": "2025-08-22T21:27:10.716628", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R010_MCM: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:27:10.716751", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R011_RACK: 2 rungs | example: NOP();", "timestamp": "2025-08-22T21:27:10.716863", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R020_DPM: 3 rungs | example: NOP();", "timestamp": "2025-08-22T21:27:10.717002", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);", "timestamp": "2025-08-22T21:27:10.717175", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "- MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];", "timestamp": "2025-08-22T21:27:10.717294", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "stage": "summary"}
{"level": "INFO", "message": "Successfully completed ModernMainProgramGenerator generation", "timestamp": "2025-08-22T21:27:10.717514", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Written ModernMainProgramGenerator to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:27:10.719350", "module": "ModernMainProgramGenerator", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "[SUCCESS] MainProgram written to MainProgram_Generated.L5X", "timestamp": "2025-08-22T21:27:10.719521", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "Generating safety tag mapping...", "timestamp": "2025-08-22T21:27:10.719695", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating MappingWriter wrapper", "timestamp": "2025-08-22T21:27:10.719854", "module": "src.container", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "DEBUG", "message": "Creating DataLoader instance", "timestamp": "2025-08-22T21:27:10.720013", "module": "src.container", "file": "logging_config.py", "line": 126, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py", "excel_file": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/DESC_IP_MERGED.xlsx"}
{"level": "INFO", "message": "[SUCCESS] Safety tag mapping written to SafetyTagMapping.txt", "timestamp": "2025-08-22T21:27:10.806850", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": " - Safety tags: 1", "timestamp": "2025-08-22T21:27:10.807059", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
{"level": "INFO", "message": "=== All artifacts generated successfully! ===", "timestamp": "2025-08-22T21:27:10.807234", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 2: Routines Generator stdout ===
Created safety tag mapping file: SafetyTagMapping.txt
=== Step 2: Routines Generator stderr ===
[21:27:09] [INFO] [logging_config.py:128:_log_with_context] Logging to file: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/logs/workflow_CNO8_MCM05_20250822_212704.log
[21:27:09] [INFO] [logging_config.py:128:_log_with_context] === Generating All PLC Artifacts ===
[21:27:09] [INFO] [logging_config.py:128:_log_with_context] Generating SafetyProgram L5X...
[21:27:09] [WARNING] [logging_config.py:128:_log_with_context] LimitedSafetyProgramGenerator is deprecated; using ModernSafetyProgramGenerator
[21:27:09] [INFO] [logging_config.py:128:_log_with_context] Starting ModernSafetyProgramGenerator generation
[21:27:09] [DEBUG] [logging_config.py:128:_log_with_context] Creating SafetyProgram XML structure
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: main_routine (core)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: apf (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: cb_monitor (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: d2c_chute (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: dpm (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: encoder (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estops (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: estop_check (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: extendo (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fioh (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fiom (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: flow_ctrl (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: fpe (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: inputs (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: jpe (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: mcm (core)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: outputs (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pb_chute (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: pmm (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: rack (core)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: resets (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: safety_tag_map (core)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: speed_ctrl (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_epc (safety)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_chute (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_jr_pb (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_ss_pb (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: station_s_pb (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: taching_belts (device)
[21:27:09] [DEBUG] [logging_config.py:126:_log_with_context] Registered plugin: zones (safety)
[21:27:09] [INFO] [logging_config.py:128:_log_with_context] Generating safety routines...
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin inputs cannot generate with current data
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin outputs cannot generate with current data
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin resets cannot generate with current data
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: zones
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Available DCS controllers: {}
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: zones
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin estops cannot generate with current data
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Safety routine generation results: {'inputs': False, 'outputs': False, 'resets': False, 'zones': True, 'estops': False}
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag map with 1 tags
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] Routines created (2): MainRoutine, R030_ZONES
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - R030_ZONES: 1 rungs | example: XIC(MCM_EPB_DCS_CTRL.O1)OTE(EStop_MCM_OK);
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_INPUTS,0) ,JSR(R011_OUTPUTS,0) ,JSR(R012_RESETS,0) ,JSR(R020_ESTOPS,0) ,JSR(R030_ZONES,0) ];
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernSafetyProgramGenerator generation
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Written ModernSafetyProgramGenerator to SafetyProgram_Generated.L5X
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] SafetyProgram written to SafetyProgram_Generated.L5X
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Generating MainProgram L5X...
[21:27:10] [WARNING] [logging_config.py:128:_log_with_context] LimitedMainProgramGenerator is deprecated; using ModernMainProgramGenerator
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Starting ModernMainProgramGenerator generation
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Creating MainProgram XML structure
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Adding controller tags...
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: subsystem key
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: heuristic best match
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: using DEFAULT group
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Zones: loaded
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] Tags created: total=15 | standard=1 safety=3 dcs=1 modules=2
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Added 15 controller tags
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Generating main program routines...
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: mcm
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: mcm
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: rack
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: rack
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: dpm
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: dpm
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin apf cannot generate with current data
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin estop_check cannot generate with current data
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: safety_tag_map
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: RST data has 1 rows
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Added safety tag mapping: MCM05 -> Local:5:I.Data.0
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generating 1 rungs
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generated rung 1: XIC(Local:5:I.Data.0)OTE(MCM05);
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Safety tag map: Generated 1 total rungs
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: safety_tag_map
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Plugin taching_belts cannot generate with current data
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Generating routine: main_routine
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Generating MainRoutine with JSR calls
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated MainRoutine
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully generated routine: main_routine
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Main routine generation results: {'mcm': True, 'rack': True, 'dpm': True, 'apf': False, 'estop_check': False, 'safety_tag_map': True, 'taching_belts': False, 'main_routine': True}
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] Routines created (5): MainRoutine, R010_MCM, R011_RACK, R020_DPM, R130_SAFETY_TAG_MAP
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - R010_MCM: 2 rungs | example: NOP();
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - R011_RACK: 2 rungs | example: NOP();
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - R020_DPM: 3 rungs | example: NOP();
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - R130_SAFETY_TAG_MAP: 2 rungs | example: XIC(Local:5:I.Data.0)OTE(MCM_S_PB);
[21:27:10] [INFO] [logging_config.py:126:_log_with_context] - MainRoutine: 1 rungs | example: [JSR(R010_MCM,0) ,JSR(R011_RACK,0) ,JSR(R020_DPM,0) ,JSR(R130_SAFETY_TAG_MAP,0) ];
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Successfully completed ModernMainProgramGenerator generation
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Written ModernMainProgramGenerator to MainProgram_Generated.L5X
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] MainProgram written to MainProgram_Generated.L5X
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] Generating safety tag mapping...
[21:27:10] [DEBUG] [logging_config.py:128:_log_with_context] Creating MappingWriter wrapper
[21:27:10] [DEBUG] [logging_config.py:126:_log_with_context] Creating DataLoader instance
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] [SUCCESS] Safety tag mapping written to SafetyTagMapping.txt
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] - Safety tags: 1
[21:27:10] [INFO] [logging_config.py:128:_log_with_context] === All artifacts generated successfully! ===
{"level": "INFO", "message": "Routine generation completed successfully", "timestamp": "2025-08-22T21:27:10.862737", "module": "__main__", "file": "logging_config.py", "line": 128, "function": "_log_with_context", "pathname": "/mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/Routines Generator/src/logging_config.py"}
=== Step 3: IO Tree Generator stdout ===
Enhanced MCM Generator
- Project: CNO8_MCM05
- Excel: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/PLC Data Generator/DESC_IP_MERGED.xlsx
- Boilerplate: CNO8_boilerplate
- Mode: Single file
--------------------------------------------------
Created 34 FIOH modules based on TERM analysis
Found 37 IOLM modules
Found 124 Beacon modules
Found 2 DPM modules
Created 37 IOLM modules with boilerplate selection:
VS01B_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM17 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM18 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM19 (FIO D2CMaster): Using variant boilerplate D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/D2CMaster_Module.L5X
VS01B_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM1 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM10 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM11 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM12 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM13 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM14 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM15 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM16 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM17 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM18 (FIO FIOM2_Master): Using variant boilerplate FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/FIOM2_Master_Module.L5X
VS01C_FIOM2 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM3 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM4 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM5 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM6 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM7 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM8 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01C_FIOM9 (FIO PalletBuildMaster): Using variant boilerplate PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/PalletBuildMaster_Module.L5X
VS01B_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01B_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH1 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH10 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH11 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH12 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH13 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH14 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH15 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH16 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH17 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH2 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH3 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH4 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH5 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH6 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH7 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH8 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
VS01C_FIOH9 (FIOH Sorter): Using variant boilerplate Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/Sorter_FIOH_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT5_IB16_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT7_IB16S_Module.L5X
Successfully loaded boilerplate: CNO8_boilerplate/SLOT6_OB16E_Module.L5X
Importing AOIs/DataTypes from base: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/IO Tree Configuration Generator/BaseProgram.L5X
Programs already exist (2 programs found), skipping empty program creation
OK: Generated project: generated_projects/CNO8_MCM05.L5X
Single file generation complete
- ['generated_projects/CNO8_MCM05.L5X']
=== Step 4: L5X2ACD Compiler output ===
🚀 Setting up compilation for project: CNO8_MCM05
📂 Compilation directory: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler
📄 Source L5X: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/IO Tree Configuration Generator/generated_projects/CNO8_MCM05.L5X
🔧 Mode: wipe_existing=False, replace_mode=True
🔄 Using SMART REPLACE mode - keeping current project files
🧹 Cleaning old project files...
⚪ Keeping current project file: CNO8_MCM05.L5X
⚪ Keeping current project file: compile_CNO8_MCM05.bat
🧹 Cleanup complete: 0 files removed, 2 current files kept, 0 directories removed
📁 Copying L5X file: CNO8_MCM05.L5X → CNO8_MCM05.L5X
✓ Copied successfully (7.52 MB)
🔧 Batch file exists: compile_CNO8_MCM05.bat
✅ Compilation setup complete!
L5X File: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/CNO8_MCM05.L5X
Batch File: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/compile_CNO8_MCM05.bat
🪟 To compile on Windows:
1. Run: /mnt/c/Users/ilia.gurielidze/Projects/PLC Generation/L5X2ACD Compiler/compile_CNO8_MCM05.bat
2. Or double-click: compile_CNO8_MCM05.bat

Some files were not shown because too many files have changed in this diff Show More