PLCControler.py
changeset 141 c0242a51774c
parent 137 fc7e0b8ed9d3
child 144 b67a5de5a24a
equal deleted inserted replaced
140:06d28f03f6f4 141:c0242a51774c
   326                 self.DataTypeUsingTree[name] = []
   326                 self.DataTypeUsingTree[name] = []
   327             # Analyze each data type
   327             # Analyze each data type
   328             for datatype in datatypes:
   328             for datatype in datatypes:
   329                 name = datatype.getName()
   329                 name = datatype.getName()
   330                 basetype_content = datatype.getBaseType().getContent()
   330                 basetype_content = datatype.getBaseType().getContent()
   331                 if basetype_content["value"] is not None:
   331                 if basetype_content["name"] == "derived":
   332                     if basetype_content["name"] == "derived":
   332                     basetype_name = basetype_content["value"].getName()
   333                         basetype_name = basetype_content["value"].getName()
   333                     if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]:
       
   334                         self.DataTypeUsingTree[basetype_name].append(name)
       
   335                 elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]:
       
   336                     base_type = basetype_content["value"].baseType.getContent()
       
   337                     if base_type["value"] is not None:
       
   338                         basetype_name = base_type["value"].getName()
   334                         if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]:
   339                         if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]:
   335                             self.DataTypeUsingTree[basetype_name].append(name)
   340                             self.DataTypeUsingTree[basetype_name].append(name)
   336                     elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned", "array"]:
       
   337                         base_type = basetype_content["value"].baseType.getContent()
       
   338                         if base_type["value"] is not None:
       
   339                             basetype_name = base_type["value"].getName()
       
   340                             if basetype_name in datatypenames and name not in self.DataTypeUsingTree[basetype_name]:
       
   341                                 self.DataTypeUsingTree[basetype_name].append(name)
       
   342     
   341     
   343     # Refresh the tree of user-defined pou cross-use
   342     # Refresh the tree of user-defined pou cross-use
   344     def RefreshPouUsingTree(self):
   343     def RefreshPouUsingTree(self):
   345         # Reset the tree of user-defined pou cross-use
   344         # Reset the tree of user-defined pou cross-use
   346         self.PouUsingTree = {}
   345         self.PouUsingTree = {}
   357                 if pou.interface:
   356                 if pou.interface:
   358                     # Extract variables from every varLists
   357                     # Extract variables from every varLists
   359                     for type, varlist in pou.getVars():
   358                     for type, varlist in pou.getVars():
   360                         for var in varlist.getVariable():
   359                         for var in varlist.getVariable():
   361                             vartype_content = var.getType().getContent()
   360                             vartype_content = var.getType().getContent()
   362                             if vartype_content["value"] is not None:
   361                             if vartype_content["name"] == "derived":
   363                                 typename = vartype_content["value"].getName()
   362                                 typename = vartype_content["value"].getName()
   364                                 if typename in pounames and name not in self.PouUsingTree[typename]:
   363                                 if typename in pounames and name not in self.PouUsingTree[typename]:
   365                                     self.PouUsingTree[typename].append(name)
   364                                     self.PouUsingTree[typename].append(name)
   366                 bodytype = pou.getBodyType()
   365                 bodytype = pou.getBodyType()
   367                 # If pou is written in a graphical language
   366                 # If pou is written in a graphical language
   656             # Create variable and change its properties
   655             # Create variable and change its properties
   657             tempvar = plcopen.varListPlain_variable()
   656             tempvar = plcopen.varListPlain_variable()
   658             tempvar.setName(var["Name"])
   657             tempvar.setName(var["Name"])
   659             var_type = plcopen.dataType()
   658             var_type = plcopen.dataType()
   660             if var["Type"] not in var_type.getChoices():
   659             if var["Type"] not in var_type.getChoices():
   661                 derived_type = plcopen.derived()
   660                 if var["Type"] == "STRING":
   662                 derived_type.setName(var["Type"])
   661                     var_type.setContent("string", plcopen.string())
   663                 var_type.setContent("derived", derived_type)
   662                 elif var["Type"] == "WSTRING":
       
   663                     var_type.setContent("wstring", plcopen.wstring())
       
   664                 else:
       
   665                     derived_type = plcopen.derived()
       
   666                     derived_type.setName(var["Type"])
       
   667                     var_type.setContent("derived", derived_type)
   664             else:
   668             else:
   665                 var_type.setContent(var["Type"], None)
   669                 var_type.setContent(var["Type"], None)
   666             tempvar.setType(var_type)
   670             tempvar.setType(var_type)
   667             if var["Initial Value"] != "":
   671             if var["Initial Value"] != "":
   668                 value = plcopen.value()
   672                 value = plcopen.value()
   696             # Extract variables from every varLists
   700             # Extract variables from every varLists
   697             for varlist in configuration.getGlobalVars():
   701             for varlist in configuration.getGlobalVars():
   698                 for var in varlist.getVariable():
   702                 for var in varlist.getVariable():
   699                     tempvar = {"Name":var.getName(),"Class":"Global"}
   703                     tempvar = {"Name":var.getName(),"Class":"Global"}
   700                     vartype_content = var.getType().getContent()
   704                     vartype_content = var.getType().getContent()
   701                     if vartype_content["value"] is None:
   705                     if vartype_content["name"] == "derived":
       
   706                         tempvar["Type"] = vartype_content["value"].getName()
       
   707                     elif vartype_content["name"] in ["string", "wstring"]:
       
   708                         tempvar["Type"] = vartype_content["name"].upper()
       
   709                     else:
   702                         tempvar["Type"] = vartype_content["name"]
   710                         tempvar["Type"] = vartype_content["name"]
   703                     else:
       
   704                         tempvar["Type"] = vartype_content["value"].getName()
       
   705                     tempvar["Edit"] = True
   711                     tempvar["Edit"] = True
   706                     initial = var.getInitialValue()
   712                     initial = var.getInitialValue()
   707                     if initial:
   713                     if initial:
   708                         tempvar["Initial Value"] = initial.getValue()
   714                         tempvar["Initial Value"] = initial.getValue()
   709                     else:
   715                     else:
   744             # Extract variables from every varLists
   750             # Extract variables from every varLists
   745             for varlist in resource.getGlobalVars():
   751             for varlist in resource.getGlobalVars():
   746                 for var in varlist.getVariable():
   752                 for var in varlist.getVariable():
   747                     tempvar = {"Name":var.getName(),"Class":"Global"}
   753                     tempvar = {"Name":var.getName(),"Class":"Global"}
   748                     vartype_content = var.getType().getContent()
   754                     vartype_content = var.getType().getContent()
   749                     if vartype_content["value"] is None:
   755                     if vartype_content["name"] == "derived":
       
   756                         tempvar["Type"] = vartype_content["value"].getName()
       
   757                     elif vartype_content["name"] in ["string", "wstring"]:
       
   758                         tempvar["Type"] = vartype_content["name"].upper()
       
   759                     else:
   750                         tempvar["Type"] = vartype_content["name"]
   760                         tempvar["Type"] = vartype_content["name"]
   751                     else:
       
   752                         tempvar["Type"] = vartype_content["value"].getName()
       
   753                     tempvar["Edit"] = True
   761                     tempvar["Edit"] = True
   754                     initial = var.getInitialValue()
   762                     initial = var.getInitialValue()
   755                     if initial:
   763                     if initial:
   756                         tempvar["Initial Value"] = initial.getValue()
   764                         tempvar["Initial Value"] = initial.getValue()
   757                     else:
   765                     else:
   785             # Extract variables from every varLists
   793             # Extract variables from every varLists
   786             for type, varlist in pou.getVars():
   794             for type, varlist in pou.getVars():
   787                 for var in varlist.getVariable():
   795                 for var in varlist.getVariable():
   788                     tempvar = {"Name":var.getName(),"Class":type}
   796                     tempvar = {"Name":var.getName(),"Class":type}
   789                     vartype_content = var.getType().getContent()
   797                     vartype_content = var.getType().getContent()
   790                     if vartype_content["value"] is None:
   798                     if vartype_content["name"] == "derived":
   791                         tempvar["Type"] = vartype_content["name"]
       
   792                         tempvar["Edit"] = True
       
   793                     else:
       
   794                         tempvar["Type"] = vartype_content["value"].getName()
   799                         tempvar["Type"] = vartype_content["value"].getName()
   795                         tempvar["Edit"] = not pou.hasBlock(tempvar["Name"])
   800                         tempvar["Edit"] = not pou.hasBlock(tempvar["Name"])
       
   801                     else:
       
   802                         if vartype_content["name"] in ["string", "wstring"]:
       
   803                             tempvar["Type"] = vartype_content["name"].upper()
       
   804                         else:
       
   805                             tempvar["Type"] = vartype_content["name"]
       
   806                         tempvar["Edit"] = True
   796                     initial = var.getInitialValue()
   807                     initial = var.getInitialValue()
   797                     if initial:
   808                     if initial:
   798                         tempvar["Initial Value"] = initial.getValue()
   809                         tempvar["Initial Value"] = initial.getValue()
   799                     else:
   810                     else:
   800                         tempvar["Initial Value"] = ""
   811                         tempvar["Initial Value"] = ""
   864         if pou.interface:
   875         if pou.interface:
   865             # Return the return type if there is one
   876             # Return the return type if there is one
   866             return_type = pou.interface.getReturnType()
   877             return_type = pou.interface.getReturnType()
   867             if return_type:
   878             if return_type:
   868                 returntype_content = return_type.getContent()
   879                 returntype_content = return_type.getContent()
   869                 if returntype_content["value"] is None:
   880                 if returntype_content["name"] == "derived":
       
   881                     return returntype_content["value"].getName()
       
   882                 elif returntype_content["name"] in ["string", "wstring"]:
       
   883                     return returntype_content["name"].upper()
       
   884                 else:
   870                     return returntype_content["name"]
   885                     return returntype_content["name"]
   871                 else:
       
   872                     return returntype_content["value"].getName()
       
   873         return None
   886         return None
   874     
   887     
   875     # Update data types with user-defined data types added
   888     # Update data types with user-defined data types added
   876     def RefreshDataTypes(self):
   889     def RefreshDataTypes(self):
   877         ResetTypeHierarchy()
   890         ResetTypeHierarchy()
   880             for datatype in self.Project.getDataTypes():
   893             for datatype in self.Project.getDataTypes():
   881                 name = datatype.getName()
   894                 name = datatype.getName()
   882                 basetype_content = datatype.getBaseType().getContent()
   895                 basetype_content = datatype.getBaseType().getContent()
   883                 if basetype_content["value"] is None:
   896                 if basetype_content["value"] is None:
   884                     AddDataTypeHierarchy(name, basetype_content["name"])
   897                     AddDataTypeHierarchy(name, basetype_content["name"])
       
   898                 elif basetype_content["name"] in ["string", "wstring"]:
       
   899                     AddDataTypeHierarchy(name, basetype_content["name"].upper())
   885                 elif basetype_content["name"] == "derived":
   900                 elif basetype_content["name"] == "derived":
   886                     AddDataTypeHierarchy(name, basetype_content["value"].getName())
   901                     AddDataTypeHierarchy(name, basetype_content["value"].getName())
   887                 elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]:
   902                 elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]:
   888                     base_type = basetype_content["value"].baseType.getContent()
   903                     base_type = basetype_content["value"].baseType.getContent()
   889                     if base_type["value"] is None:
   904                     if base_type["value"] is None:
   915                     if pou.getInterface():
   930                     if pou.getInterface():
   916                         for type, varlist in pou.getVars():
   931                         for type, varlist in pou.getVars():
   917                             if type == "InOut":
   932                             if type == "InOut":
   918                                 for var in varlist.getVariable():
   933                                 for var in varlist.getVariable():
   919                                     var_type = var.type.getContent()
   934                                     var_type = var.type.getContent()
   920                                     if var_type["value"] is None:
   935                                     if var_type["name"] == "derived":
       
   936                                         block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   937                                         block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   938                                     elif var_type["name"] in ["string", "wstring"]:
       
   939                                         block_infos["inputs"].append((var.getName(),var_type["name"].upper(),"none"))
       
   940                                         block_infos["outputs"].append((var.getName(),var_type["name"].upper(),"none"))
       
   941                                     else:
   921                                         block_infos["inputs"].append((var.getName(),var_type["name"],"none"))
   942                                         block_infos["inputs"].append((var.getName(),var_type["name"],"none"))
   922                                         block_infos["outputs"].append((var.getName(),var_type["name"],"none"))
   943                                         block_infos["outputs"].append((var.getName(),var_type["name"],"none"))
   923                                     else:
       
   924                                         block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   925                                         block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   926                             elif type == "Input":
   944                             elif type == "Input":
   927                                 for var in varlist.getVariable():
   945                                 for var in varlist.getVariable():
   928                                     var_type = var.type.getContent()
   946                                     var_type = var.type.getContent()
   929                                     if var_type["value"] is None:
   947                                     if var_type["name"] == "derived":
       
   948                                         block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   949                                     elif var_type["name"] in ["string", "wstring"]:
       
   950                                         block_infos["inputs"].append((var.getName(),var_type["name"].upper(),"none"))
       
   951                                     else:
   930                                         block_infos["inputs"].append((var.getName(),var_type["name"],"none"))
   952                                         block_infos["inputs"].append((var.getName(),var_type["name"],"none"))
   931                                     else:
       
   932                                         block_infos["inputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   933                             elif type == "Output":
   953                             elif type == "Output":
   934                                 for var in varlist.getVariable():
   954                                 for var in varlist.getVariable():
   935                                     var_type = var.type.getContent()
   955                                     var_type = var.type.getContent()
   936                                     if var_type["value"] is None:
   956                                     if var_type["name"] == "derived":
   937                                         block_infos["outputs"].append((var.getName(),var_type["name"],"none"))
   957                                         block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none"))
       
   958                                     elif var_type["name"] in ["string", "wstring"]:
       
   959                                         block_infos["outputs"].append((var.getName(),var_type["name"].upper(),"none"))
   938                                     else:
   960                                     else:
   939                                         block_infos["outputs"].append((var.getName(),var_type["value"].getName(),"none"))
   961                                         block_infos["outputs"].append((var.getName(),var_type["name"],"none"))    
   940                         return_type = pou.interface.getReturnType()
   962                         return_type = pou.interface.getReturnType()
   941                         if return_type:
   963                         if return_type:
   942                             var_type = return_type.getContent()
   964                             var_type = return_type.getContent()
   943                             if var_type["value"] is None:
   965                             if var_type["name"] == "derived":
       
   966                                 block_infos["outputs"].append(("",var_type["value"].getName(),"none"))
       
   967                             elif var_type["name"] in ["string", "wstring"]:
       
   968                                 block_infos["outputs"].append(("",var_type["name"].upper(),"none"))
       
   969                             else:
   944                                 block_infos["outputs"].append(("",var_type["name"],"none"))
   970                                 block_infos["outputs"].append(("",var_type["name"],"none"))
   945                             else:
       
   946                                 block_infos["outputs"].append(("",var_type["value"].getName(),"none"))
       
   947                     if pou.getBodyType() in ["FBD","LD","SFC"]:
   971                     if pou.getBodyType() in ["FBD","LD","SFC"]:
   948                         for instance in pou.getInstances():
   972                         for instance in pou.getInstances():
   949                             if isinstance(instance, plcopen.comment):
   973                             if isinstance(instance, plcopen.comment):
   950                                 block_infos["comment"] = instance.getContentText()
   974                                 block_infos["comment"] = instance.getContentText()
   951                     BlockTypes[-1]["list"].append(block_infos)
   975                     BlockTypes[-1]["list"].append(block_infos)
  1121         words = tagname.split("::")
  1145         words = tagname.split("::")
  1122         if words[0] == "D":
  1146         if words[0] == "D":
  1123             datatype = self.Project.getDataType(words[1])
  1147             datatype = self.Project.getDataType(words[1])
  1124             if infos["type"] == "Directly":
  1148             if infos["type"] == "Directly":
  1125                 if infos["base_type"] in self.GetBaseTypes():
  1149                 if infos["base_type"] in self.GetBaseTypes():
  1126                     datatype.baseType.setContent(infos["base_type"], None)
  1150                     if infos["base_type"] == "STRING":
       
  1151                         datatype.baseType.setContent("string", plcopen.string())
       
  1152                     elif infos["base_type"] == "WSTRING":
       
  1153                         datatype.baseType.setContent("wstring", plcopen.wstring())
       
  1154                     else:
       
  1155                         datatype.baseType.setContent(infos["base_type"], None)
  1127                 else:
  1156                 else:
  1128                     derived_datatype = plcopen.derived()
  1157                     derived_datatype = plcopen.derived()
  1129                     derived_datatype.setName(infos["base_type"])
  1158                     derived_datatype.setName(infos["base_type"])
  1130                     datatype.baseType.setContent("derived", derived_datatype)
  1159                     datatype.baseType.setContent("derived", derived_datatype)
  1131             elif infos["type"] == "Subrange":
  1160             elif infos["type"] == "Subrange":
  1156                     dimension_range = plcopen.rangeSigned()
  1185                     dimension_range = plcopen.rangeSigned()
  1157                     dimension_range.setLower(1)
  1186                     dimension_range.setLower(1)
  1158                     dimension_range.setUpper(int(dimension))
  1187                     dimension_range.setUpper(int(dimension))
  1159                     array.appendDimension(dimension_range)
  1188                     array.appendDimension(dimension_range)
  1160                 if infos["base_type"] in self.GetBaseTypes():
  1189                 if infos["base_type"] in self.GetBaseTypes():
  1161                     array.baseType.setContent(infos["base_type"], None)
  1190                     if infos["base_type"] == "STRING":
       
  1191                         array.baseType.setContent("string", plcopen.string())
       
  1192                     elif infos["base_type"] == "WSTRING":
       
  1193                         array.baseType.setContent("wstring", plcopen.wstring())
       
  1194                     else:
       
  1195                         array.baseType.setContent(infos["base_type"], None)
  1162                 else:
  1196                 else:
  1163                     derived_datatype = plcopen.derived()
  1197                     derived_datatype = plcopen.derived()
  1164                     derived_datatype.setName(infos["base_type"])
  1198                     derived_datatype.setName(infos["base_type"])
  1165                     array.baseType.setContent("derived", derived_datatype)
  1199                     array.baseType.setContent("derived", derived_datatype)
  1166                 datatype.baseType.setContent("array", array)
  1200                 datatype.baseType.setContent("array", array)
  1598             pou = self.Project.getPou(words[1])
  1632             pou = self.Project.getPou(words[1])
  1599             for type, varlist in pou.getVars():
  1633             for type, varlist in pou.getVars():
  1600                 for var in varlist.getVariable():
  1634                 for var in varlist.getVariable():
  1601                     if var.getName() == varname:
  1635                     if var.getName() == varname:
  1602                         vartype_content = var.getType().getContent()
  1636                         vartype_content = var.getType().getContent()
  1603                         if vartype_content["value"] is None:
  1637                         if vartype_content["name"] == "derived":
       
  1638                             return vartype_content["value"].getName()
       
  1639                         elif vartype_content["name"] in ["string", "wstring"]:
       
  1640                             return vartype_content["name"].upper()
       
  1641                         else:
  1604                             return vartype_content["name"]
  1642                             return vartype_content["name"]
  1605                         else:
       
  1606                             return vartype_content["value"].getName()
       
  1607         return None
  1643         return None
  1608     
  1644     
  1609     def SetConnectionWires(self, connection, connector):
  1645     def SetConnectionWires(self, connection, connector):
  1610         wires = connector.GetWires()
  1646         wires = connector.GetWires()
  1611         idx = 0
  1647         idx = 0