2025-08-05 14:38:54 +04:00

104 lines
3.4 KiB
Python

"""
EN4TR EtherNet/IP Module L5X Generator (Boilerplate-based)
==========================================================
This module provides functionality to generate EN4TR module L5X files by
loading a boilerplate template and modifying specific fields.
"""
from dataclasses import dataclass, field
from typing import Optional
from .base_boilerplate_model import BaseModuleConfig, BaseBoilerplateGenerator
@dataclass
class EN4TRModuleConfig(BaseModuleConfig):
"""Configuration for an EN4TR module."""
name: str
ethernet_address: str # e.g., "11.200.1.1"
boilerplate_path: str = "boilerplate/SLOT2_EN4TR_Module.L5X"
parent_module: str = "Local"
parent_port_id: str = "1"
slot_address: str = "2"
def get_updates(self):
"""Get dictionary of updates to apply."""
return {
"name": self.name,
"ethernet_address": self.ethernet_address,
"parent_module": self.parent_module,
"parent_port_id": self.parent_port_id,
"slot_address": self.slot_address
}
class EN4TRModuleGenerator(BaseBoilerplateGenerator):
"""Generator for EN4TR module L5X files using boilerplate template."""
def apply_updates(self):
"""Apply EN4TR-specific updates to the boilerplate."""
# Update TargetName in root element
self.root.set("TargetName", self.config.name)
# Update Module name
module = self.root.find(".//Module[@Use='Target']")
if module is not None:
module.set("Name", self.config.name)
module.set("ParentModule", self.config.parent_module)
module.set("ParentModPortId", self.config.parent_port_id)
# Update slot address (ICP port)
icp_port = self.root.find(".//Module[@Use='Target']/Ports/Port[@Type='ICP']")
if icp_port is not None:
icp_port.set("Address", self.config.slot_address)
# Update Ethernet address
eth_port = self.root.find(".//Module[@Use='Target']/Ports/Port[@Type='Ethernet']")
if eth_port is not None:
eth_port.set("Address", self.config.ethernet_address)
# Factory function
def create_en4tr_module(
name: str,
ethernet_address: str,
slot_address: str = "2",
parent_module: str = "Local",
parent_port_id: str = "1"
) -> EN4TRModuleConfig:
"""
Create an EN4TR module configuration.
Args:
name: Module name
ethernet_address: Ethernet IP address (e.g., "11.200.1.1")
slot_address: Slot number in the chassis
parent_module: Parent module name
parent_port_id: Parent module port ID
Returns:
EN4TRModuleConfig object
"""
return EN4TRModuleConfig(
name=name,
ethernet_address=ethernet_address,
slot_address=slot_address,
parent_module=parent_module,
parent_port_id=parent_port_id
)
if __name__ == "__main__":
# Example usage
config = create_en4tr_module(
name="SLOT3_EN4TR",
ethernet_address="11.200.1.10",
slot_address="3",
parent_module="Local",
parent_port_id="1"
)
# Generate the module
generator = EN4TRModuleGenerator(config)
generator.save_to_file("generated/SLOT3_EN4TR.L5X")
print(f"Generated EN4TR module configuration saved to generated/SLOT3_EN4TR.L5X")