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