PLCGenerator.py
changeset 2 93bc4c2cf376
parent 1 e9d01d824086
child 4 2de7fd952fdd
--- a/PLCGenerator.py	Thu Feb 01 18:09:34 2007 +0100
+++ b/PLCGenerator.py	Wed Feb 07 18:43:32 2007 +0100
@@ -41,7 +41,10 @@
         for i in xrange(spaces, nb_spaces):
             indent += " "
         for line in lines:
-            compute += "%s%s\n"%(indent, line)
+            if line != "":
+                compute += "%s%s\n"%(indent, line)
+            else:
+                compute += "\n"
     return compute
 
 """
@@ -175,6 +178,24 @@
             else:
                 return variable
 
+    def ExtractDivergenceInput(self, divergence, pou):
+        connectionPointIn = divergence.getConnectionPointIn()
+        if connectionPointIn:
+            connections = connectionPointIn.getConnections()
+            if len(connections) == 1:
+                instanceLocalId = connections[0].getRefLocalId()
+                return pou.body.getContentInstance(instanceLocalId)
+        return None
+
+    def ExtractConvergenceInputs(self, convergence, pou):
+        instances = []
+        for connectionPointIn in convergence.getConnectionPointIn():
+            connections = connectionPointIn.getConnections()
+            if len(connections) == 1:
+                instanceLocalId = connections[0].getRefLocalId()
+                instances.append(pou.body.getContentInstance(instanceLocalId))
+        return instances
+
     def GenerateSFCStep(self, step, pou):
         step_name = step.getName()
         if step_name not in self.SFCNetworks["Steps"].keys():
@@ -188,26 +209,18 @@
                     instanceLocalId = connections[0].getRefLocalId()
                     instance = pou.body.getContentInstance(instanceLocalId)
                     if isinstance(instance, plcopen.transition):
-                        self.GenerateSFCTransition(instance, pou)
                         instances.append(instance)
                     elif isinstance(instance, plcopen.selectionConvergence):
-                        for connectionPointIn in instance.getConnectionPointIn():
-                            divergence_connections = connectionPointIn.getConnections()
-                            if len(divergence_connections) == 1:
-                                transitionLocalId = connections[0].getRefLocalId()
-                                transition = pou.body.getContentInstance(transitionLocalId)
-                                self.GenerateSFCTransition(transition, pou)
+                        instances.extend(self.ExtractConvergenceInputs(instance, pou))
+                    elif isinstance(instance, plcopen.simultaneousDivergence):
+                        transition = self.ExtractDivergenceInput(instance, pou)
+                        if transition:
+                            if isinstance(transition, plcopen.transition):
                                 instances.append(transition)
-                    elif isinstance(instance, plcopen.simultaneousDivergence):
-                        connectionPointIn = instance.getConnectionPointIn()
-                        if connectionPointIn:
-                            divergence_connections = connectionPointIn.getConnections()
-                            if len(divergence_connections) == 1:
-                                transitionLocalId = connections[0].getRefLocalId()
-                                transition = pou.body.getContentInstance(transitionLocalId)
-                                self.GenerateSFCTransition(transition, pou)
-                                instances.append(transition)
+                            elif isinstance(transition, plcopen.selectionConvergence):
+                                instances.extend(self.ExtractConvergenceInputs(transition, pou))
                 for instance in instances:
+                    self.GenerateSFCTransition(instance, pou)
                     if instance in self.SFCNetworks["Transitions"].keys():
                         self.SFCNetworks["Transitions"][instance]["to"].append(step_name)
             self.SFCNetworks["Steps"][step_name] = step_infos
@@ -221,26 +234,18 @@
                 instanceLocalId = connections[0].getRefLocalId()
                 instance = pou.body.getContentInstance(instanceLocalId)
                 if isinstance(instance, plcopen.transition):
-                    self.GenerateSFCTransition(instance, pou)
                     instances.append(instance)
                 elif isinstance(instance, plcopen.selectionConvergence):
-                    for connectionPointIn in instance.getConnectionPointIn():
-                        divergence_connections = connectionPointIn.getConnections()
-                        if len(divergence_connections) == 1:
-                            transitionLocalId = divergence_connections[0].getRefLocalId()
-                            transition = pou.body.getContentInstance(transitionLocalId)
-                            self.GenerateSFCTransition(transition, pou)
+                    instances.extend(self.ExtractConvergenceInputs(instance, pou))
+                elif isinstance(instance, plcopen.simultaneousDivergence):
+                    transition = self.ExtractDivergenceInput(instance, pou)
+                    if transition:
+                        if isinstance(transition, plcopen.transition):
                             instances.append(transition)
-                elif isinstance(instance, plcopen.simultaneousDivergence):
-                    connectionPointIn = instance.getConnectionPointIn()
-                    if connectionPointIn:
-                        divergence_connections = connectionPointIn.getConnections()
-                        if len(divergence_connections) == 1:
-                            transitionLocalId = connections[0].getRefLocalId()
-                            transition = pou.body.getContentInstance(transitionLocalId)
-                            self.GenerateSFCTransition(transition, pou)
-                            instances.append(transition)
+                        elif isinstance(transition, plcopen.selectionConvergence):
+                            instances.extend(self.ExtractConvergenceInputs(transition, pou))
             for instance in instances:
+                self.GenerateSFCTransition(instance, pou)
                 if instance in self.SFCNetworks["Transitions"].keys():
                     self.SFCNetworks["Transitions"][instance]["to"].append(jump_target)
     
@@ -297,16 +302,16 @@
                 instanceLocalId = connections[0].getRefLocalId()
                 instance = pou.body.getContentInstance(instanceLocalId)
                 if isinstance(instance, plcopen.step):
-                    self.GenerateSFCStep(instance, pou)
-                    steps.append(instance.getName())
+                    steps.append(instance)
                 elif isinstance(instance, plcopen.selectionDivergence):
-                    divergence_connections = instance.connectionPointIn.getConnections()
-                    if len(divergence_connections) == 1:
-                        stepLocalId = divergence_connections[0].getRefLocalId()
-                        divergence_instance = pou.body.getContentInstance(stepLocalId)
-                        if isinstance(divergence_instance, plcopen.step):
-                            self.GenerateSFCStep(divergence_instance, pou)
-                            steps.append(divergence_instance.getName())
+                    step = self.ExtractDivergenceInput(instance, pou)
+                    if step:
+                        if isinstance(step, plcopen.step):
+                            steps.append(step)
+                        elif isinstance(step, plcopen.simultaneousConvergence):
+                            steps.extend(self.ExtractConvergenceInputs(step, pou))
+                elif isinstance(instance, plcopen.simultaneousConvergence):
+                    steps.extend(self.ExtractConvergenceInputs(instance, pou))
             transition_infos = {"from": [], "to" : []}
             transitionValues = transition.getConditionContent()
             if transitionValues["type"] == "inline":
@@ -316,9 +321,9 @@
                 transitionType = transitionContent.getBodyType()
                 transitionBody = transitionContent.getBody()
                 if transitionType == "IL":
-                    transition_infos["content"] = ":\n%s\n"%ReIndentText(transitionBody.getText(), 4)
+                    transition_infos["content"] = ":\n%s"%ReIndentText(transitionBody.getText(), 4)
                 elif transitionType == "ST":
-                    transition_infos["content"] = "\n%s\n"%ReIndentText(transitionBody.getText(), 4)
+                    transition_infos["content"] = "\n%s"%ReIndentText(transitionBody.getText(), 4)
                 elif conditionType == "FBD":
                     for instance in transitionBody.getContentInstances():
                         if isinstance(instance, plcopen.outVariable):
@@ -332,7 +337,9 @@
                             paths = self.GenerateLDPaths(instance, conditionBody)
                             expression = self.ComputeLDExpression(paths, True)
                             transition_infos["content"] = "\n    := %s;\n"%expression
-            for step_name in steps:
+            for step in steps:
+                self.GenerateSFCStep(step, pou)
+                step_name = step.getName()
                 if step_name in self.SFCNetworks["Steps"].keys():
                     transition_infos["from"].append(step_name)
                     self.SFCNetworks["Steps"][step_name]["transitions"].append(transition)