PLCGenerator.py
changeset 33 0dd4a876392f
parent 31 d833bf7567b1
child 37 256eedd275d0
--- a/PLCGenerator.py	Tue Jul 10 17:30:41 2007 +0200
+++ b/PLCGenerator.py	Tue Jul 10 19:09:28 2007 +0200
@@ -65,7 +65,7 @@
         self.Program = ""
     
     def IsAlreadyDefined(self, name):
-        for list_type, retain, constant, vars in self.Interface:
+        for list_type, retain, constant, located, vars in self.Interface:
             for var_type, var_name, var_address, var_initial in vars:
                 if name == var_name:
                     return True
@@ -76,6 +76,7 @@
             self.ReturnType = interface.getReturnType().getValue()
         for varlist in interface.getContent():
             variables = []
+            located = False
             for var in varlist["value"].getVariable():
                 type = var.getType().getValue()
                 initial = var.getInitialValue()
@@ -86,9 +87,11 @@
                 address = var.getAddress()
                 if address == "":
                     address = None
+                else:
+                    located = True
                 variables.append((type, var.getName(), address, initial_value))
             self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), 
-                            varlist["value"].getConstant(), variables))
+                            varlist["value"].getConstant(), located, variables))
     
     def GenerateProgram(self, pou):
         body = pou.getBody()
@@ -143,10 +146,10 @@
                 variable = instance.outputVariables.getVariable()[0]
                 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars)))
             elif block_infos["type"] == "functionBlock":
-                if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
-                    self.Interface.append(("VAR", False, False, []))
+                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 not self.IsAlreadyDefined(name):
-                    self.Interface[-1][3].append((type, name, None, None))
+                    self.Interface[-1][4].append((type, name, None, None))
                     vars = []
                     for variable in instance.inputVariables.getVariable():
                         connections = variable.connectionPointIn.getConnections()
@@ -429,14 +432,14 @@
         return text
     
     def AddTrigger(self, edge, text):
-        if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]:
-            self.Interface.append(("VAR", False, False, []))
+        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, []))
         i = 1
         name = "%s%d"%(edge, i)
         while self.IsAlreadyDefined(name):
             i += 1
             name = "%s%d"%(edge, i)
-        self.Interface[-1][3].append((edge, name, None, None))
+        self.Interface[-1][4].append((edge, name, None, None))
         self.Program += "  %s(CLK := %s);\n"%(name, text)
         return "%s.Q"%name
     
@@ -445,7 +448,7 @@
             program = "%s %s : %s\n"%(self.Type, self.Name, self.ReturnType)
         else:
             program = "%s %s\n"%(self.Type, self.Name)
-        for list_type, retain, constant, variables in self.Interface:
+        for list_type, retain, constant, located, variables in self.Interface:
             program += "  %s"%list_type
             if retain:
                 program += " RETAIN"
@@ -458,7 +461,11 @@
                     program += "AT %s "%var_address
                 program += ": %s"%var_type
                 if var_initial != None:
-                    program += " := %s"%{"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial))
+                    value = {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial))
+                    if var_type in ["STRING", "WSTRING"]:
+                        program += " := \"%s\""%value
+                    else:
+                        program += " := %s"%value
                 program += ";\n"
             program += "  END_VAR\n"
         program += "\n"
@@ -476,15 +483,20 @@
                 config += " CONSTANT"
             config += "\n"
             for var in varlist.getVariable():
-                config += "      %s "%var.getName()
+                var_type = var.getType().getValue()
+                config += "    %s "%var.getName()
                 address = var.getAddress()
                 if address:
                     config += "AT %s "%address
-                config += ": %s"%var.getType().getValue()
+                config += ": %s"%var_type
                 initial = var.getInitialValue()
                 if initial:
                     value = str(initial.getValue())
-                    config += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
+                    value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
+                    if var_type in ["STRING", "WSTRING"]:
+                        config += " := \"%s\""%value
+                    else:
+                        config += " := %s"%value
                 config += ";\n"
             config += "  END_VAR\n"
         for resource in configuration.getResource():
@@ -493,7 +505,7 @@
         return config
         
     def GenerateResource(self, resource):
-        resrce = "\n  RESOURCE %s\n"%resource.getName()
+        resrce = "\n  RESOURCE %s ON BEREMIZ\n"%resource.getName()
         for varlist in resource.getGlobalVars():
             resrce += "    VAR_GLOBAL"
             if varlist.getRetain():
@@ -502,6 +514,7 @@
                 resrce += " CONSTANT"
             resrce += "\n"
             for var in varlist.getVariable():
+                var_type = var.getType().getValue()
                 resrce += "      %s "%var.getName()
                 address = var.getAddress()
                 if address:
@@ -510,7 +523,11 @@
                 initial = var.getInitialValue()
                 if initial:
                     value = str(initial.getValue())
-                    resrce += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
+                    value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value)
+                    if var_type in ["STRING", "WSTRING"]:
+                        resrce += " := \"%s\""%value
+                    else:
+                        resrce += " := %s"%value
                 resrce += ";\n"
             resrce += "    END_VAR\n"
         tasks = resource.getTask()