plcopen/plcopen.py
changeset 295 c6ef6d92ce16
parent 286 67da12c94d2d
child 348 09fdd7616a86
--- a/plcopen/plcopen.py	Mon Dec 15 09:45:16 2008 +0100
+++ b/plcopen/plcopen.py	Fri Dec 19 15:07:54 2008 +0100
@@ -365,11 +365,34 @@
         # Reset the tree of user-defined element cross-use
         self.ElementUsingTree = {}
         pous = self.getpous()
+        datatypes = self.getdataTypes()
         # Reference all the user-defined elementu names and initialize the tree of 
         # user-defined elemnt cross-use
-        pounames = [pou.getname() for pou in pous]
-        for name in pounames:
+        elementnames = [datatype.getname() for datatype in datatypes] + \
+                       [pou.getname() for pou in pous]
+        for name in elementnames:
             self.ElementUsingTree[name] = []
+        # Analyze each datatype
+        for datatype in datatypes:
+            name = datatype.getname()
+            basetype_content = datatype.baseType.getcontent()
+            if basetype_content["name"] == "derived":
+                typename = basetype_content["value"].getname()
+                if typename in elementnames and name not in self.ElementUsingTree[typename]:
+                    self.ElementUsingTree[typename].append(name)
+            elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]:
+                base_type = basetype_content["value"].baseType.getcontent()
+                if base_type["name"] == "derived":
+                    typename = base_type["value"].getname()
+                    if typename in elementnames and name not in self.ElementUsingTree[typename]:
+                        self.ElementUsingTree[typename].append(name)
+            elif basetype_content["name"] == "struct":
+                for element in basetype_content["value"].getvariable():
+                    type_content = element.type.getcontent()
+                    if type_content["name"] == "derived":
+                        typename = type_content["value"].getname()
+                        if typename in elementnames and name not in self.ElementUsingTree[typename]:
+                            self.ElementUsingTree[typename].append(name)
         # Analyze each pou
         for pou in pous:
             name = pou.getname()
@@ -380,7 +403,7 @@
                         vartype_content = var.gettype().getcontent()
                         if vartype_content["name"] == "derived":
                             typename = vartype_content["value"].getname()
-                            if typename in pounames and name not in self.ElementUsingTree[typename]:
+                            if typename in elementnames and name not in self.ElementUsingTree[typename]:
                                 self.ElementUsingTree[typename].append(name)
     setattr(cls, "RefreshElementUsingTree", RefreshElementUsingTree)
 
@@ -1760,13 +1783,13 @@
     def setvalue(self, value):
         self.value = []
         for item in extractValues(value[1:-1]):
-            result = arrayValue_model.match(item)
+            result = structValue_model.match(item)
             if result is not None:
                 groups = result.groups()
                 element = PLCOpenClasses["structValue_value"]()
                 element.setmember(groups[0].strip())
                 element.setvalue(groups[1].strip())
-            self.value.append(element)
+                self.value.append(element)
     setattr(cls, "setvalue", setvalue)
     
     def getvalue(self):