PLCGenerator.py
changeset 269 34eff05909b0
parent 261 6fe3ee00f9a0
child 273 5b18d98aa4f9
--- 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",))