PLCControler.py
changeset 865 c377a1d7767a
parent 864 bf4f7f0801b9
child 883 235a9ec83b95
--- a/PLCControler.py	Fri Oct 19 12:14:24 2012 +0200
+++ b/PLCControler.py	Mon Oct 22 17:39:13 2012 +0200
@@ -1210,8 +1210,8 @@
             for dimension in vartype_content["value"].getdimension():
                 dimensions.append((dimension.getlower(), dimension.getupper()))
             base_type = vartype_content["value"].baseType.getcontent()
-            if base_type["value"] is None:
-                base_type_name = base_type["name"]
+            if base_type["value"] is None or base_type["name"] in ["string", "wstring"]:
+                base_type_name = base_type["name"].upper()
             else:
                 base_type_name = base_type["value"].getname()
             tempvar["Type"] = ("array", base_type_name, dimensions)
@@ -1461,9 +1461,9 @@
                  "list": confnodetypes["types"].GetCustomBlockTypes()}
                 for confnodetypes in self.ConfNodeTypes]
         
-    def GetConfNodeDataTypes(self, exclude = ""):
+    def GetConfNodeDataTypes(self, exclude = "", only_locatables = False):
         return [{"name": _("%s Data Types") % confnodetypes["name"],
-                 "list": [datatype["name"] for datatype in confnodetypes["types"].GetCustomDataTypes(exclude)]}
+                 "list": [datatype["name"] for datatype in confnodetypes["types"].GetCustomDataTypes(exclude, only_locatables)]}
                 for confnodetypes in self.ConfNodeTypes]
     
     def GetConfNodeDataType(self, type):
@@ -1556,7 +1556,7 @@
         return blocktypes
 
     # Return Data Types checking for recursion
-    def GetDataTypes(self, tagname = "", basetypes = True, only_locatables = False, debug = False):
+    def GetDataTypes(self, tagname = "", basetypes = True, confnodetypes = True, only_locatables = False, debug = False):
         if basetypes:
             datatypes = self.GetBaseTypes()
         else:
@@ -1568,8 +1568,9 @@
             if words[0] in ["D"]:
                 name = words[1]
             datatypes.extend([datatype["name"] for datatype in project.GetCustomDataTypes(name, only_locatables)])
-        for category in self.GetConfNodeDataTypes():
-            datatypes.extend(category["list"])
+        if confnodetypes:
+            for category in self.GetConfNodeDataTypes(name, only_locatables):
+                datatypes.extend(category["list"])
         return datatypes
 
     # Return Base Type of given possible derived type
@@ -1762,6 +1763,16 @@
                         element_type = element.type.getcontent()
                         if element_type["value"] is None or element_type["name"] in ["string", "wstring"]:
                             element_infos["Type"] = element_type["name"].upper()
+                        elif element_type["name"] == "array":
+                            dimensions = []
+                            for dimension in element_type["value"].getdimension():
+                                dimensions.append((dimension.getlower(), dimension.getupper()))
+                            base_type = element_type["value"].baseType.getcontent()
+                            if base_type["value"] is None or base_type["name"] in ["string", "wstring"]:
+                                base_type_name = base_type["name"].upper()
+                            else:
+                                base_type_name = base_type["value"].getname()
+                            element_infos["Type"] = ("array", base_type_name, dimensions)
                         else:
                             element_infos["Type"] = element_type["value"].getname()
                         if element.initialValue is not None:
@@ -1845,7 +1856,31 @@
                 for i, element_infos in enumerate(infos["elements"]):
                     element = plcopen.varListPlain_variable()
                     element.setname(element_infos["Name"])
-                    if element_infos["Type"] in self.GetBaseTypes():
+                    if isinstance(element_infos["Type"], TupleType):
+                        if element_infos["Type"][0] == "array":
+                            array_type, base_type_name, dimensions = element_infos["Type"]
+                            array = plcopen.derivedTypes_array()
+                            for j, dimension in enumerate(dimensions):
+                                dimension_range = plcopen.rangeSigned()
+                                dimension_range.setlower(dimension[0])
+                                dimension_range.setupper(dimension[1])
+                                if j == 0:
+                                    array.setdimension([dimension_range])
+                                else:
+                                    array.appenddimension(dimension_range)
+                            if base_type_name in self.GetBaseTypes():
+                                if base_type_name == "STRING":
+                                    array.baseType.setcontent({"name" : "string", "value" : plcopen.elementaryTypes_string()})
+                                elif base_type_name == "WSTRING":
+                                    array.baseType.setcontent({"name" : "wstring", "value" : plcopen.wstring()})
+                                else:
+                                    array.baseType.setcontent({"name" : base_type_name, "value" : None})
+                            else:
+                                derived_datatype = plcopen.derivedTypes_derived()
+                                derived_datatype.setname(base_type_name)
+                                array.baseType.setcontent({"name" : "derived", "value" : derived_datatype})
+                            element.type.setcontent({"name" : "array", "value" : array})
+                    elif element_infos["Type"] in self.GetBaseTypes():
                         if element_infos["Type"] == "STRING":
                             element.type.setcontent({"name" : "string", "value" : plcopen.elementaryTypes_string()})
                         elif element_infos["Type"] == "WSTRING":