--- 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():