""" 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")