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() |