# HG changeset patch # User lbessard # Date 1186675614 -7200 # Node ID fd138fc7751023b5f0c3a768ce5cbb4d12d9b19c # Parent cb6bed0720f0538af5ed5bc4a97bd0e972409b08 Adding support for generating network and rung connected to transitions into SFC diff -r cb6bed0720f0 -r fd138fc77510 PLCGenerator.py --- a/PLCGenerator.py Wed Aug 08 14:55:39 2007 +0200 +++ b/PLCGenerator.py Thu Aug 09 18:06:54 2007 +0200 @@ -115,7 +115,7 @@ elif body_type == "LD": for instance in body.getContentInstances(): if isinstance(instance, plcopen.coil): - paths = self.GenerateLDPaths(instance, body) + paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), body) variable = self.ExtractModifier(instance, instance.getVariable()) expression = self.ComputeLDExpression(paths, True) self.Program += " %s := %s;\n"%(variable, expression) @@ -129,6 +129,14 @@ self.GenerateSFCTransition(instance, pou) elif isinstance(instance, plcopen.jumpStep): self.GenerateSFCJump(instance, pou) + if len(self.InitialSteps) > 0: + action_name = "COMPUTE_FUNCTION_BLOCKS" + action_infos = {"qualifier" : "S", "content" : action_name} + self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) + self.SFCNetworks["Actions"][action_name] = ReIndentText(self.Program, 4) + self.Program = "" + else: + raise Exception for initialstep in self.InitialSteps: self.ComputeSFCStep(initialstep) @@ -170,32 +178,46 @@ return self.ExtractModifier(variable, "%s.%s"%(name, variable.getFormalParameter())) raise ValueError, "No output variable found" - def GenerateLDPaths(self, instance, body): + def GenerateLDPaths(self, connections, body): paths = [] - variable = self.ExtractModifier(instance, instance.getVariable()) - connections = instance.connectionPointIn.getConnections() for connection in connections: localId = connection.getRefLocalId() next = body.getContentInstance(localId) if isinstance(next, plcopen.leftPowerRail): paths.append(None) else: - paths.append(self.GenerateLDPaths(next, body)) - if isinstance(instance, plcopen.coil): - if len(paths) > 1: - return tuple(paths) - else: - return paths - else: - if len(paths) > 1: - return [variable, tuple(paths)] - elif type(paths[0]) == ListType: - return [variable] + paths[0] - elif paths[0]: - return [variable, paths[0]] - else: - return variable - + variable = self.ExtractModifier(next, next.getVariable()) + result = self.GenerateLDPaths(next.connectionPointIn.getConnections(), body) + if len(result) > 1: + paths.append([variable, tuple(result)]) + elif type(result[0]) == ListType: + paths.append([variable] + result[0]) + elif result[0]: + paths.append([variable, result[0]]) + else: + paths.append(variable) + return paths + + def GetNetworkType(self, connections, body): + network_type = "FBD" + for connection in connections: + localId = connection.getRefLocalId() + next = body.getContentInstance(localId) + if isinstance(next, plcopen.leftPowerRail) or isinstance(next, plcopen.contact): + return "LD" + elif isinstance(next, plcopen.block): + for variable in instance.inputVariables.getVariable(): + result = self.GetNetworkType(variable.connectionPointIn.getConnections(), body) + if result != "FBD": + return result + elif isinstance(next, plcopen.inVariable): + return "FBD" + elif isinstance(next, plcopen.inOutVariable): + return self.GetNetworkType(next.connectionPointIn.getConnections(), body) + else: + return None + return "FBD" + def ExtractDivergenceInput(self, divergence, pou): connectionPointIn = divergence.getConnectionPointIn() if connectionPointIn: @@ -310,7 +332,7 @@ elif actionType == "LD": for instance in actionbody.getContentInstances(): if isinstance(instance, plcopen.coil): - paths = self.GenerateLDPaths(instance, actionBody) + paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), actionBody) variable = self.ExtractModifier(instance, instance.getVariable()) expression = self.ComputeLDExpression(paths, True) self.SFCNetworks["Actions"][action_name] = self.Program + " %s := %s;\n"%(variable, expression) @@ -338,7 +360,7 @@ transitionValues = transition.getConditionContent() if transitionValues["type"] == "inline": transition_infos["content"] = "\n := %s;\n"%transitionValues["value"] - else: + elif transitionValues["type"] == "reference": transitionContent = pou.getTransition(transitionValues["value"]) transitionType = transitionContent.getBodyType() transitionBody = transitionContent.getBody() @@ -346,19 +368,32 @@ transition_infos["content"] = ":\n%s"%ReIndentText(transitionBody.getText(), 4) elif transitionType == "ST": transition_infos["content"] = "\n%s"%ReIndentText(transitionBody.getText(), 4) - elif conditionType == "FBD": + elif transitionType == "FBD": for instance in transitionBody.getContentInstances(): if isinstance(instance, plcopen.outVariable): connections = instance.connectionPointIn.getConnections() if connections and len(connections) == 1: - expression = self.ComputeFBDExpression(actionBody, connections[0]) - transition_infos["content"] = "\n := %s;\n"%(var, expression) - elif actionType == "LD": - for instance in transitionbody.getContentInstances(): + expression = self.ComputeFBDExpression(transitionBody, connections[0]) + transition_infos["content"] = "\n := %s;\n"%expression + elif transitionType == "LD": + for instance in transitionBody.getContentInstances(): if isinstance(instance, plcopen.coil): - paths = self.GenerateLDPaths(instance, conditionBody) + paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), transitionBody) expression = self.ComputeLDExpression(paths, True) transition_infos["content"] = "\n := %s;\n"%expression + elif transitionValues["type"] == "connection": + body = pou.getBody() + connections = transition.getConnections() + network_type = self.GetNetworkType(connections, body) + if network_type == None: + raise Exception + if len(connections) > 1 or network_type == "LD": + paths = self.GenerateLDPaths(connections, body) + expression = self.ComputeLDExpression(paths, True) + transition_infos["content"] = "\n := %s;\n"%expression + else: + expression = self.ComputeFBDExpression(body, connections[0]) + transition_infos["content"] = "\n := %s;\n"%expression for step in steps: self.GenerateSFCStep(step, pou) step_name = step.getName()