PLCControler.py
changeset 1321 83f41ea00b97
parent 1319 748347102c97
child 1322 0a9227f743b3
equal deleted inserted replaced
1320:bb04c41cbee9 1321:83f41ea00b97
   275             self.apply_templates(context, datatype_instance, output_parent)
   275             self.apply_templates(context, datatype_instance, output_parent)
   276             return
   276             return
   277 
   277 
   278 instances_path_xslt = etree.parse(
   278 instances_path_xslt = etree.parse(
   279     os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"))
   279     os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"))
       
   280 
       
   281 #-------------------------------------------------------------------------------
       
   282 #            Helpers object for generating instance tagname
       
   283 #-------------------------------------------------------------------------------
       
   284 
       
   285 class InstanceTagName(etree.XSLTExtension):
       
   286 
       
   287     def __init__(self, controller):
       
   288         etree.XSLTExtension.__init__(self)
       
   289         self.Controller = controller
       
   290     
       
   291     def GetTagName(self, infos):
       
   292         return ""
       
   293     
       
   294     def execute(self, context, self_node, input_node, output_parent):
       
   295         tagname_infos = etree.Element('infos')
       
   296         self.process_children(context, tagname_infos)
       
   297         tagname = etree.Element('tagname')
       
   298         tagname.text = self.GetTagName(tagname_infos)
       
   299         output_parent.append(tagname)
       
   300 
       
   301 class ConfigTagName(InstanceTagName):
       
   302     
       
   303     def GetTagName(self, infos):
       
   304         return self.Controller.ComputeConfigurationName(infos.get("name"))
       
   305         
       
   306 class ResourceTagName(InstanceTagName):
       
   307     
       
   308     def GetTagName(self, infos):
       
   309         return self.Controller.ComputeConfigurationResourceName(
       
   310             infos.get("config_name"), infos.get("name"))
       
   311 
       
   312 class PouTagName(InstanceTagName):
       
   313     
       
   314     def GetTagName(self, infos):
       
   315         return self.Controller.ComputePouName(infos.get("name"))
       
   316 
       
   317 class ActionTagName(InstanceTagName):
       
   318     
       
   319     def GetTagName(self, infos):
       
   320         return self.Controller.ComputePouActionName(
       
   321             infos.get("pou_name"), infos.get("name"))
       
   322 
       
   323 class TransitionTagName(InstanceTagName):
       
   324     
       
   325     def GetTagName(self, infos):
       
   326         return self.Controller.ComputePouTransitionName(
       
   327             infos.get("pou_name"), infos.get("name"))
       
   328 
       
   329 instance_tagname_xslt = etree.parse(
       
   330     os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"))
   280 
   331 
   281 #-------------------------------------------------------------------------------
   332 #-------------------------------------------------------------------------------
   282 #                         Undo Buffer for PLCOpenEditor
   333 #                         Undo Buffer for PLCOpenEditor
   283 #-------------------------------------------------------------------------------
   334 #-------------------------------------------------------------------------------
   284 
   335 
   585             else:
   636             else:
   586                 obj = self.GetEditedElement(tagname, debug)
   637                 obj = self.GetEditedElement(tagname, debug)
   587             if obj is not None:
   638             if obj is not None:
   588                 return compute_instance_tree(
   639                 return compute_instance_tree(
   589                         pou_variable_xslt_tree(obj).getroot())
   640                         pou_variable_xslt_tree(obj).getroot())
   590         return []
   641         return None
   591 
   642 
   592     def GetInstanceList(self, root, name, debug = False):
   643     def GetInstanceList(self, root, name, debug = False):
   593         project = self.GetProject(debug)
   644         project = self.GetProject(debug)
   594         if project is not None:
   645         if project is not None:
   595             instances_path_xslt_tree = etree.XSLT(
   646             instances_path_xslt_tree = etree.XSLT(
   619                 return ["%s.%s" % (instance, words[2])
   670                 return ["%s.%s" % (instance, words[2])
   620                         for instance in self.SearchPouInstances(
   671                         for instance in self.SearchPouInstances(
   621                             self.ComputePouName(words[1]), debug)]
   672                             self.ComputePouName(words[1]), debug)]
   622         return []
   673         return []
   623     
   674     
   624     def RecursiveGetPouInstanceTagName(self, project, pou_type, parts, debug = False):
       
   625         pou = project.getpou(pou_type)
       
   626         if pou is not None:
       
   627             if len(parts) == 0:
       
   628                 return self.ComputePouName(pou_type)
       
   629             
       
   630             for varlist_type, varlist in pou.getvars():
       
   631                 for variable in varlist.getvariable():
       
   632                     if variable.getname() == parts[0]:
       
   633                         vartype_content = variable.gettype().getcontent()
       
   634                         if vartype_content.getLocalTag() == "derived":
       
   635                             return self.RecursiveGetPouInstanceTagName(
       
   636                                             project, 
       
   637                                             vartype_content.getname(),
       
   638                                             parts[1:], debug)
       
   639             
       
   640             if pou.getbodyType() == "SFC" and len(parts) == 1:
       
   641                 for action in pou.getactionList():
       
   642                     if action.getname() == parts[0]:
       
   643                         return self.ComputePouActionName(pou_type, parts[0])
       
   644                 for transition in pou.gettransitionList():
       
   645                     if transition.getname() == parts[0]:
       
   646                         return self.ComputePouTransitionName(pou_type, parts[0])
       
   647         else:
       
   648             block_infos = self.GetBlockType(pou_type, debug=debug)
       
   649             if (block_infos is not None and 
       
   650                 block_infos["type"] in ["program", "functionBlock"]):
       
   651                 
       
   652                 if len(parts) == 0:
       
   653                     return self.ComputePouName(pou_type)
       
   654                 
       
   655                 for varname, vartype, varmodifier in block_infos["inputs"] + block_infos["outputs"]:
       
   656                     if varname == parts[0]:
       
   657                         return self.RecursiveGetPouInstanceTagName(project, vartype, parts[1:], debug)
       
   658         return None
       
   659     
       
   660     def GetGlobalInstanceTagName(self, project, element, parts, debug = False):
       
   661         for varlist in element.getglobalVars():
       
   662             for variable in varlist.getvariable():
       
   663                 if variable.getname() == parts[0]:
       
   664                     vartype_content = variable.gettype().getcontent()
       
   665                     if vartype_content.getLocalTag() == "derived":                        
       
   666                         if len(parts) == 1:
       
   667                             return self.ComputePouName(
       
   668                                         vartype_content.getname())
       
   669                         else:
       
   670                             return self.RecursiveGetPouInstanceTagName(
       
   671                                         project, 
       
   672                                         vartype_content.getname(),
       
   673                                         parts[1:], debug)
       
   674         return None
       
   675     
       
   676     def GetPouInstanceTagName(self, instance_path, debug = False):
   675     def GetPouInstanceTagName(self, instance_path, debug = False):
   677         project = self.GetProject(debug)
   676         project = self.GetProject(debug)
   678         parts = instance_path.split(".")
   677         
   679         if len(parts) == 1:
   678         instance_tagname_xslt_tree = etree.XSLT(
   680             return self.ComputeConfigurationName(parts[0])
   679             instance_tagname_xslt, 
   681         elif len(parts) == 2:
   680             extensions = {
   682             for config in project.getconfigurations():
   681                 ("instance_tagname_ns", "instance_definition"): InstanceDefinition(self, debug),
   683                 if config.getname() == parts[0]:
   682                 ("instance_tagname_ns", "config_tagname"): ConfigTagName(self),
   684                     result = self.GetGlobalInstanceTagName(project, 
   683                 ("instance_tagname_ns", "resource_tagname"): ResourceTagName(self),
   685                                                            config, 
   684                 ("instance_tagname_ns", "pou_tagname"): PouTagName(self),
   686                                                            parts[1:],
   685                 ("instance_tagname_ns", "action_tagname"): ActionTagName(self),
   687                                                            debug)
   686                 ("instance_tagname_ns", "transition_tagname"): TransitionTagName(self)})
   688                     if result is not None:
   687         
   689                         return result
   688         result = instance_tagname_xslt_tree(project, 
   690             return self.ComputeConfigurationResourceName(parts[0], parts[1])
   689                 instance_path=etree.XSLT.strparam(instance_path)).getroot()
   691         else:
   690         if result is not None:
   692             for config in project.getconfigurations():
   691             return result.text
   693                 if config.getname() == parts[0]:
   692         
   694                     for resource in config.getresource():
       
   695                         if resource.getname() == parts[1]:
       
   696                             pou_instances = resource.getpouInstance()[:]
       
   697                             for task in resource.gettask():
       
   698                                 pou_instances.extend(task.getpouInstance())
       
   699                             for pou_instance in pou_instances:
       
   700                                 if pou_instance.getname() == parts[2]:
       
   701                                     if len(parts) == 3:
       
   702                                         return self.ComputePouName(
       
   703                                                     pou_instance.gettypeName())
       
   704                                     else:
       
   705                                         return self.RecursiveGetPouInstanceTagName(
       
   706                                                     project,
       
   707                                                     pou_instance.gettypeName(),
       
   708                                                     parts[3:], debug)
       
   709                             return self.GetGlobalInstanceTagName(project, 
       
   710                                                                  resource, 
       
   711                                                                  parts[2:], 
       
   712                                                                  debug)
       
   713                     return self.GetGlobalInstanceTagName(project, 
       
   714                                                          config, 
       
   715                                                          parts[1:],
       
   716                                                          debug)
       
   717         return None
   693         return None
   718     
   694     
   719     def GetInstanceInfos(self, instance_path, debug = False):
   695     def GetInstanceInfos(self, instance_path, debug = False):
   720         tagname = self.GetPouInstanceTagName(instance_path)
   696         tagname = self.GetPouInstanceTagName(instance_path)
   721         if tagname is not None:
   697         if tagname is not None:
  1673         basetype_content_type = basetype_content.getLocalTag()
  1649         basetype_content_type = basetype_content.getLocalTag()
  1674         if basetype_content_type in ["enum", "struct"]:
  1650         if basetype_content_type in ["enum", "struct"]:
  1675             return False
  1651             return False
  1676         elif basetype_content_type == "derived":
  1652         elif basetype_content_type == "derived":
  1677             return self.IsLocatableType(basetype_content.getname())
  1653             return self.IsLocatableType(basetype_content.getname())
  1678         elif basetype_content_name == "array":
  1654         elif basetype_content_type == "array":
  1679             array_base_type = basetype_content.baseType.getcontent()
  1655             array_base_type = basetype_content.baseType.getcontent()
  1680             if array_base_type.getLocalTag() == "derived":
  1656             if array_base_type.getLocalTag() == "derived":
  1681                 return self.IsLocatableType(array_base_type.getname(), debug)
  1657                 return self.IsLocatableType(array_base_type.getname(), debug)
  1682         return True
  1658         return True
  1683         
  1659         
  3074                 new_instance["Task"] = ""
  3050                 new_instance["Task"] = ""
  3075                 instances_data.append(new_instance)
  3051                 instances_data.append(new_instance)
  3076             return tasks_data, instances_data
  3052             return tasks_data, instances_data
  3077 
  3053 
  3078     def OpenXMLFile(self, filepath):
  3054     def OpenXMLFile(self, filepath):
  3079         try:
  3055         #try:
  3080             self.Project = LoadProject(filepath)
  3056         self.Project = LoadProject(filepath)
  3081         except Exception, e:
  3057         #except Exception, e:
  3082             return _("Project file syntax error:\n\n") + str(e)
  3058         #    return _("Project file syntax error:\n\n") + str(e)
  3083         self.SetFilePath(filepath)
  3059         self.SetFilePath(filepath)
  3084         self.CreateProjectBuffer(True)
  3060         self.CreateProjectBuffer(True)
  3085         self.ProgramChunks = []
  3061         self.ProgramChunks = []
  3086         self.ProgramOffset = 0
  3062         self.ProgramOffset = 0
  3087         self.NextCompiledProject = self.Copy(self.Project)
  3063         self.NextCompiledProject = self.Copy(self.Project)