diff -r e9d01d824086 -r 93bc4c2cf376 PLCGenerator.py --- 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)