plcopen/plcopen.py
changeset 67 3a1b0afdaf84
parent 63 04a02b4b2a57
child 68 66308e07402c
--- a/plcopen/plcopen.py	Thu Aug 09 18:06:54 2007 +0200
+++ b/plcopen/plcopen.py	Thu Aug 09 18:07:44 2007 +0200
@@ -23,6 +23,7 @@
 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from xmlclass import *
+from types import *
 import os, sys
 
 """
@@ -52,8 +53,8 @@
 GenerateClassesFromXSD(os.path.join(base_folder, "plcopen/TC6_XML_V10_B.xsd"))
 CreateClasses(PLCOpenClasses, PLCOpenTypes)
 
-if "dataType" in PLCOpenClasses:
-    cls = PLCOpenClasses["dataType"]
+cls = PLCOpenClasses.get("dataType", None)
+if cls:
     cls.value = None
     
     def getValue(self):
@@ -65,20 +66,28 @@
     setattr(cls, "setValue", setValue)
     
     def loadXMLTree(self, tree):
-        self.value = tree.childNodes[1].nodeName
+        node = tree.childNodes[1]
+        if node.nodeName == "derived":
+            self.value = PLCOpenClasses["derived"]()
+            self.value.loadXMLTree(node)
+        else:
+            self.value = node.nodeName
     setattr(cls, "loadXMLTree", loadXMLTree)
     
     def generateXMLText(self, name, indent, extras = {}):
         ind1, ind2 = getIndent(indent, name)
         text = ind1 + "<%s>\n"%name
-        ind3, ind4 = getIndent(indent + 1, self.value)
-        text += ind3 + "<%s/>\n"%self.value
+        if isinstance(self.value, (StringType, UnicodeType)):
+            ind3, ind4 = getIndent(indent + 1, self.value)
+            text += ind3 + "<%s/>\n"%self.value
+        else:
+            text += self.value.generateXMLText("derived", indent + 1)
         text += ind1 + "</%s>\n"%name
         return text
     setattr(cls, "generateXMLText", generateXMLText)
 
-if "formattedText" in PLCOpenClasses:
-    cls = PLCOpenClasses["formattedText"]
+cls = PLCOpenClasses.get("formattedText", None)
+if cls:
     cls.text = ""
     
     def getText(self):
@@ -98,12 +107,12 @@
     def generateXMLText(self, name, indent, extras = {}):
         ind1, ind2 = getIndent(indent, name)
         if len(self.text.splitlines()) > 1:
-            text = ind1 + "<%s>\n"%name
+            text = ind1 + "<%s>\n<![CDATA[\n"%name
             text += "%s\n"%self.text
-            text += ind1 + "</%s>\n"%name
+            text += "]]>\n" + ind1 + "</%s>\n"%name
             return text
         else:
-            return ind1 + "<%s>%s</%s>\n"%(name, self.text, name)
+            return ind1 + "<%s><![CDATA[%s]]></%s>\n"%(name, self.text, name)
     setattr(cls, "generateXMLText", generateXMLText)
     
     def updateElementName(self, old_name, new_name):
@@ -118,8 +127,8 @@
                 index = self.text.find(old_name, index + len(new_name))
     setattr(cls, "updateElementName", updateElementName)
     
-if "project" in PLCOpenClasses:
-    cls = PLCOpenClasses["project"]
+cls = PLCOpenClasses.get("project", None)
+if cls:
     cls.singleLineAttributes = False
     
     def getFileHeader(self):
@@ -252,20 +261,20 @@
             configuration.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-PLCOpenClasses["project_fileHeader"].singleLineAttributes = False
-
-if "configurations_configuration" in PLCOpenClasses:
-    cls = PLCOpenClasses["configurations_configuration"]
-    
+cls = PLCOpenClasses.get("project_fileHeader", None)
+if cls:
+    cls.singleLineAttributes = False
+
+cls = PLCOpenClasses.get("configurations_configuration", None)
+if cls:
     def updateElementName(self, old_name, new_name):
         for resource in self.getResource():
             resource.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
 
-if "configuration_resource" in PLCOpenClasses:
-    cls = PLCOpenClasses["configuration_resource"]
-    
+cls = PLCOpenClasses.get("configuration_resource", None)
+if cls:
     def updateElementName(self, old_name, new_name):
         for instance in self.getPouInstance():
             instance.updateElementName(old_name, new_name)
@@ -273,9 +282,8 @@
             task.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "resource_task" in PLCOpenClasses:
-    cls = PLCOpenClasses["resource_task"]
-    
+cls = PLCOpenClasses.get("resource_task", None)
+if cls:
     def updateElementName(self, old_name, new_name):
         if self.single == old_name:
             self.single = new_name
@@ -283,17 +291,15 @@
             instance.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "pouInstance" in PLCOpenClasses:
-    cls = PLCOpenClasses["pouInstance"]
-    
+cls = PLCOpenClasses.get("pouInstance", None)
+if cls:
     def updateElementName(self, old_name, new_name):
         if self.type == old_name:
             self.type = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "project_types" in PLCOpenClasses:
-    cls = PLCOpenClasses["project_types"]
-
+cls = PLCOpenClasses.get("project_types", None)
+if cls:
     def getPouElements(self):
         return self.pous.getPou()
     setattr(cls, "getPouElements", getPouElements)
@@ -375,9 +381,8 @@
     return self.body.getText()
 setattr(cls, "getText", getText)
 
-if "pous_pou" in PLCOpenClasses:
-    cls = PLCOpenClasses["pous_pou"]
-
+cls = PLCOpenClasses.get("pous_pou", None)
+if cls:
     setattr(cls, "setBodyType", setBodyType)
     setattr(cls, "getBodyType", getBodyType)
     setattr(cls, "addInstance", addInstance)
@@ -405,6 +410,35 @@
             self.interface.appendContent(VarTypes[vartype], varlist)
     setattr(cls, "setVars", setVars)
     
+    def addPouVar(self, type, name):
+        content = self.interface.getContent()
+        if len(content) == 0 or content[-1]["name"] != "localVars":
+            self.interface.appendContent("localVars", PLCOpenClasses["varList"]())
+        var = PLCOpenClasses["varListPlain_variable"]()
+        var.setName(name)
+        var_type = PLCOpenClasses["dataType"]()
+        derived_type = PLCOpenClasses["derived"]()
+        derived_type.setName(type)
+        var_type.setValue(derived_type)
+        var.setType(var_type)
+        content[-1]["value"].appendVariable(var)
+    setattr(cls, "addPouVar", addPouVar)
+    
+    def removePouVar(self, type, name):
+        content = self.interface.getContent()
+        for varlist in content:
+            variables = varlist["value"].getVariable()
+            for var in variables:
+                if var.getName() == name:
+                    var_type = var.getType().getValue()
+                    if isinstance(var_type, PLCOpenClasses["derived"]) and var_type.getName() == type:
+                        variables.remove(var)
+                        break
+            if len(varlist["value"].getVariable()) == 0:
+                content.remove(varlist)
+                break
+    setattr(cls, "removePouVar", removePouVar)
+        
     def addTransition(self, name, type):
         if not self.transitions:
             self.addTransitions()
@@ -489,9 +523,8 @@
             transition.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "transitions_transition" in PLCOpenClasses:
-    cls = PLCOpenClasses["transitions_transition"]
-
+cls = PLCOpenClasses.get("transitions_transition", None)
+if cls:
     setattr(cls, "setBodyType", setBodyType)
     setattr(cls, "getBodyType", getBodyType)
     setattr(cls, "addInstance", addInstance)
@@ -507,9 +540,8 @@
         self.body.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "actions_action" in PLCOpenClasses:
-    cls = PLCOpenClasses["actions_action"]
-
+cls = PLCOpenClasses.get("actions_action", None)
+if cls:
     setattr(cls, "setBodyType", setBodyType)
     setattr(cls, "getBodyType", getBodyType)
     setattr(cls, "addInstance", addInstance)
@@ -525,9 +557,8 @@
         self.body.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "body" in PLCOpenClasses:
-    cls = PLCOpenClasses["body"]
-    
+cls = PLCOpenClasses.get("body", None)
+if cls:
     def appendContentInstance(self, name, instance):
         if self.content["name"] in ["LD","FBD","SFC"]:
             self.content["value"].appendContent(name, instance)
@@ -624,8 +655,8 @@
 def setY(self, y):
     self.position.setY(y)
 
-if "comment" in PLCOpenClasses:
-    cls = PLCOpenClasses["comment"]
+cls = PLCOpenClasses.get("comment", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -643,8 +674,8 @@
         self.content.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "block" in PLCOpenClasses:
-    cls = PLCOpenClasses["block"]
+cls = PLCOpenClasses.get("block", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -655,9 +686,8 @@
             self.typeName = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "inputVariables_variable" in PLCOpenClasses:
-    cls = PLCOpenClasses["inputVariables_variable"]
-
+cls = PLCOpenClasses.get("inputVariables_variable", None)
+if cls:
     def setConnectorEdge(self, edge):
         if not self.edge:
             self.edge = PLCOpenClasses["edgeModifierType"]()
@@ -670,9 +700,8 @@
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
 
-if "outputVariables_variable" in PLCOpenClasses:
-    cls = PLCOpenClasses["outputVariables_variable"]
-    
+cls = PLCOpenClasses.get("outputVariables_variable", None)
+if cls:
     def setConnectorEdge(self, edge):
         if not self.edge:
             self.edge = PLCOpenClasses["edgeModifierType"]()
@@ -685,8 +714,8 @@
         return None
     setattr(cls, "getConnectorEdge", getConnectorEdge)
 
-if "leftPowerRail" in PLCOpenClasses:
-    cls = PLCOpenClasses["leftPowerRail"]
+cls = PLCOpenClasses.get("leftPowerRail", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -696,8 +725,19 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "contact" in PLCOpenClasses:
-    cls = PLCOpenClasses["contact"]
+cls = PLCOpenClasses.get("rightPowerRail", None)
+if cls:
+    setattr(cls, "getX", getX)
+    setattr(cls, "getY", getY)
+    setattr(cls, "setX", setX)
+    setattr(cls, "setY", setY)
+    
+    def updateElementName(self, old_name, new_name):
+        pass
+    setattr(cls, "updateElementName", updateElementName)
+
+cls = PLCOpenClasses.get("contact", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -720,8 +760,8 @@
             self.variable = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "coil" in PLCOpenClasses:
-    cls = PLCOpenClasses["coil"]
+cls = PLCOpenClasses.get("coil", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -744,30 +784,19 @@
             self.variable = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "rightPowerRail" in PLCOpenClasses:
-    cls = PLCOpenClasses["rightPowerRail"]
-    setattr(cls, "getX", getX)
-    setattr(cls, "getY", getY)
-    setattr(cls, "setX", setX)
-    setattr(cls, "setY", setY)
-    
+cls = PLCOpenClasses.get("step", None)
+if cls:
+    setattr(cls, "getX", getX)
+    setattr(cls, "getY", getY)
+    setattr(cls, "setX", setX)
+    setattr(cls, "setY", setY)
+
     def updateElementName(self, old_name, new_name):
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "step" in PLCOpenClasses:
-    cls = PLCOpenClasses["step"]
-    setattr(cls, "getX", getX)
-    setattr(cls, "getY", getY)
-    setattr(cls, "setX", setX)
-    setattr(cls, "setY", setY)
-
-    def updateElementName(self, old_name, new_name):
-        pass
-    setattr(cls, "updateElementName", updateElementName)
-
-if "transition" in PLCOpenClasses:
-    cls = PLCOpenClasses["transition"]
+cls = PLCOpenClasses.get("transition", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -891,8 +920,8 @@
     
     setattr(cls, "addConnection", addConnection)    
 
-if "selectionDivergence" in PLCOpenClasses:
-    cls = PLCOpenClasses["selectionDivergence"]
+cls = PLCOpenClasses.get("selectionDivergence", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -902,8 +931,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "selectionConvergence" in PLCOpenClasses:
-    cls = PLCOpenClasses["selectionConvergence"]
+cls = PLCOpenClasses.get("selectionConvergence", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -913,8 +942,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
     
-if "simultaneousDivergence" in PLCOpenClasses:
-    cls = PLCOpenClasses["simultaneousDivergence"]
+cls = PLCOpenClasses.get("simultaneousDivergence", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -924,8 +953,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
     
-if "simultaneousDivergence" in PLCOpenClasses:
-    cls = PLCOpenClasses["simultaneousConvergence"]
+cls = PLCOpenClasses.get("simultaneousConvergence", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -935,8 +964,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "jumpStep" in PLCOpenClasses:
-    cls = PLCOpenClasses["jumpStep"]
+cls = PLCOpenClasses.get("jumpStep", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -946,10 +975,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-
-if "actionBlock_action" in PLCOpenClasses:
-    cls = PLCOpenClasses["actionBlock_action"]
-    
+cls = PLCOpenClasses.get("actionBlock_action", None)
+if cls:
     def setQualifierValue(self, value):
         if self.qualifier:
             self.qualifier.setValue(value)
@@ -991,8 +1018,8 @@
             self.inline.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "actionBlock" in PLCOpenClasses:
-    cls = PLCOpenClasses["actionBlock"]
+cls = PLCOpenClasses.get("actionBlock", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1043,8 +1070,8 @@
             action.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-if "inVariable" in PLCOpenClasses:
-    cls = PLCOpenClasses["inVariable"]
+cls = PLCOpenClasses.get("inVariable", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1067,8 +1094,8 @@
             self.expression = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "outVariable" in PLCOpenClasses:
-    cls = PLCOpenClasses["outVariable"]
+cls = PLCOpenClasses.get("outVariable", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1091,8 +1118,8 @@
             self.expression = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "inOutVariable" in PLCOpenClasses:
-    cls = PLCOpenClasses["inOutVariable"]
+cls = PLCOpenClasses.get("inOutVariable", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1127,8 +1154,8 @@
             self.expression = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-if "continuation" in PLCOpenClasses:
-    cls = PLCOpenClasses["continuation"]
+cls = PLCOpenClasses.get("continuation", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1138,8 +1165,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "connector" in PLCOpenClasses:
-    cls = PLCOpenClasses["connector"]
+cls = PLCOpenClasses.get("connector", None)
+if cls:
     setattr(cls, "getX", getX)
     setattr(cls, "getY", getY)
     setattr(cls, "setX", setX)
@@ -1149,9 +1176,8 @@
         pass
     setattr(cls, "updateElementName", updateElementName)
 
-if "connection" in PLCOpenClasses:
-    cls = PLCOpenClasses["connection"]
-    
+cls = PLCOpenClasses.get("connection", None)
+if cls:
     def setPoints(self, points):
         self.position = []
         for point in points:
@@ -1168,9 +1194,8 @@
         return points
     setattr(cls, "getPoints", getPoints)
 
-if "connectionPointIn" in PLCOpenClasses:
-    cls = PLCOpenClasses["connectionPointIn"]
-
+cls = PLCOpenClasses.get("connectionPointIn", None)
+if cls:
     def setRelPosition(self, x, y):
         self.relPosition = PLCOpenClasses["position"]()
         self.relPosition.setX(x)
@@ -1241,9 +1266,8 @@
         return None
     setattr(cls, "getConnectionParameter", getConnectionParameter)
 
-if "connectionPointOut" in PLCOpenClasses:
-    cls = PLCOpenClasses["connectionPointOut"]
-
+cls = PLCOpenClasses.get("connectionPointOut", None)
+if cls:
     def setRelPosition(self, x, y):
         self.relPosition = PLCOpenClasses["position"]()
         self.relPosition.setX(x)
@@ -1256,9 +1280,8 @@
         return self.relPosition
     setattr(cls, "getRelPosition", getRelPosition)
 
-if "value" in PLCOpenClasses:
-    cls = PLCOpenClasses["value"]
-    
+cls = PLCOpenClasses.get("value", None)
+if cls:
     def setValue(self, value):
         try:
             value = eval(value)
@@ -1287,9 +1310,8 @@
         return value
     setattr(cls, "getValue", getValue)
 
-if "value_arrayValue" in PLCOpenClasses:
-    cls = PLCOpenClasses["value_arrayValue"]
-    
+cls = PLCOpenClasses.get("value_arrayValue", None)
+if cls:
     def setValue(self, array):
         self.value = []
         for value in array:
@@ -1302,9 +1324,8 @@
         return [element.getValue() for element in self.value]
     setattr(cls, "getValue", getValue)
 
-if "value_structValue" in PLCOpenClasses:
-    cls = PLCOpenClasses["value_structValue"]
-    
+cls = PLCOpenClasses.get("value_structValue", None)
+if cls:
     def setValue(self, dict):
         self.value = []
         for name,value in dict.items():