--- a/plcopen/plcopen.py Fri Oct 26 17:04:18 2007 +0200
+++ b/plcopen/plcopen.py Tue Oct 30 16:53:08 2007 +0100
@@ -349,6 +349,15 @@
def getBodyType(self):
return self.body.getContent()["name"]
+def resetExecutionOrder(self):
+ self.body.resetExecutionOrder()
+
+def compileExecutionOrder(self):
+ self.body.compileExecutionOrder()
+
+def setElementExecutionOrder(self, instance, new_executionOrder):
+ self.body.setElementExecutionOrder(instance, new_executionOrder)
+
def addInstance(self, name, instance):
self.body.appendContentInstance(name, instance)
@@ -378,6 +387,9 @@
if cls:
setattr(cls, "setBodyType", setBodyType)
setattr(cls, "getBodyType", getBodyType)
+ setattr(cls, "resetExecutionOrder", resetExecutionOrder)
+ setattr(cls, "compileExecutionOrder", compileExecutionOrder)
+ setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
setattr(cls, "addInstance", addInstance)
setattr(cls, "getInstances", getInstances)
setattr(cls, "getInstance", getInstance)
@@ -556,6 +568,9 @@
if cls:
setattr(cls, "setBodyType", setBodyType)
setattr(cls, "getBodyType", getBodyType)
+ setattr(cls, "resetExecutionOrder", resetExecutionOrder)
+ setattr(cls, "compileExecutionOrder", compileExecutionOrder)
+ setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
setattr(cls, "addInstance", addInstance)
setattr(cls, "getInstances", getInstances)
setattr(cls, "getInstance", getInstance)
@@ -581,6 +596,9 @@
if cls:
setattr(cls, "setBodyType", setBodyType)
setattr(cls, "getBodyType", getBodyType)
+ setattr(cls, "resetExecutionOrder", resetExecutionOrder)
+ setattr(cls, "compileExecutionOrder", compileExecutionOrder)
+ setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
setattr(cls, "addInstance", addInstance)
setattr(cls, "getInstances", getInstances)
setattr(cls, "getInstance", getInstance)
@@ -604,6 +622,77 @@
cls = PLCOpenClasses.get("body", None)
if cls:
+ cls.currentExecutionOrderId = 0
+
+ def resetCurrentExecutionOrderId(self):
+ self.currentExecutionOrderId = 0
+ setattr(cls, "resetCurrentExecutionOrderId", resetCurrentExecutionOrderId)
+
+ def getNewExecutionOrderId(self):
+ self.currentExecutionOrderId += 1
+ return self.currentExecutionOrderId
+ setattr(cls, "getNewExecutionOrderId", getNewExecutionOrderId)
+
+ def resetExecutionOrder(self):
+ if self.content["name"] == "FBD":
+ for element in self.content["value"].getContent():
+ if not isinstance(element["value"], (PLCOpenClasses.get("comment", None), PLCOpenClasses.get("connector", None), PLCOpenClasses.get("continuation", None))):
+ element["value"].setExecutionOrderId(0)
+ else:
+ raise TypeError, "Can only generate execution order on FBD networks!"
+ setattr(cls, "resetExecutionOrder", resetExecutionOrder)
+
+ def compileExecutionOrder(self):
+ if self.content["name"] == "FBD":
+ self.resetExecutionOrder()
+ self.resetCurrentExecutionOrderId()
+ for element in self.content["value"].getContent():
+ if isinstance(element["value"], PLCOpenClasses.get("outVariable", None)) and element["value"].getExecutionOrderId() == 0:
+ connections = element["value"].connectionPointIn.getConnections()
+ if connections and len(connections) == 1:
+ self.compileElementExecutionOrder(connections[0])
+ element["value"].setExecutionOrderId(self.getNewExecutionOrderId())
+ else:
+ raise TypeError, "Can only generate execution order on FBD networks!"
+ setattr(cls, "compileExecutionOrder", compileExecutionOrder)
+
+ def compileElementExecutionOrder(self, link):
+ if self.content["name"] == "FBD":
+ localid = link.getRefLocalId()
+ instance = self.getContentInstance(localid)
+ if isinstance(instance, PLCOpenClasses.get("block", None)) and instance.getExecutionOrderId() == 0:
+ for variable in instance.inputVariables.getVariable():
+ connections = variable.connectionPointIn.getConnections()
+ if connections and len(connections) == 1:
+ self.compileElementExecutionOrder(connections[0])
+ instance.setExecutionOrderId(self.getNewExecutionOrderId())
+ elif isinstance(instance, PLCOpenClasses.get("continuation", None)) and instance.getExecutionOrderId() == 0:
+ name = instance.getName()
+ for tmp_instance in self.getContentInstances():
+ if isinstance(tmp_instance, PLCOpenClasses.get("connector", None)) and tmp_instance.getName() == name and tmp_instance.getExecutionOrderId() == 0:
+ connections = tmp_instance.connectionPointIn.getConnections()
+ if connections and len(connections) == 1:
+ self.compileElementExecutionOrder(connections[0])
+ else:
+ raise TypeError, "Can only generate execution order on FBD networks!"
+ setattr(cls, "compileElementExecutionOrder", compileElementExecutionOrder)
+
+ def setElementExecutionOrder(self, instance, new_executionOrder):
+ if self.content["name"] == "FBD":
+ old_executionOrder = instance.getExecutionOrderId()
+ if old_executionOrder is not None and old_executionOrder != 0 and new_executionOrder != 0:
+ for element in self.content["value"].getContent():
+ if element["value"] != instance and not isinstance(element["value"], PLCOpenClasses.get("comment", None)):
+ element_executionOrder = element["value"].getExecutionOrderId()
+ if old_executionOrder <= element_executionOrder <= new_executionOrder:
+ element["value"].setExecutionOrderId(element_executionOrder - 1)
+ if new_executionOrder <= element_executionOrder <= old_executionOrder:
+ element["value"].setExecutionOrderId(element_executionOrder + 1)
+ instance.setExecutionOrderId(new_executionOrder)
+ else:
+ raise TypeError, "Can only generate execution order on FBD networks!"
+ setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
+
def appendContentInstance(self, name, instance):
if self.content["name"] in ["LD","FBD","SFC"]:
self.content["value"].appendContent(name, instance)