PLCGenerator.py
changeset 483 779a519f78f2
parent 408 0e389fa5b160
child 499 cecb4369fa42
--- a/PLCGenerator.py	Thu Dec 10 12:26:06 2009 +0100
+++ b/PLCGenerator.py	Thu Dec 10 16:37:11 2009 +0100
@@ -249,10 +249,12 @@
         for varlist in configuration.getglobalVars():
             # Generate variable block with modifier
             config += [("  VAR_GLOBAL", ())]
-            if varlist.getretain():
-                config += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
             if varlist.getconstant():
                 config += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
+            elif varlist.getretain():
+                config += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
+            elif varlist.getretain():
+                config += [(" NON_RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
             config += [("\n", ())]
             # Generate any variable of this block
             for var in varlist.getvariable():
@@ -302,10 +304,12 @@
         for varlist in resource.getglobalVars():
             # Generate variable block with modifier
             resrce += [("    VAR_GLOBAL", ())]
-            if varlist.getretain():
-                resrce += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
             if varlist.getconstant():
                 resrce += [(" CONSTANT", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "constant"))]
+            elif varlist.getretain():
+                resrce += [(" RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "retain"))]
+            elif varlist.getnonretain():
+                resrce += [(" NON_RETAIN", (tagname, "variable", (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
             resrce += [("\n", ())]
             # Generate any variable of this block
             for var in varlist.getvariable():
@@ -471,7 +475,7 @@
     
     # Test if a variable has already been defined
     def IsAlreadyDefined(self, name):
-        for list_type, retain, constant, located, vars in self.Interface:
+        for list_type, option, located, vars in self.Interface:
             for var_type, var_name, var_address, var_initial in vars:
                 if name == var_name:
                     return True
@@ -479,7 +483,7 @@
     
     # Return the type of a variable defined in interface
     def GetVariableType(self, name):
-        for list_type, retain, constant, located, vars in self.Interface:
+        for list_type, option, located, vars in self.Interface:
             for var_type, var_name, var_address, var_initial in vars:
                 if name == var_name:
                     return var_type
@@ -592,12 +596,18 @@
                             located.append((vartype_content["name"], var.getname(), address, initial_value))
                         else:
                             variables.append((vartype_content["name"], var.getname(), None, initial_value))
+                if varlist["value"].getconstant():
+                    option = "CONSTANT"
+                elif varlist["value"].getretain():
+                    option = "RETAIN"
+                elif varlist["value"].getnonretain():
+                    option = "NON_RETAIN"
+                else:
+                    option = None
                 if len(variables) > 0:
-                    self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getretain(), 
-                                varlist["value"].getconstant(), False, variables))
+                    self.Interface.append((varTypeNames[varlist["name"]], option, False, variables))
                 if len(located) > 0:
-                    self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getretain(), 
-                                varlist["value"].getconstant(), True, located))
+                    self.Interface.append((varTypeNames[varlist["name"]], option, True, located))
         
     def ComputeConnectionTypes(self, pou):
         body = pou.getbody()
@@ -951,14 +961,14 @@
         return expression
     
     def AddTrigger(self, edge, expression, var_info):
-        if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]:
-            self.Interface.append(("VAR", False, False, False, []))
+        if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
+            self.Interface.append(("VAR", None, False, []))
         i = 1
         name = "%s%d"%(edge, i)
         while self.IsAlreadyDefined(name):
             i += 1
             name = "%s%d"%(edge, i)
-        self.Interface[-1][4].append((edge, name, None, None))
+        self.Interface[-1][3].append((edge, name, None, None))
         self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())] 
         self.Program += expression
         self.Program += [(");\n", ())]
@@ -1256,12 +1266,10 @@
         if len(self.Program) == 0 :
             raise PLCGenException, _("No body defined in \"%s\" POU")%self.Name
         var_number = 0
-        for list_type, retain, constant, located, variables in self.Interface:
+        for list_type, option, located, variables in self.Interface:
             program += [("  %s"%list_type, ())]
-            if retain:
-                program += [(" RETAIN", (self.TagName, "variable", (var_number, var_number + len(variables)), "retain"))]
-            if constant:
-                program += [(" CONSTANT", (self.TagName, "variable", (var_number, var_number + len(variables)), "constant"))]
+            if option is not None:
+                program += [(" %s"%option, (self.TagName, "variable", (var_number, var_number + len(variables)), option.lower()))]
             program += [("\n", ())]
             for var_type, var_name, var_address, var_initial in variables:
                 program += [("    ", ())]