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"] |