#!/usr/bin/env python3 import sys, string # import lxml.etree import plcData from plcElement import plcElementXML # from plcModule import plcModule # from plcTag import plcTag class plcDataTypeMember(plcElementXML): """Allen-Bradley PLC RSLogix5000 DataType Member""" # Constructor of the tag from XML element def __init__(self, rootElement, parentObj=None): plcElementXML.__init__(self, rootElement, parentObj) self.radix = None if "Radix" in list(self.root.attrib.keys()): self.radix = self.root.attrib["Radix"] self.isArray = False if self.dimension is not None and int(self.dimension) > 0: self.isArray = True # print( "Created data member {0}".format(self.name)) return class plcDataType(plcElementXML): """Allen-Bradley PLC RSLogix5000 DataTypes""" # Constructor of the tag from XML element def __init__(self, rootElement, parentObj=None ): plcElementXML.__init__(self, rootElement, parentObj) self.members = {} # print( "Will create members for DataType {0} or {1}".format(self.name, rootElement.attrib["Name"] ) ) self.createDataMembers() return def createDataMembers(self): memberElements = self.root.xpath("Members/Member") for memElm in memberElements: if "Name" in list(memElm.attrib.keys()) : # print( "Trying to create member {0} for DataType {1}".format(memElm.attrib["Name"], self.name)) memObj = plcDataTypeMember(memElm, self) self.members[memObj.name] = memObj def getParameters(self): return self.members def getParameter(self, name): return self.members[name] class plcCustomData(plcElementXML): """Allen-Bradley PLC RSLogix5000 Custom DataTypes""" # Constructor of the tag from XML element def __init__(self, rootElement, parentObj=None ): try: plcElementXML.__init__(self, rootElement, parentObj) except UselessDataType as err: print(err) return self.dataMembers = [] self.arrayMembers = [] self.daughters.append(self.dataMembers) self.daughters.append(self.arrayMembers) # For tags name contributes to the path self.addNameToPath(self.name) self.createChildren() return def createChildren(self): controllerObject = self.getParentController() if self.dataType in controllerObject.dataTypes.keys(): dataTypeObj = controllerObject.dataTypes[self.dataType] # print( "Self name is {0}, DataType object name is {1}".format(self.name, dataTypeObj.name) ) # print( dataTypeObj.members.keys() ) if dataTypeObj is not None: for memberName in dataTypeObj.members.keys(): dataMember = dataTypeObj.members[memberName] if dataMember is not None and not dataMember.isArray: if dataMember.dataType in plcData.atomicTypes: newDataValue = plcCustomDataMember(self.root, self, dataMember) self.dataMembers.append(newDataValue) else: print( "Custom type <{0}> member <{1}> is not an array and is not an PLC atomic type, it is <{2}> instead".format(self.dataType, memberName, dataMember.dataType) ) if dataMember.dataType is not None and dataMember.isArray: newDataValue = plcCustomDataArrayMember(self.root, self, dataMember) self.arrayMembers.append(newDataValue) return class plcCustomDataMember(plcElementXML): # Constructor def __init__( self, rootElement, parentObj, dMember=None ): try: plcElementXML.__init__(self, rootElement, parentObj ) except UselessDataType as err: #print(err) return # For tags name contributes to the path self.addNameToPath(dMember.name) # Create the scalar data object and store its reference in the objects attribute # print("Crating scalar with path {0}, type {1}, access level {2}, radix {3}".format(self.path, dMember.dataType, dMember.accessLevel, dMember.radix)) self.scalar = plcData.plcScalar(self.path, dMember.dataType, dMember.accessLevel, None, dMember.radix) class plcCustomDataArrayMember(plcElementXML): # Constructor def __init__( self, rootElement, parentObj, dMember=None ): try: plcElementXML.__init__(self, rootElement, parentObj ) except UselessDataType as err: #print(err) return # For tags name contributes to the path self.addNameToPath(dMember.name) # Create the scalar data object and store its reference in the objects attribute print("Creating array with path {0}, type {1}, access level {2}, dimension {3}".format(self.path, dMember.dataType, dMember.accessLevel, dMember.dimension)) self.array = plcData.plcArray(self.path, dMember.dataType, dMember.accessLevel, dMember.dimension)