--- 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)