PLCGenerator.py
changeset 3704 c17fac18c663
parent 2727 6330e6bb345d
child 3750 f62625418bff
equal deleted inserted replaced
3703:4b75f1506ea1 3704:c17fac18c663
   275         config = [("\nCONFIGURATION ", ()),
   275         config = [("\nCONFIGURATION ", ()),
   276                   (configuration.getname(), (tagname, "name")),
   276                   (configuration.getname(), (tagname, "name")),
   277                   ("\n", ())]
   277                   ("\n", ())]
   278         var_number = 0
   278         var_number = 0
   279 
   279 
   280         varlists = [(varlist, varlist.getvariable()[:]) for varlist in configuration.getglobalVars()]
   280         varlists = configuration.getglobalVars()[:]
   281 
   281 
   282         extra_variables = self.Controler.GetConfigurationExtraVariables()
   282         extra_variables = self.Controler.GetConfigurationExtraVariables()
   283         extra_global_vars = None
   283         extra_CTN_globals = []
   284         if len(extra_variables) > 0 and len(varlists) == 0:
   284 
   285             extra_global_vars = PLCOpenParser.CreateElement("globalVars", "interface")
   285         for item in extra_variables:
   286             configuration.setglobalVars([extra_global_vars])
   286             if item.getLocalTag() == "globalVars":
   287             varlists = [(extra_global_vars, [])]
   287                 varlists.append(item)
   288 
   288             else:
   289         for variable in extra_variables:
   289                 extra_CTN_globals.append(item)
   290             varlists[-1][0].appendvariable(variable)
   290 
   291             varlists[-1][1].append(variable)
   291         if len(extra_CTN_globals) > 0:
       
   292             extra_varlist = PLCOpenParser.CreateElement("globalVars", "interface")
       
   293 
       
   294             for variable in extra_CTN_globals:
       
   295                 extra_varlist.appendvariable(variable)
       
   296 
       
   297             varlists.append(extra_varlist)
   292 
   298 
   293         # Generate any global variable in configuration
   299         # Generate any global variable in configuration
   294         for varlist, varlist_variables in varlists:
   300         for varlist in varlists:
   295             variable_type = errorVarTypes.get("VAR_GLOBAL", "var_local")
   301             variable_type = errorVarTypes.get("VAR_GLOBAL", "var_local")
   296             # Generate variable block with modifier
   302             # Generate variable block with modifier
   297             config += [("  VAR_GLOBAL", ())]
   303             config += [("  VAR_GLOBAL", ())]
   298             if varlist.getconstant():
   304             if varlist.getconstant():
   299                 config += [(" CONSTANT", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "constant"))]
   305                 config += [(" CONSTANT", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "constant"))]
   301                 config += [(" RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "retain"))]
   307                 config += [(" RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "retain"))]
   302             elif varlist.getnonretain():
   308             elif varlist.getnonretain():
   303                 config += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   309                 config += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   304             config += [("\n", ())]
   310             config += [("\n", ())]
   305             # Generate any variable of this block
   311             # Generate any variable of this block
   306             for var in varlist_variables:
   312             for var in varlist.getvariable():
   307                 vartype_content = var.gettype().getcontent()
   313                 vartype_content = var.gettype().getcontent()
   308                 if vartype_content.getLocalTag() == "derived":
   314                 if vartype_content.getLocalTag() == "derived":
   309                     var_type = vartype_content.getname()
   315                     var_type = vartype_content.getname()
   310                     self.GenerateDataType(var_type)
   316                     self.GenerateDataType(var_type)
   311                 else:
   317                 else:
   328                     config += [(" := ", ()),
   334                     config += [(" := ", ()),
   329                                (self.ComputeValue(initial.getvalue(), var_type), (tagname, variable_type, var_number, "initial value"))]
   335                                (self.ComputeValue(initial.getvalue(), var_type), (tagname, variable_type, var_number, "initial value"))]
   330                 config += [(";\n", ())]
   336                 config += [(";\n", ())]
   331                 var_number += 1
   337                 var_number += 1
   332             config += [("  END_VAR\n", ())]
   338             config += [("  END_VAR\n", ())]
   333 
       
   334         if extra_global_vars is not None:
       
   335             configuration.remove(extra_global_vars)
       
   336         else:
       
   337             for variable in extra_variables:
       
   338                 varlists[-1][0].remove(variable)
       
   339 
   339 
   340         # Generate any resource in the configuration
   340         # Generate any resource in the configuration
   341         for resource in configuration.getresource():
   341         for resource in configuration.getresource():
   342             config += self.GenerateResource(resource, configuration.getname())
   342             config += self.GenerateResource(resource, configuration.getname())
   343         config += [("END_CONFIGURATION\n", ())]
   343         config += [("END_CONFIGURATION\n", ())]
   456             instance_number += 1
   456             instance_number += 1
   457         resrce += [("  END_RESOURCE\n", ())]
   457         resrce += [("  END_RESOURCE\n", ())]
   458         return resrce
   458         return resrce
   459 
   459 
   460     # Generate the entire program for current project
   460     # Generate the entire program for current project
   461     def GenerateProgram(self, log):
   461     def GenerateProgram(self, log, noconfig=False):
   462         log("Collecting data types")
   462         log("Collecting data types")
   463         # Find all data types defined
   463         # Find all data types defined
   464         for datatype in self.Project.getdataTypes():
   464         for datatype in self.Project.getdataTypes():
   465             self.DatatypeComputed[datatype.getname()] = False
   465             self.DatatypeComputed[datatype.getname()] = False
   466         log("Collecting POUs")
   466         log("Collecting POUs")
   478             self.Program += [("END_TYPE\n\n", ())]
   478             self.Program += [("END_TYPE\n\n", ())]
   479         # Generate every POUs defined
   479         # Generate every POUs defined
   480         for pou_name in self.PouComputed.keys():
   480         for pou_name in self.PouComputed.keys():
   481             log("Generate POU %s"%pou_name)
   481             log("Generate POU %s"%pou_name)
   482             self.GeneratePouProgram(pou_name)
   482             self.GeneratePouProgram(pou_name)
       
   483         if noconfig:
       
   484             return
   483         # Generate every configurations defined
   485         # Generate every configurations defined
   484         log("Generate Config(s)")
   486         log("Generate Config(s)")
   485         for config in self.Project.getconfigurations():
   487         for config in self.Project.getconfigurations():
   486             self.Program += self.GenerateConfiguration(config)
   488             self.Program += self.GenerateConfiguration(config)
   487 
   489 
  1763         program += self.Program
  1765         program += self.Program
  1764         program += [("END_%s\n\n" % self.Type, ())]
  1766         program += [("END_%s\n\n" % self.Type, ())]
  1765         return program
  1767         return program
  1766 
  1768 
  1767 
  1769 
  1768 def GenerateCurrentProgram(controler, project, errors, warnings):
  1770 def GenerateCurrentProgram(controler, project, errors, warnings, **kwargs):
  1769     generator = ProgramGenerator(controler, project, errors, warnings)
  1771     generator = ProgramGenerator(controler, project, errors, warnings)
  1770     if hasattr(controler, "logger"):
  1772     if hasattr(controler, "logger"):
  1771         def log(txt):
  1773         def log(txt):
  1772             controler.logger.write("    "+txt+"\n")
  1774             controler.logger.write("    "+txt+"\n")
  1773     else:
  1775     else:
  1774         def log(txt):
  1776         def log(txt):
  1775             pass
  1777             pass
  1776 
  1778 
  1777     generator.GenerateProgram(log)
  1779     generator.GenerateProgram(log,**kwargs)
  1778     return generator.GetGeneratedProgram()
  1780     return generator.GetGeneratedProgram()