Most stable state
This commit is contained in:
parent
d8516dd302
commit
e68f0d9980
327
CNO8_generator_config.json
Normal file
327
CNO8_generator_config.json
Normal 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
10
CNO8_zones.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"DEFAULT": [
|
||||
{
|
||||
"name": "MCM",
|
||||
"start": "",
|
||||
"stop": "",
|
||||
"interlock": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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.
|
||||
|
||||
@ -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():
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
||||
@ -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]]:
|
||||
|
||||
Binary file not shown.
@ -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!")
|
||||
|
||||
@ -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 ====================================
|
||||
)
|
||||
|
||||
Binary file not shown.
@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
PLC Data Generator/MCM03_DESC_IP_MERGED.xlsx
Normal file
BIN
PLC Data Generator/MCM03_DESC_IP_MERGED.xlsx
Normal file
Binary file not shown.
770
PLC Data Generator/MCM03_OUTPUT.csv
Normal file
770
PLC Data Generator/MCM03_OUTPUT.csv
Normal 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
|
||||
|
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
BIN
PLC Data Generator/MCM06_DESC_IP_MERGED.xlsx
Normal file
BIN
PLC Data Generator/MCM06_DESC_IP_MERGED.xlsx
Normal file
Binary file not shown.
3908
PLC Data Generator/MCM06_OUTPUT.csv
Normal file
3908
PLC Data Generator/MCM06_OUTPUT.csv
Normal file
File diff suppressed because it is too large
Load Diff
BIN
PLC Data Generator/MCM07_DESC_IP_MERGED.xlsx
Normal file
BIN
PLC Data Generator/MCM07_DESC_IP_MERGED.xlsx
Normal file
Binary file not shown.
1602
PLC Data Generator/MCM07_OUTPUT.csv
Normal file
1602
PLC Data Generator/MCM07_OUTPUT.csv
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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.
Binary file not shown.
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM03_COMPLETE.xlsx
Normal file
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM03_COMPLETE.xlsx
Normal file
Binary file not shown.
Binary file not shown.
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM04_COMPLETE.xlsx
Normal file
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM04_COMPLETE.xlsx
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM05_COMPLETE.xlsx
Normal file
BIN
PLC Data Generator/data/IO Assignment_MTN6_MCM05_COMPLETE.xlsx
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
PLC Data Generator/data/SAT9_MCM02_fixed.xlsx
Normal file
BIN
PLC Data Generator/data/SAT9_MCM02_fixed.xlsx
Normal file
Binary file not shown.
BIN
PLC Data Generator/data/SAT9_MCM04.xlsx
Normal file
BIN
PLC Data Generator/data/SAT9_MCM04.xlsx
Normal file
Binary file not shown.
BIN
PLC Data Generator/data/SAT9_MCM05_SWAPPED.xlsx
Normal file
BIN
PLC Data Generator/data/SAT9_MCM05_SWAPPED.xlsx
Normal file
Binary file not shown.
@ -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'
|
||||
|
||||
@ -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)):
|
||||
|
||||
@ -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:
|
||||
|
||||
Binary file not shown.
@ -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
|
||||
@ -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')
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -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
|
||||
|
||||
@ -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")
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
122
Routines Generator/src/routines/belt_tracking.py
Normal file
122
Routines Generator/src/routines/belt_tracking.py
Normal 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)
|
||||
89
Routines Generator/src/routines/encoder.py
Normal file
89
Routines Generator/src/routines/encoder.py
Normal 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)
|
||||
@ -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
|
||||
|
||||
@ -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 n→n-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)
|
||||
|
||||
@ -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]
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
93
Routines Generator/src/routines/station_epc.py
Normal file
93
Routines Generator/src/routines/station_epc.py
Normal 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)
|
||||
84
Routines Generator/src/routines/station_s_pb.py
Normal file
84
Routines Generator/src/routines/station_s_pb.py
Normal 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)
|
||||
87
Routines Generator/src/routines/station_ss_pb.py
Normal file
87
Routines Generator/src/routines/station_ss_pb.py
Normal 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)
|
||||
112
Routines Generator/src/routines/taching_belts.py
Normal file
112
Routines Generator/src/routines/taching_belts.py
Normal 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)
|
||||
@ -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")
|
||||
|
||||
Binary file not shown.
@ -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
327
SAT9_generator_config.json
Normal 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
|
||||
}
|
||||
}
|
||||
253
SAT9_zones.json
253
SAT9_zones.json
@ -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
220
generator_config.json
Normal 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": {}
|
||||
}
|
||||
565
logs/workflow_CNO8_MCM05_20250822_210401.log
Normal file
565
logs/workflow_CNO8_MCM05_20250822_210401.log
Normal 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
|
||||
|
||||
534
logs/workflow_CNO8_MCM05_20250822_211817.log
Normal file
534
logs/workflow_CNO8_MCM05_20250822_211817.log
Normal 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']
|
||||
560
logs/workflow_CNO8_MCM05_20250822_212704.log
Normal file
560
logs/workflow_CNO8_MCM05_20250822_212704.log
Normal 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
Loading…
x
Reference in New Issue
Block a user