PLCGenerator.py
changeset 295 c6ef6d92ce16
parent 281 eb49f3f511cc
child 307 fd1f6ae26d4f
--- a/PLCGenerator.py	Mon Dec 15 09:45:16 2008 +0100
+++ b/PLCGenerator.py	Fri Dec 19 15:07:54 2008 +0100
@@ -172,6 +172,33 @@
                 datatype_def += JoinList([(",", ())], dimensions)
                 datatype_def += [("] OF " , ()),
                                  (basetype_name, (tagname, "base"))]
+            # Data type is a structure
+            elif basetype_content["name"] == "struct":
+                elements = []
+                for i, element in enumerate(basetype_content["value"].getvariable()):
+                    element_type = element.type.getcontent()
+                    # Structure element derived directly from a user defined type 
+                    if element_type["name"] == "derived":
+                        elementtype_name = element_type["value"].getname()
+                        self.GenerateDataType(elementtype_name)
+                    # Structure element derived directly from a string type 
+                    elif element_type["name"] in ["string", "wstring"]:
+                        elementtype_name = element_type["name"].upper()
+                    # Structure element derived directly from an elementary type 
+                    else:
+                        elementtype_name = element_type["name"]
+                    element_text = [("\n    ", ()),
+                                    (element.getname(), (tagname, "struct", i, "name")),
+                                    (" : ", ()),
+                                    (elementtype_name, (tagname, "struct", i, "type"))]
+                    if element.initialValue is not None:
+                        element_text.extend([(" := ", ()),
+                                             (self.ComputeValue(element.initialValue.getvalue(), elementtype_name), (tagname, "struct", i, "initial"))])
+                    element_text.append((";", ()))
+                    elements.append(element_text)
+                datatype_def += [("STRUCT", ())]
+                datatype_def += JoinList([("", ())], elements)
+                datatype_def += [("\n  END_STRUCT", ())]
             # Data type derived directly from a elementary type 
             else:
                 datatype_def += [(basetype_content["name"], (tagname, "base"))]
@@ -180,7 +207,7 @@
                 datatype_def += [(" := ", ()),
                                  (self.ComputeValue(datatype.initialValue.getvalue(), datatype_name), (tagname, "initial"))]
             datatype_def += [(";\n", ())]
-            return datatype_def
+            self.Program += datatype_def
 
     # Generate a POU from its name
     def GeneratePouProgram(self, pou_name):
@@ -371,7 +398,7 @@
             self.Program += [("TYPE\n", ())]
             # Generate every data types defined
             for datatype_name in self.DatatypeComputed.keys():
-                self.Program += self.GenerateDataType(datatype_name)
+                self.GenerateDataType(datatype_name)
             self.Program += [("END_TYPE\n\n", ())]
         # Generate every POUs defined
         for pou_name in self.PouComputed.keys():