plcopen/plcopen.py
changeset 118 0c53d6a36013
parent 108 9aa1fdfb7cb2
child 125 394d9f168258
equal deleted inserted replaced
117:bbe0697cf1ea 118:0c53d6a36013
   347         raise ValueError, "%s isn't a valid body type!"%type
   347         raise ValueError, "%s isn't a valid body type!"%type
   348         
   348         
   349 def getBodyType(self):
   349 def getBodyType(self):
   350     return self.body.getContent()["name"]
   350     return self.body.getContent()["name"]
   351 
   351 
       
   352 def resetExecutionOrder(self):
       
   353     self.body.resetExecutionOrder()
       
   354 
       
   355 def compileExecutionOrder(self):
       
   356     self.body.compileExecutionOrder()
       
   357 
       
   358 def setElementExecutionOrder(self, instance, new_executionOrder):
       
   359     self.body.setElementExecutionOrder(instance, new_executionOrder)
       
   360 
   352 def addInstance(self, name, instance):
   361 def addInstance(self, name, instance):
   353     self.body.appendContentInstance(name, instance)
   362     self.body.appendContentInstance(name, instance)
   354 
   363 
   355 def getInstances(self):
   364 def getInstances(self):
   356     return self.body.getContentInstances()
   365     return self.body.getContentInstances()
   376 
   385 
   377 cls = PLCOpenClasses.get("pous_pou", None)
   386 cls = PLCOpenClasses.get("pous_pou", None)
   378 if cls:
   387 if cls:
   379     setattr(cls, "setBodyType", setBodyType)
   388     setattr(cls, "setBodyType", setBodyType)
   380     setattr(cls, "getBodyType", getBodyType)
   389     setattr(cls, "getBodyType", getBodyType)
       
   390     setattr(cls, "resetExecutionOrder", resetExecutionOrder)
       
   391     setattr(cls, "compileExecutionOrder", compileExecutionOrder)
       
   392     setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
   381     setattr(cls, "addInstance", addInstance)
   393     setattr(cls, "addInstance", addInstance)
   382     setattr(cls, "getInstances", getInstances)
   394     setattr(cls, "getInstances", getInstances)
   383     setattr(cls, "getInstance", getInstance)
   395     setattr(cls, "getInstance", getInstance)
   384     setattr(cls, "getRandomInstance", getRandomInstance)
   396     setattr(cls, "getRandomInstance", getRandomInstance)
   385     setattr(cls, "getInstanceByName", getInstanceByName)
   397     setattr(cls, "getInstanceByName", getInstanceByName)
   554 
   566 
   555 cls = PLCOpenClasses.get("transitions_transition", None)
   567 cls = PLCOpenClasses.get("transitions_transition", None)
   556 if cls:
   568 if cls:
   557     setattr(cls, "setBodyType", setBodyType)
   569     setattr(cls, "setBodyType", setBodyType)
   558     setattr(cls, "getBodyType", getBodyType)
   570     setattr(cls, "getBodyType", getBodyType)
       
   571     setattr(cls, "resetExecutionOrder", resetExecutionOrder)
       
   572     setattr(cls, "compileExecutionOrder", compileExecutionOrder)
       
   573     setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
   559     setattr(cls, "addInstance", addInstance)
   574     setattr(cls, "addInstance", addInstance)
   560     setattr(cls, "getInstances", getInstances)
   575     setattr(cls, "getInstances", getInstances)
   561     setattr(cls, "getInstance", getInstance)
   576     setattr(cls, "getInstance", getInstance)
   562     setattr(cls, "getRandomInstance", getRandomInstance)
   577     setattr(cls, "getRandomInstance", getRandomInstance)
   563     setattr(cls, "getInstanceByName", getInstanceByName)
   578     setattr(cls, "getInstanceByName", getInstanceByName)
   579 
   594 
   580 cls = PLCOpenClasses.get("actions_action", None)
   595 cls = PLCOpenClasses.get("actions_action", None)
   581 if cls:
   596 if cls:
   582     setattr(cls, "setBodyType", setBodyType)
   597     setattr(cls, "setBodyType", setBodyType)
   583     setattr(cls, "getBodyType", getBodyType)
   598     setattr(cls, "getBodyType", getBodyType)
       
   599     setattr(cls, "resetExecutionOrder", resetExecutionOrder)
       
   600     setattr(cls, "compileExecutionOrder", compileExecutionOrder)
       
   601     setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
   584     setattr(cls, "addInstance", addInstance)
   602     setattr(cls, "addInstance", addInstance)
   585     setattr(cls, "getInstances", getInstances)
   603     setattr(cls, "getInstances", getInstances)
   586     setattr(cls, "getInstance", getInstance)
   604     setattr(cls, "getInstance", getInstance)
   587     setattr(cls, "getRandomInstance", getRandomInstance)
   605     setattr(cls, "getRandomInstance", getRandomInstance)
   588     setattr(cls, "getInstanceByName", getInstanceByName)
   606     setattr(cls, "getInstanceByName", getInstanceByName)
   602         return False
   620         return False
   603     setattr(cls, "hasBlock", hasBlock)
   621     setattr(cls, "hasBlock", hasBlock)
   604 
   622 
   605 cls = PLCOpenClasses.get("body", None)
   623 cls = PLCOpenClasses.get("body", None)
   606 if cls:
   624 if cls:
       
   625     cls.currentExecutionOrderId = 0
       
   626     
       
   627     def resetCurrentExecutionOrderId(self):
       
   628         self.currentExecutionOrderId = 0
       
   629     setattr(cls, "resetCurrentExecutionOrderId", resetCurrentExecutionOrderId)
       
   630     
       
   631     def getNewExecutionOrderId(self):
       
   632         self.currentExecutionOrderId += 1
       
   633         return self.currentExecutionOrderId
       
   634     setattr(cls, "getNewExecutionOrderId", getNewExecutionOrderId)
       
   635     
       
   636     def resetExecutionOrder(self):
       
   637         if self.content["name"] == "FBD":
       
   638             for element in self.content["value"].getContent():
       
   639                 if not isinstance(element["value"], (PLCOpenClasses.get("comment", None), PLCOpenClasses.get("connector", None), PLCOpenClasses.get("continuation", None))):
       
   640                     element["value"].setExecutionOrderId(0)
       
   641         else:
       
   642             raise TypeError, "Can only generate execution order on FBD networks!"
       
   643     setattr(cls, "resetExecutionOrder", resetExecutionOrder)
       
   644     
       
   645     def compileExecutionOrder(self):
       
   646         if self.content["name"] == "FBD":
       
   647             self.resetExecutionOrder()
       
   648             self.resetCurrentExecutionOrderId()
       
   649             for element in self.content["value"].getContent():
       
   650                 if isinstance(element["value"], PLCOpenClasses.get("outVariable", None)) and element["value"].getExecutionOrderId() == 0:
       
   651                     connections = element["value"].connectionPointIn.getConnections()
       
   652                     if connections and len(connections) == 1:
       
   653                         self.compileElementExecutionOrder(connections[0])
       
   654                     element["value"].setExecutionOrderId(self.getNewExecutionOrderId())
       
   655         else:
       
   656             raise TypeError, "Can only generate execution order on FBD networks!"
       
   657     setattr(cls, "compileExecutionOrder", compileExecutionOrder)
       
   658     
       
   659     def compileElementExecutionOrder(self, link):
       
   660         if self.content["name"] == "FBD":
       
   661             localid = link.getRefLocalId()
       
   662             instance = self.getContentInstance(localid)
       
   663             if isinstance(instance, PLCOpenClasses.get("block", None)) and instance.getExecutionOrderId() == 0:
       
   664                 for variable in instance.inputVariables.getVariable():
       
   665                     connections = variable.connectionPointIn.getConnections()
       
   666                     if connections and len(connections) == 1:
       
   667                         self.compileElementExecutionOrder(connections[0])
       
   668                 instance.setExecutionOrderId(self.getNewExecutionOrderId())
       
   669             elif isinstance(instance, PLCOpenClasses.get("continuation", None)) and instance.getExecutionOrderId() == 0:
       
   670                 name = instance.getName()
       
   671                 for tmp_instance in self.getContentInstances():
       
   672                     if isinstance(tmp_instance, PLCOpenClasses.get("connector", None)) and tmp_instance.getName() == name and tmp_instance.getExecutionOrderId() == 0:
       
   673                         connections = tmp_instance.connectionPointIn.getConnections()
       
   674                         if connections and len(connections) == 1:
       
   675                             self.compileElementExecutionOrder(connections[0])
       
   676         else:
       
   677             raise TypeError, "Can only generate execution order on FBD networks!"
       
   678     setattr(cls, "compileElementExecutionOrder", compileElementExecutionOrder)
       
   679     
       
   680     def setElementExecutionOrder(self, instance, new_executionOrder):
       
   681         if self.content["name"] == "FBD":
       
   682             old_executionOrder = instance.getExecutionOrderId()
       
   683             if old_executionOrder is not None and old_executionOrder != 0 and new_executionOrder != 0:
       
   684                 for element in self.content["value"].getContent():
       
   685                     if element["value"] != instance and not isinstance(element["value"], PLCOpenClasses.get("comment", None)):
       
   686                         element_executionOrder = element["value"].getExecutionOrderId()
       
   687                         if old_executionOrder <= element_executionOrder <= new_executionOrder:
       
   688                             element["value"].setExecutionOrderId(element_executionOrder - 1)
       
   689                         if new_executionOrder <= element_executionOrder <= old_executionOrder:
       
   690                             element["value"].setExecutionOrderId(element_executionOrder + 1)
       
   691             instance.setExecutionOrderId(new_executionOrder)
       
   692         else:
       
   693             raise TypeError, "Can only generate execution order on FBD networks!"
       
   694     setattr(cls, "setElementExecutionOrder", setElementExecutionOrder)
       
   695     
   607     def appendContentInstance(self, name, instance):
   696     def appendContentInstance(self, name, instance):
   608         if self.content["name"] in ["LD","FBD","SFC"]:
   697         if self.content["name"] in ["LD","FBD","SFC"]:
   609             self.content["value"].appendContent(name, instance)
   698             self.content["value"].appendContent(name, instance)
   610         else:
   699         else:
   611             raise TypeError, "%s body don't have instances!"%self.content["name"]
   700             raise TypeError, "%s body don't have instances!"%self.content["name"]