plcopen/plcopen.py
changeset 118 0c53d6a36013
parent 108 9aa1fdfb7cb2
child 125 394d9f168258
--- 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)