PLCGenerator.py
changeset 295 c6ef6d92ce16
parent 281 eb49f3f511cc
child 307 fd1f6ae26d4f
equal deleted inserted replaced
294:4a36f2ec8967 295:c6ef6d92ce16
   170                               for i, dimension in enumerate(basetype_content["value"].getdimension())]
   170                               for i, dimension in enumerate(basetype_content["value"].getdimension())]
   171                 datatype_def += [("ARRAY [", ())]
   171                 datatype_def += [("ARRAY [", ())]
   172                 datatype_def += JoinList([(",", ())], dimensions)
   172                 datatype_def += JoinList([(",", ())], dimensions)
   173                 datatype_def += [("] OF " , ()),
   173                 datatype_def += [("] OF " , ()),
   174                                  (basetype_name, (tagname, "base"))]
   174                                  (basetype_name, (tagname, "base"))]
       
   175             # Data type is a structure
       
   176             elif basetype_content["name"] == "struct":
       
   177                 elements = []
       
   178                 for i, element in enumerate(basetype_content["value"].getvariable()):
       
   179                     element_type = element.type.getcontent()
       
   180                     # Structure element derived directly from a user defined type 
       
   181                     if element_type["name"] == "derived":
       
   182                         elementtype_name = element_type["value"].getname()
       
   183                         self.GenerateDataType(elementtype_name)
       
   184                     # Structure element derived directly from a string type 
       
   185                     elif element_type["name"] in ["string", "wstring"]:
       
   186                         elementtype_name = element_type["name"].upper()
       
   187                     # Structure element derived directly from an elementary type 
       
   188                     else:
       
   189                         elementtype_name = element_type["name"]
       
   190                     element_text = [("\n    ", ()),
       
   191                                     (element.getname(), (tagname, "struct", i, "name")),
       
   192                                     (" : ", ()),
       
   193                                     (elementtype_name, (tagname, "struct", i, "type"))]
       
   194                     if element.initialValue is not None:
       
   195                         element_text.extend([(" := ", ()),
       
   196                                              (self.ComputeValue(element.initialValue.getvalue(), elementtype_name), (tagname, "struct", i, "initial"))])
       
   197                     element_text.append((";", ()))
       
   198                     elements.append(element_text)
       
   199                 datatype_def += [("STRUCT", ())]
       
   200                 datatype_def += JoinList([("", ())], elements)
       
   201                 datatype_def += [("\n  END_STRUCT", ())]
   175             # Data type derived directly from a elementary type 
   202             # Data type derived directly from a elementary type 
   176             else:
   203             else:
   177                 datatype_def += [(basetype_content["name"], (tagname, "base"))]
   204                 datatype_def += [(basetype_content["name"], (tagname, "base"))]
   178             # Data type has an initial value
   205             # Data type has an initial value
   179             if datatype.initialValue is not None:
   206             if datatype.initialValue is not None:
   180                 datatype_def += [(" := ", ()),
   207                 datatype_def += [(" := ", ()),
   181                                  (self.ComputeValue(datatype.initialValue.getvalue(), datatype_name), (tagname, "initial"))]
   208                                  (self.ComputeValue(datatype.initialValue.getvalue(), datatype_name), (tagname, "initial"))]
   182             datatype_def += [(";\n", ())]
   209             datatype_def += [(";\n", ())]
   183             return datatype_def
   210             self.Program += datatype_def
   184 
   211 
   185     # Generate a POU from its name
   212     # Generate a POU from its name
   186     def GeneratePouProgram(self, pou_name):
   213     def GeneratePouProgram(self, pou_name):
   187         # Verify that POU hasn't been generated yet
   214         # Verify that POU hasn't been generated yet
   188         if not self.PouComputed.get(pou_name, True):
   215         if not self.PouComputed.get(pou_name, True):
   369         # type defined
   396         # type defined
   370         if len(self.DatatypeComputed) > 0:
   397         if len(self.DatatypeComputed) > 0:
   371             self.Program += [("TYPE\n", ())]
   398             self.Program += [("TYPE\n", ())]
   372             # Generate every data types defined
   399             # Generate every data types defined
   373             for datatype_name in self.DatatypeComputed.keys():
   400             for datatype_name in self.DatatypeComputed.keys():
   374                 self.Program += self.GenerateDataType(datatype_name)
   401                 self.GenerateDataType(datatype_name)
   375             self.Program += [("END_TYPE\n\n", ())]
   402             self.Program += [("END_TYPE\n\n", ())]
   376         # Generate every POUs defined
   403         # Generate every POUs defined
   377         for pou_name in self.PouComputed.keys():
   404         for pou_name in self.PouComputed.keys():
   378             self.GeneratePouProgram(pou_name)
   405             self.GeneratePouProgram(pou_name)
   379         # Generate every configurations defined
   406         # Generate every configurations defined