104 lines
3.4 KiB
Python
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") |