diff -r 5508af39d1f7 -r 34eff05909b0 PLCGenerator.py --- a/PLCGenerator.py Thu Sep 11 14:55:49 2008 +0200 +++ b/PLCGenerator.py Fri Sep 12 16:23:40 2008 +0200 @@ -61,6 +61,13 @@ compute += "\n" return compute +def SortInstances(a, b): + ax, ay = int(a.getx()), int(a.gety()) + bx, by = int(b.getx()), int(b.gety()) + if abs(ax - ay) < 10: + return ax.__cmp__(bx) + else: + return ay.__cmp__(by) #------------------------------------------------------------------------------- # Specific exception for PLC generating errors @@ -566,16 +573,19 @@ else: var_type = returntype_content["name"] elif var_type is None: - var_type = expression.split("#")[0] - if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable)): - for connection in self.ExtractRelatedConnections(instance.connectionPointOut): - self.ConnectionTypes[connection] = var_type - if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): - self.ConnectionTypes[instance.connectionPointIn] = var_type - connected = self.GetConnectedConnector(instance.connectionPointIn, body) - if connected and connected not in self.ConnectionTypes: - for connection in self.ExtractRelatedConnections(connected): + parts = expression.split("#") + if len(parts) > 1: + var_type = parts[0] + if var_type is not None: + if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable)): + for connection in self.ExtractRelatedConnections(instance.connectionPointOut): self.ConnectionTypes[connection] = var_type + if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): + self.ConnectionTypes[instance.connectionPointIn] = var_type + connected = self.GetConnectedConnector(instance.connectionPointIn, body) + if connected and connected not in self.ConnectionTypes: + for connection in self.ExtractRelatedConnections(connected): + self.ConnectionTypes[connection] = var_type elif isinstance(instance, (plcopen.ldObjects_contact, plcopen.ldObjects_coil)): for connection in self.ExtractRelatedConnections(instance.connectionPointOut): self.ConnectionTypes[connection] = "BOOL" @@ -607,17 +617,24 @@ undefined = {} for variable in instance.outputVariables.getvariable(): output_name = variable.getformalParameter() - for oname, otype, oqualifier in block_infos["outputs"]: - if output_name == oname and variable.connectionPointOut not in self.ConnectionTypes: - if otype.startswith("ANY"): - if otype not in undefined: - undefined[otype] = [] - undefined[otype].append(variable.connectionPointOut) - else: - for connection in self.ExtractRelatedConnections(variable.connectionPointOut): - self.ConnectionTypes[connection] = otype + if output_name == "ENO": + for connection in self.ExtractRelatedConnections(variable.connectionPointOut): + self.ConnectionTypes[connection] = "BOOL" + else: + for oname, otype, oqualifier in block_infos["outputs"]: + if output_name == oname and variable.connectionPointOut not in self.ConnectionTypes: + if otype.startswith("ANY"): + if otype not in undefined: + undefined[otype] = [] + undefined[otype].append(variable.connectionPointOut) + else: + for connection in self.ExtractRelatedConnections(variable.connectionPointOut): + self.ConnectionTypes[connection] = otype for variable in instance.inputVariables.getvariable(): input_name = variable.getformalParameter() + if input_name == "EN": + for connection in self.ExtractRelatedConnections(variable.connectionPointIn): + self.ConnectionTypes[connection] = "BOOL" for iname, itype, iqualifier in block_infos["inputs"]: if input_name == iname: connected = self.GetConnectedConnector(variable.connectionPointIn, body) @@ -673,24 +690,25 @@ for initialstep in self.InitialSteps: self.ComputeSFCStep(initialstep) else: + otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []} orderedInstances = [] - otherInstances = {"outVariables" : [], "block" : [], "connector" : [], "coil" : []} for instance in body.getcontentInstances(): if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)): executionOrderId = instance.getexecutionOrderId() if executionOrderId > 0: orderedInstances.append((executionOrderId, instance)) elif isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): - otherInstances["outVariables"].append(instance) + otherInstances["outVariables&coils"].append(instance) elif isinstance(instance, plcopen.fbdObjects_block): - otherInstances["block"].append(instance) + otherInstances["blocks"].append(instance) elif isinstance(instance, plcopen.commonObjects_connector): - otherInstances["connector"].append(instance) + otherInstances["connectors"].append(instance) elif isinstance(instance, plcopen.ldObjects_coil): - otherInstances["coil"].append(instance) + otherInstances["outVariables&coils"].append(instance) orderedInstances.sort() + otherInstances["outVariables&coils"].sort(SortInstances) instances = [instance for (executionOrderId, instance) in orderedInstances] - instances.extend(otherInstances["connector"] + otherInstances["outVariables"] + otherInstances["coil"] + otherInstances["block"]) + instances.extend(otherInstances["connectors"] + otherInstances["outVariables&coils"] + otherInstances["blocks"]) for instance in instances: if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): connections = instance.connectionPointIn.getconnections() @@ -714,12 +732,12 @@ elif isinstance(instance, plcopen.ldObjects_coil): connections = instance.connectionPointIn.getconnections() if connections is not None: - expression = self.ComputeExpression(body, connections) coil_info = (self.TagName, "coil", instance.getlocalId()) - variable = self.ExtractModifier(instance, [(instance.getvariable(), coil_info + ("reference",))], coil_info) - self.Program += [(self.CurrentIndent, ())] + variable + expression = self.ExtractModifier(instance, self.ComputeExpression(body, connections), coil_info) + self.Program += [(self.CurrentIndent, ())] + self.Program += [(instance.getvariable(), coil_info + ("reference",))] self.Program += [(" := ", ())] + expression + [(";\n", ())] - + def FactorizePaths(self, paths): same_paths = {} uncomputed_index = range(len(paths)) @@ -829,6 +847,14 @@ if variable.getnegated(): return [("NOT(", var_info + ("negated",))] + expression + [(")", ())] else: + storage = variable.getstorage() + if storage in ["set", "reset"]: + self.Program += [(self.CurrentIndent + "IF ", var_info + (storage,))] + expression + self.Program += [(" THEN\n ", ())] + if storage == "set": + return [("TRUE;\n" + self.CurrentIndent + "END_IF", ())] + else: + return [("FALSE;\n" + self.CurrentIndent + "END_IF", ())] edge = variable.getedge() if edge == "rising": return self.AddTrigger("R_TRIG", expression, var_info + ("rising",))