plcopen/plcopen.py
changeset 379 e4c26ee9c998
parent 348 09fdd7616a86
child 383 25ffba02b6a8
equal deleted inserted replaced
377:c41acb1465ee 379:e4c26ee9c998
    93         return fileheader
    93         return fileheader
    94     setattr(cls, "getfileHeader", getfileHeader)
    94     setattr(cls, "getfileHeader", getfileHeader)
    95     
    95     
    96     def setfileHeader(self, fileheader):
    96     def setfileHeader(self, fileheader):
    97         self.fileHeader.setcompanyName(fileheader["companyName"])
    97         self.fileHeader.setcompanyName(fileheader["companyName"])
    98         if "companyURL" in fileheader:
    98         if fileheader.has_key("companyURL"):
    99             self.fileHeader.setcompanyURL(fileheader["companyURL"])
    99             self.fileHeader.setcompanyURL(fileheader["companyURL"])
   100         self.fileHeader.setproductName(fileheader["productName"])
   100         self.fileHeader.setproductName(fileheader["productName"])
   101         self.fileHeader.setproductVersion(fileheader["productVersion"])
   101         self.fileHeader.setproductVersion(fileheader["productVersion"])
   102         if "productRelease" in fileheader:
   102         if fileheader.has_key("productRelease"):
   103             self.fileHeader.setproductRelease(fileheader["productRelease"])
   103             self.fileHeader.setproductRelease(fileheader["productRelease"])
   104         self.fileHeader.setcreationDateTime(fileheader["creationDateTime"])
   104         self.fileHeader.setcreationDateTime(fileheader["creationDateTime"])
   105         if "contentDescription" in fileheader:
   105         if fileheader.has_key("contentDescription"):
   106             self.fileHeader.setcontentDescription(fileheader["contentDescription"])
   106             self.fileHeader.setcontentDescription(fileheader["contentDescription"])
   107     setattr(cls, "setfileHeader", setfileHeader)
   107     setattr(cls, "setfileHeader", setfileHeader)
   108     
   108     
   109     def getcontentHeader(self):
   109     def getcontentHeader(self):
   110         contentheader = {}
   110         contentheader = {}
   124         return contentheader
   124         return contentheader
   125     setattr(cls, "getcontentHeader", getcontentHeader)
   125     setattr(cls, "getcontentHeader", getcontentHeader)
   126     
   126     
   127     def setcontentHeader(self, contentheader):
   127     def setcontentHeader(self, contentheader):
   128         self.contentHeader.setname(contentheader["projectName"])
   128         self.contentHeader.setname(contentheader["projectName"])
   129         if "projectVersion" in contentheader:
   129         if contentheader.has_key("projectVersion"):
   130             self.contentHeader.setversion(contentheader["projectVersion"])
   130             self.contentHeader.setversion(contentheader["projectVersion"])
   131         if "modificationDateTime" in contentheader:
   131         if contentheader.has_key("modificationDateTime"):
   132             self.contentHeader.setmodificationDateTime(contentheader["modificationDateTime"])
   132             self.contentHeader.setmodificationDateTime(contentheader["modificationDateTime"])
   133         if "organization" in contentheader:
   133         if contentheader.has_key("organization"):
   134             self.contentHeader.setorganization(contentheader["organization"])
   134             self.contentHeader.setorganization(contentheader["organization"])
   135         if "authorName" in contentheader:
   135         if contentheader.has_key("authorName"):
   136             self.contentHeader.setauthor(contentheader["authorName"])
   136             self.contentHeader.setauthor(contentheader["authorName"])
   137         if "language" in contentheader:
   137         if contentheader.has_key("language"):
   138             self.contentHeader.setlanguage(contentheader["language"])
   138             self.contentHeader.setlanguage(contentheader["language"])
   139         self.contentHeader.setpageSize(*contentheader["pageSize"])
   139         self.contentHeader.setpageSize(*contentheader["pageSize"])
   140         self.contentHeader.setscaling(contentheader["scaling"])
   140         self.contentHeader.setscaling(contentheader["scaling"])
   141     setattr(cls, "setcontentHeader", setcontentHeader)
   141     setattr(cls, "setcontentHeader", setcontentHeader)
   142     
   142     
   147     def getdataType(self, name):
   147     def getdataType(self, name):
   148         return self.types.getdataTypeElement(name)
   148         return self.types.getdataTypeElement(name)
   149     setattr(cls, "getdataType", getdataType)
   149     setattr(cls, "getdataType", getdataType)
   150     
   150     
   151     def appenddataType(self, name):
   151     def appenddataType(self, name):
   152         if name in self.CustomTypeHierarchy:
   152         if self.CustomTypeHierarchy.has_key(name):
   153             raise ValueError, "\"%s\" Data Type already exists !!!"%name
   153             raise ValueError, "\"%s\" Data Type already exists !!!"%name
   154         self.types.appenddataTypeElement(name)
   154         self.types.appenddataTypeElement(name)
   155         self.AddCustomDataType(self.getdataType(name))
   155         self.AddCustomDataType(self.getdataType(name))
   156     setattr(cls, "appenddataType", appenddataType)
   156     setattr(cls, "appenddataType", appenddataType)
   157         
   157         
   389         for datatype in datatypes:
   389         for datatype in datatypes:
   390             name = datatype.getname()
   390             name = datatype.getname()
   391             basetype_content = datatype.baseType.getcontent()
   391             basetype_content = datatype.baseType.getcontent()
   392             if basetype_content["name"] == "derived":
   392             if basetype_content["name"] == "derived":
   393                 typename = basetype_content["value"].getname()
   393                 typename = basetype_content["value"].getname()
   394                 if typename in elementnames and name not in self.ElementUsingTree[typename]:
   394                 if name in self.ElementUsingTree[typename]:
   395                     self.ElementUsingTree[typename].append(name)
   395                     self.ElementUsingTree[typename].append(name)
   396             elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]:
   396             elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]:
   397                 base_type = basetype_content["value"].baseType.getcontent()
   397                 base_type = basetype_content["value"].baseType.getcontent()
   398                 if base_type["name"] == "derived":
   398                 if base_type["name"] == "derived":
   399                     typename = base_type["value"].getname()
   399                     typename = base_type["value"].getname()
   400                     if typename in elementnames and name not in self.ElementUsingTree[typename]:
   400                     if self.ElementUsingTree.has_key(typename) and name not in self.ElementUsingTree[typename]:
   401                         self.ElementUsingTree[typename].append(name)
   401                         self.ElementUsingTree[typename].append(name)
   402             elif basetype_content["name"] == "struct":
   402             elif basetype_content["name"] == "struct":
   403                 for element in basetype_content["value"].getvariable():
   403                 for element in basetype_content["value"].getvariable():
   404                     type_content = element.type.getcontent()
   404                     type_content = element.type.getcontent()
   405                     if type_content["name"] == "derived":
   405                     if type_content["name"] == "derived":
   406                         typename = type_content["value"].getname()
   406                         typename = type_content["value"].getname()
   407                         if typename in elementnames and name not in self.ElementUsingTree[typename]:
   407                         if self.ElementUsingTree.has_key(typename) and name not in self.ElementUsingTree[typename]:
   408                             self.ElementUsingTree[typename].append(name)
   408                             self.ElementUsingTree[typename].append(name)
   409         # Analyze each pou
   409         # Analyze each pou
   410         for pou in pous:
   410         for pou in pous:
   411             name = pou.getname()
   411             name = pou.getname()
   412             if pou.interface:
   412             if pou.interface:
   414                 for type, varlist in pou.getvars():
   414                 for type, varlist in pou.getvars():
   415                     for var in varlist.getvariable():
   415                     for var in varlist.getvariable():
   416                         vartype_content = var.gettype().getcontent()
   416                         vartype_content = var.gettype().getcontent()
   417                         if vartype_content["name"] == "derived":
   417                         if vartype_content["name"] == "derived":
   418                             typename = vartype_content["value"].getname()
   418                             typename = vartype_content["value"].getname()
   419                             if typename in elementnames and name not in self.ElementUsingTree[typename]:
   419                             if self.ElementUsingTree.has_key(typename) and name not in self.ElementUsingTree[typename]:
   420                                 self.ElementUsingTree[typename].append(name)
   420                                 self.ElementUsingTree[typename].append(name)
   421     setattr(cls, "RefreshElementUsingTree", RefreshElementUsingTree)
   421     setattr(cls, "RefreshElementUsingTree", RefreshElementUsingTree)
   422 
   422 
   423     def GetParentType(self, type):
   423     def GetParentType(self, type):
   424         if type in self.CustomTypeHierarchy:
   424         if self.CustomTypeHierarchy.has_key(type):
   425             return self.CustomTypeHierarchy[type]
   425             return self.CustomTypeHierarchy[type]
   426         elif type in TypeHierarchy:
   426         elif TypeHierarchy.has_key(type):
   427             return TypeHierarchy[type]
   427             return TypeHierarchy[type]
   428         return None
   428         return None
   429     setattr(cls, "GetParentType", GetParentType)
   429     setattr(cls, "GetParentType", GetParentType)
   430 
   430 
   431     def GetBaseType(self, type):
   431     def GetBaseType(self, type):
   463         return False
   463         return False
   464     setattr(cls, "IsOfType", IsOfType)
   464     setattr(cls, "IsOfType", IsOfType)
   465 
   465 
   466     # Return if pou given by name is used by another pou
   466     # Return if pou given by name is used by another pou
   467     def ElementIsUsed(self, name):
   467     def ElementIsUsed(self, name):
   468         if name in self.ElementUsingTree:
   468         if self.ElementUsingTree.has_key(name):
   469             return len(self.ElementUsingTree[name]) > 0
   469             return len(self.ElementUsingTree[name]) > 0
   470         return False
   470         return False
   471     setattr(cls, "ElementIsUsed", ElementIsUsed)
   471     setattr(cls, "ElementIsUsed", ElementIsUsed)
   472 
   472 
   473     def DataTypeIsDerived(self, name):
   473     def DataTypeIsDerived(self, name):
   474         return name in self.CustomTypeHierarchy.values()
   474         return name in self.CustomTypeHierarchy.values()
   475     setattr(cls, "DataTypeIsDerived", DataTypeIsDerived)
   475     setattr(cls, "DataTypeIsDerived", DataTypeIsDerived)
   476 
   476 
   477     # Return if pou given by name is directly or undirectly used by the reference pou
   477     # Return if pou given by name is directly or undirectly used by the reference pou
   478     def ElementIsUsedBy(self, name, reference):
   478     def ElementIsUsedBy(self, name, reference):
   479         if name in self.ElementUsingTree:
   479         if self.ElementUsingTree.has_key(name):
   480             list = self.ElementUsingTree[name]
   480             list = self.ElementUsingTree[name]
   481             # Test if pou is directly used by reference
   481             # Test if pou is directly used by reference
   482             if reference in list:
   482             if reference in list:
   483                 return True
   483                 return True
   484             else:
   484             else:
   490                 return used
   490                 return used
   491         return False
   491         return False
   492     setattr(cls, "ElementIsUsedBy", ElementIsUsedBy)
   492     setattr(cls, "ElementIsUsedBy", ElementIsUsedBy)
   493 
   493 
   494     def GetDataTypeRange(self, type):
   494     def GetDataTypeRange(self, type):
   495         if type in self.CustomDataTypeRange:
   495         if self.CustomDataTypeRange.has_key(type):
   496             return self.CustomDataTypeRange[type]
   496             return self.CustomDataTypeRange[type]
   497         elif type in DataTypeRange:
   497         elif DataTypeRange.has_key(type):
   498             return DataTypeRange[type]
   498             return DataTypeRange[type]
   499         else:
   499         else:
   500             parent_type = self.GetParentType(type)
   500             parent_type = self.GetParentType(type)
   501             if parent_type is not None:
   501             if parent_type is not None:
   502                 return self.GetDataTypeRange(parent_type)
   502                 return self.GetDataTypeRange(parent_type)
   507         if type is None:
   507         if type is None:
   508             all_values = []
   508             all_values = []
   509             for values in self.EnumeratedDataTypeValues.values():
   509             for values in self.EnumeratedDataTypeValues.values():
   510                 all_values.extend(values)
   510                 all_values.extend(values)
   511             return all_values
   511             return all_values
   512         elif type in self.EnumeratedDataTypeValues:
   512         elif self.EnumeratedDataTypeValues.has_key(type):
   513             return self.EnumeratedDataTypeValues(type)
   513             return self.EnumeratedDataTypeValues[type]
   514         return []
   514         return []
   515     setattr(cls, "GetEnumeratedDataTypeValues", GetEnumeratedDataTypeValues)
   515     setattr(cls, "GetEnumeratedDataTypeValues", GetEnumeratedDataTypeValues)
   516 
   516 
   517     # Function that returns the block definition associated to the block type given
   517     # Function that returns the block definition associated to the block type given
   518     def GetCustomBlockType(self, type, inputs = None):
   518     def GetCustomBlockType(self, type, inputs = None):
  1534                 action.addreference()
  1534                 action.addreference()
  1535                 action.setreferenceName(params["value"])
  1535                 action.setreferenceName(params["value"])
  1536             else:
  1536             else:
  1537                 action.addinline()
  1537                 action.addinline()
  1538                 action.setinlineContent(params["value"])
  1538                 action.setinlineContent(params["value"])
  1539             if "duration" in params:
  1539             if params.has_key("duration"):
  1540                 action.setduration(params["duration"])
  1540                 action.setduration(params["duration"])
  1541             if "indicator" in params:
  1541             if params.has_key("indicator"):
  1542                 action.setindicator(params["indicator"])
  1542                 action.setindicator(params["indicator"])
  1543             self.action.append(action)
  1543             self.action.append(action)
  1544     setattr(cls, "setactions", setactions)
  1544     setattr(cls, "setactions", setactions)
  1545 
  1545 
  1546     def getactions(self):
  1546     def getactions(self):