473 body_type = body_content["name"] |
473 body_type = body_content["name"] |
474 if body_type in ["IL","ST"]: |
474 if body_type in ["IL","ST"]: |
475 self.Program = ReIndentText(body_content["value"].gettext(), 2) |
475 self.Program = ReIndentText(body_content["value"].gettext(), 2) |
476 elif body_type == "FBD": |
476 elif body_type == "FBD": |
477 orderedInstances = [] |
477 orderedInstances = [] |
478 otherInstances = [] |
478 otherInstances = {"outVariables" : [], "block" : [], "connector" : []} |
479 for instance in body.getcontentInstances(): |
479 for instance in body.getcontentInstances(): |
480 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)): |
480 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)): |
481 executionOrderId = instance.getexecutionOrderId() |
481 executionOrderId = instance.getexecutionOrderId() |
482 if executionOrderId > 0: |
482 if executionOrderId > 0: |
483 orderedInstances.append((executionOrderId, instance)) |
483 orderedInstances.append((executionOrderId, instance)) |
484 else: |
484 elif isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
485 otherInstances.append(instance) |
485 otherInstances["outVariables"].append(instance) |
|
486 elif isinstance(instance, plcopen.fbdObjects_block): |
|
487 otherInstances["block"].append(instance) |
486 elif isinstance(instance, plcopen.commonObjects_connector): |
488 elif isinstance(instance, plcopen.commonObjects_connector): |
487 otherInstances.append(instance) |
489 otherInstances["connector"].append(instance) |
488 orderedInstances.sort() |
490 orderedInstances.sort() |
489 instances = [instance for (executionOrderId, instance) in orderedInstances] + otherInstances |
491 instances = [instance for (executionOrderId, instance) in orderedInstances] |
|
492 instances.extend(otherInstances["connector"] + otherInstances["outVariables"] + otherInstances["block"]) |
490 for instance in instances: |
493 for instance in instances: |
491 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
494 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
492 var = instance.getexpression() |
495 var = instance.getexpression() |
493 connections = instance.connectionPointIn.getconnections() |
496 connections = instance.connectionPointIn.getconnections() |
494 if connections and len(connections) == 1: |
497 if connections and len(connections) == 1: |
608 |
611 |
609 def ExtractDivergenceInput(self, divergence, pou): |
612 def ExtractDivergenceInput(self, divergence, pou): |
610 connectionPointIn = divergence.getconnectionPointIn() |
613 connectionPointIn = divergence.getconnectionPointIn() |
611 if connectionPointIn: |
614 if connectionPointIn: |
612 connections = connectionPointIn.getconnections() |
615 connections = connectionPointIn.getconnections() |
613 if len(connections) == 1: |
616 if connections is not None and len(connections) == 1: |
614 instanceLocalId = connections[0].getrefLocalId() |
617 instanceLocalId = connections[0].getrefLocalId() |
615 return pou.body.getcontentInstance(instanceLocalId) |
618 return pou.body.getcontentInstance(instanceLocalId) |
616 return None |
619 return None |
617 |
620 |
618 def ExtractConvergenceInputs(self, convergence, pou): |
621 def ExtractConvergenceInputs(self, convergence, pou): |
677 if instance in self.SFCNetworks["Transitions"].keys(): |
680 if instance in self.SFCNetworks["Transitions"].keys(): |
678 self.SFCNetworks["Transitions"][instance]["to"].append(jump_target) |
681 self.SFCNetworks["Transitions"][instance]["to"].append(jump_target) |
679 |
682 |
680 def GenerateSFCStepActions(self, actionBlock, pou): |
683 def GenerateSFCStepActions(self, actionBlock, pou): |
681 connections = actionBlock.connectionPointIn.getconnections() |
684 connections = actionBlock.connectionPointIn.getconnections() |
682 if len(connections) == 1: |
685 if connections is not None and len(connections) == 1: |
683 stepLocalId = connections[0].getrefLocalId() |
686 stepLocalId = connections[0].getrefLocalId() |
684 step = pou.body.getcontentInstance(stepLocalId) |
687 step = pou.body.getcontentInstance(stepLocalId) |
685 self.GenerateSFCStep(step, pou) |
688 self.GenerateSFCStep(step, pou) |
686 step_name = step.getname() |
689 step_name = step.getname() |
687 if step_name in self.SFCNetworks["Steps"].keys(): |
690 if step_name in self.SFCNetworks["Steps"].keys(): |
730 |
733 |
731 def GenerateSFCTransition(self, transition, pou): |
734 def GenerateSFCTransition(self, transition, pou): |
732 if transition not in self.SFCNetworks["Transitions"].keys(): |
735 if transition not in self.SFCNetworks["Transitions"].keys(): |
733 steps = [] |
736 steps = [] |
734 connections = transition.connectionPointIn.getconnections() |
737 connections = transition.connectionPointIn.getconnections() |
735 if len(connections) == 1: |
738 if connections is not None and len(connections) == 1: |
736 instanceLocalId = connections[0].getrefLocalId() |
739 instanceLocalId = connections[0].getrefLocalId() |
737 instance = pou.body.getcontentInstance(instanceLocalId) |
740 instance = pou.body.getcontentInstance(instanceLocalId) |
738 if isinstance(instance, plcopen.sfcObjects_step): |
741 if isinstance(instance, plcopen.sfcObjects_step): |
739 steps.append(instance) |
742 steps.append(instance) |
740 elif isinstance(instance, plcopen.sfcObjects_selectionDivergence): |
743 elif isinstance(instance, plcopen.sfcObjects_selectionDivergence): |
834 if transition_infos["priority"] != None: |
837 if transition_infos["priority"] != None: |
835 self.Program += " (PRIORITY := %d)"%transition_infos["priority"] |
838 self.Program += " (PRIORITY := %d)"%transition_infos["priority"] |
836 self.Program += " FROM " |
839 self.Program += " FROM " |
837 if len(transition_infos["from"]) > 1: |
840 if len(transition_infos["from"]) > 1: |
838 self.Program += "(%s)"%", ".join(transition_infos["from"]) |
841 self.Program += "(%s)"%", ".join(transition_infos["from"]) |
839 else: |
842 elif len(transition_infos["from"]) == 1: |
840 self.Program += "%s"%transition_infos["from"][0] |
843 self.Program += "%s"%transition_infos["from"][0] |
|
844 else: |
|
845 raise PLCGenException, "Not connected transition" |
841 self.Program += " TO " |
846 self.Program += " TO " |
842 if len(transition_infos["to"]) > 1: |
847 if len(transition_infos["to"]) > 1: |
843 self.Program += "(%s)"%", ".join(transition_infos["to"]) |
848 self.Program += "(%s)"%", ".join(transition_infos["to"]) |
844 else: |
849 elif len(transition_infos["to"]) == 1: |
845 self.Program += "%s"%transition_infos["to"][0] |
850 self.Program += "%s"%transition_infos["to"][0] |
|
851 else: |
|
852 raise PLCGenException, "Not connected transition" |
846 self.Program += transition_infos["content"] |
853 self.Program += transition_infos["content"] |
847 self.Program += " END_TRANSITION\n\n" |
854 self.Program += " END_TRANSITION\n\n" |
848 for step_name in transition_infos["to"]: |
855 for step_name in transition_infos["to"]: |
849 self.ComputeSFCStep(step_name) |
856 self.ComputeSFCStep(step_name) |
850 |
857 |