63 self.InitialSteps = [] |
63 self.InitialSteps = [] |
64 self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}} |
64 self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}} |
65 self.Program = "" |
65 self.Program = "" |
66 |
66 |
67 def IsAlreadyDefined(self, name): |
67 def IsAlreadyDefined(self, name): |
68 for list_type, retain, constant, vars in self.Interface: |
68 for list_type, retain, constant, located, vars in self.Interface: |
69 for var_type, var_name, var_address, var_initial in vars: |
69 for var_type, var_name, var_address, var_initial in vars: |
70 if name == var_name: |
70 if name == var_name: |
71 return True |
71 return True |
72 return False |
72 return False |
73 |
73 |
74 def GenerateInterface(self, interface): |
74 def GenerateInterface(self, interface): |
75 if self.Type == "FUNCTION": |
75 if self.Type == "FUNCTION": |
76 self.ReturnType = interface.getReturnType().getValue() |
76 self.ReturnType = interface.getReturnType().getValue() |
77 for varlist in interface.getContent(): |
77 for varlist in interface.getContent(): |
78 variables = [] |
78 variables = [] |
|
79 located = False |
79 for var in varlist["value"].getVariable(): |
80 for var in varlist["value"].getVariable(): |
80 type = var.getType().getValue() |
81 type = var.getType().getValue() |
81 initial = var.getInitialValue() |
82 initial = var.getInitialValue() |
82 if initial: |
83 if initial: |
83 initial_value = initial.getValue() |
84 initial_value = initial.getValue() |
84 else: |
85 else: |
85 initial_value = None |
86 initial_value = None |
86 address = var.getAddress() |
87 address = var.getAddress() |
87 if address == "": |
88 if address == "": |
88 address = None |
89 address = None |
|
90 else: |
|
91 located = True |
89 variables.append((type, var.getName(), address, initial_value)) |
92 variables.append((type, var.getName(), address, initial_value)) |
90 self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), |
93 self.Interface.append((varTypeNames[varlist["name"]], varlist["value"].getRetain(), |
91 varlist["value"].getConstant(), variables)) |
94 varlist["value"].getConstant(), located, variables)) |
92 |
95 |
93 def GenerateProgram(self, pou): |
96 def GenerateProgram(self, pou): |
94 body = pou.getBody() |
97 body = pou.getBody() |
95 body_content = body.getContent() |
98 body_content = body.getContent() |
96 body_type = body_content["name"] |
99 body_type = body_content["name"] |
141 value = self.ComputeFBDExpression(body, connections[0]) |
144 value = self.ComputeFBDExpression(body, connections[0]) |
142 vars.append(self.ExtractModifier(variable, value)) |
145 vars.append(self.ExtractModifier(variable, value)) |
143 variable = instance.outputVariables.getVariable()[0] |
146 variable = instance.outputVariables.getVariable()[0] |
144 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars))) |
147 return self.ExtractModifier(variable, "%s(%s)"%(type, ", ".join(vars))) |
145 elif block_infos["type"] == "functionBlock": |
148 elif block_infos["type"] == "functionBlock": |
146 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]: |
149 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]: |
147 self.Interface.append(("VAR", False, False, [])) |
150 self.Interface.append(("VAR", False, False, False, [])) |
148 if not self.IsAlreadyDefined(name): |
151 if not self.IsAlreadyDefined(name): |
149 self.Interface[-1][3].append((type, name, None, None)) |
152 self.Interface[-1][4].append((type, name, None, None)) |
150 vars = [] |
153 vars = [] |
151 for variable in instance.inputVariables.getVariable(): |
154 for variable in instance.inputVariables.getVariable(): |
152 connections = variable.connectionPointIn.getConnections() |
155 connections = variable.connectionPointIn.getConnections() |
153 if connections and len(connections) == 1: |
156 if connections and len(connections) == 1: |
154 parameter = variable.getFormalParameter() |
157 parameter = variable.getFormalParameter() |
427 elif edge.getValue() == "falling": |
430 elif edge.getValue() == "falling": |
428 return self.AddTrigger("F_TRIG", text) |
431 return self.AddTrigger("F_TRIG", text) |
429 return text |
432 return text |
430 |
433 |
431 def AddTrigger(self, edge, text): |
434 def AddTrigger(self, edge, text): |
432 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2]: |
435 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] or self.Interface[-1][2] or self.Interface[-1][3]: |
433 self.Interface.append(("VAR", False, False, [])) |
436 self.Interface.append(("VAR", False, False, False, [])) |
434 i = 1 |
437 i = 1 |
435 name = "%s%d"%(edge, i) |
438 name = "%s%d"%(edge, i) |
436 while self.IsAlreadyDefined(name): |
439 while self.IsAlreadyDefined(name): |
437 i += 1 |
440 i += 1 |
438 name = "%s%d"%(edge, i) |
441 name = "%s%d"%(edge, i) |
439 self.Interface[-1][3].append((edge, name, None, None)) |
442 self.Interface[-1][4].append((edge, name, None, None)) |
440 self.Program += " %s(CLK := %s);\n"%(name, text) |
443 self.Program += " %s(CLK := %s);\n"%(name, text) |
441 return "%s.Q"%name |
444 return "%s.Q"%name |
442 |
445 |
443 def GenerateSTProgram(self): |
446 def GenerateSTProgram(self): |
444 if self.ReturnType: |
447 if self.ReturnType: |
445 program = "%s %s : %s\n"%(self.Type, self.Name, self.ReturnType) |
448 program = "%s %s : %s\n"%(self.Type, self.Name, self.ReturnType) |
446 else: |
449 else: |
447 program = "%s %s\n"%(self.Type, self.Name) |
450 program = "%s %s\n"%(self.Type, self.Name) |
448 for list_type, retain, constant, variables in self.Interface: |
451 for list_type, retain, constant, located, variables in self.Interface: |
449 program += " %s"%list_type |
452 program += " %s"%list_type |
450 if retain: |
453 if retain: |
451 program += " RETAIN" |
454 program += " RETAIN" |
452 if constant: |
455 if constant: |
453 program += " CONSTANT" |
456 program += " CONSTANT" |
456 program += " %s "%var_name |
459 program += " %s "%var_name |
457 if var_address != None: |
460 if var_address != None: |
458 program += "AT %s "%var_address |
461 program += "AT %s "%var_address |
459 program += ": %s"%var_type |
462 program += ": %s"%var_type |
460 if var_initial != None: |
463 if var_initial != None: |
461 program += " := %s"%{"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial)) |
464 value = {"TRUE":"0","FALSE":"1"}.get(str(var_initial).upper(), str(var_initial)) |
|
465 if var_type in ["STRING", "WSTRING"]: |
|
466 program += " := \"%s\""%value |
|
467 else: |
|
468 program += " := %s"%value |
462 program += ";\n" |
469 program += ";\n" |
463 program += " END_VAR\n" |
470 program += " END_VAR\n" |
464 program += "\n" |
471 program += "\n" |
465 program += self.Program |
472 program += self.Program |
466 program += "END_%s\n\n"%self.Type |
473 program += "END_%s\n\n"%self.Type |
474 config += " RETAIN" |
481 config += " RETAIN" |
475 if varlist.getConstant(): |
482 if varlist.getConstant(): |
476 config += " CONSTANT" |
483 config += " CONSTANT" |
477 config += "\n" |
484 config += "\n" |
478 for var in varlist.getVariable(): |
485 for var in varlist.getVariable(): |
479 config += " %s "%var.getName() |
486 var_type = var.getType().getValue() |
|
487 config += " %s "%var.getName() |
480 address = var.getAddress() |
488 address = var.getAddress() |
481 if address: |
489 if address: |
482 config += "AT %s "%address |
490 config += "AT %s "%address |
483 config += ": %s"%var.getType().getValue() |
491 config += ": %s"%var_type |
484 initial = var.getInitialValue() |
492 initial = var.getInitialValue() |
485 if initial: |
493 if initial: |
486 value = str(initial.getValue()) |
494 value = str(initial.getValue()) |
487 config += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value) |
495 value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value) |
|
496 if var_type in ["STRING", "WSTRING"]: |
|
497 config += " := \"%s\""%value |
|
498 else: |
|
499 config += " := %s"%value |
488 config += ";\n" |
500 config += ";\n" |
489 config += " END_VAR\n" |
501 config += " END_VAR\n" |
490 for resource in configuration.getResource(): |
502 for resource in configuration.getResource(): |
491 config += self.GenerateResource(resource) |
503 config += self.GenerateResource(resource) |
492 config += "END_CONFIGURATION\n" |
504 config += "END_CONFIGURATION\n" |
493 return config |
505 return config |
494 |
506 |
495 def GenerateResource(self, resource): |
507 def GenerateResource(self, resource): |
496 resrce = "\n RESOURCE %s\n"%resource.getName() |
508 resrce = "\n RESOURCE %s ON BEREMIZ\n"%resource.getName() |
497 for varlist in resource.getGlobalVars(): |
509 for varlist in resource.getGlobalVars(): |
498 resrce += " VAR_GLOBAL" |
510 resrce += " VAR_GLOBAL" |
499 if varlist.getRetain(): |
511 if varlist.getRetain(): |
500 resrce += " RETAIN" |
512 resrce += " RETAIN" |
501 if varlist.getConstant(): |
513 if varlist.getConstant(): |
502 resrce += " CONSTANT" |
514 resrce += " CONSTANT" |
503 resrce += "\n" |
515 resrce += "\n" |
504 for var in varlist.getVariable(): |
516 for var in varlist.getVariable(): |
|
517 var_type = var.getType().getValue() |
505 resrce += " %s "%var.getName() |
518 resrce += " %s "%var.getName() |
506 address = var.getAddress() |
519 address = var.getAddress() |
507 if address: |
520 if address: |
508 resrce += "AT %s "%address |
521 resrce += "AT %s "%address |
509 resrce += ": %s"%var.getType().getValue() |
522 resrce += ": %s"%var.getType().getValue() |
510 initial = var.getInitialValue() |
523 initial = var.getInitialValue() |
511 if initial: |
524 if initial: |
512 value = str(initial.getValue()) |
525 value = str(initial.getValue()) |
513 resrce += " := %s"%{"TRUE":"0","FALSE":"1"}.get(value.upper(), value) |
526 value = {"TRUE":"0","FALSE":"1"}.get(value.upper(), value) |
|
527 if var_type in ["STRING", "WSTRING"]: |
|
528 resrce += " := \"%s\""%value |
|
529 else: |
|
530 resrce += " := %s"%value |
514 resrce += ";\n" |
531 resrce += ";\n" |
515 resrce += " END_VAR\n" |
532 resrce += " END_VAR\n" |
516 tasks = resource.getTask() |
533 tasks = resource.getTask() |
517 for task in tasks: |
534 for task in tasks: |
518 resrce += " TASK %s("%task.getName() |
535 resrce += " TASK %s("%task.getName() |