112 |
112 |
113 # Compute value according to type given |
113 # Compute value according to type given |
114 def ComputeValue(self, value, var_type): |
114 def ComputeValue(self, value, var_type): |
115 base_type = self.Controler.GetBaseType(var_type) |
115 base_type = self.Controler.GetBaseType(var_type) |
116 if base_type == "STRING" and not value.startswith("'") and not value.endswith("'"): |
116 if base_type == "STRING" and not value.startswith("'") and not value.endswith("'"): |
117 return "'%s'"%value |
117 return "'%s'" % value |
118 elif base_type == "WSTRING" and not value.startswith('"') and not value.endswith('"'): |
118 elif base_type == "WSTRING" and not value.startswith('"') and not value.endswith('"'): |
119 return "\"%s\""%value |
119 return "\"%s\"" % value |
120 return value |
120 return value |
121 |
121 |
122 # Generate a data type from its name |
122 # Generate a data type from its name |
123 def GenerateDataType(self, datatype_name): |
123 def GenerateDataType(self, datatype_name): |
124 # Verify that data type hasn't been generated yet |
124 # Verify that data type hasn't been generated yet |
152 basetype_name = base_type_type |
152 basetype_name = base_type_type |
153 min_value = basetype_content.range.getlower() |
153 min_value = basetype_content.range.getlower() |
154 max_value = basetype_content.range.getupper() |
154 max_value = basetype_content.range.getupper() |
155 datatype_def += [(basetype_name, (tagname, "base")), |
155 datatype_def += [(basetype_name, (tagname, "base")), |
156 (" (", ()), |
156 (" (", ()), |
157 ("%s"%min_value, (tagname, "lower")), |
157 ("%s" % min_value, (tagname, "lower")), |
158 ("..", ()), |
158 ("..", ()), |
159 ("%s"%max_value, (tagname, "upper")), |
159 ("%s" % max_value, (tagname, "upper")), |
160 (")",())] |
160 (")",())] |
161 # Data type is an enumerated type |
161 # Data type is an enumerated type |
162 elif basetype_content_type == "enum": |
162 elif basetype_content_type == "enum": |
163 values = [[(value.getname(), (tagname, "value", i))] |
163 values = [[(value.getname(), (tagname, "value", i))] |
164 for i, value in enumerate( |
164 for i, value in enumerate( |
176 basetype_name = base_type.getname() |
176 basetype_name = base_type.getname() |
177 self.GenerateDataType(basetype_name) |
177 self.GenerateDataType(basetype_name) |
178 # Array derived directly from an elementary type |
178 # Array derived directly from an elementary type |
179 else: |
179 else: |
180 basetype_name = base_type_type.upper() |
180 basetype_name = base_type_type.upper() |
181 dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")), |
181 dimensions = [[("%s" % dimension.getlower(), (tagname, "range", i, "lower")), |
182 ("..", ()), |
182 ("..", ()), |
183 ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))] |
183 ("%s" % dimension.getupper(), (tagname, "range", i, "upper"))] |
184 for i, dimension in enumerate(basetype_content.getdimension())] |
184 for i, dimension in enumerate(basetype_content.getdimension())] |
185 datatype_def += [("ARRAY [", ())] |
185 datatype_def += [("ARRAY [", ())] |
186 datatype_def += JoinList([(",", ())], dimensions) |
186 datatype_def += JoinList([(",", ())], dimensions) |
187 datatype_def += [("] OF " , ()), |
187 datatype_def += [("] OF " , ()), |
188 (basetype_name, (tagname, "base"))] |
188 (basetype_name, (tagname, "base"))] |
249 # Create a POU program generator |
249 # Create a POU program generator |
250 pou_program = PouProgramGenerator(self, pou.getname(), pouTypeNames[pou_type], self.Errors, self.Warnings) |
250 pou_program = PouProgramGenerator(self, pou.getname(), pouTypeNames[pou_type], self.Errors, self.Warnings) |
251 program = pou_program.GenerateProgram(pou) |
251 program = pou_program.GenerateProgram(pou) |
252 self.Program += program |
252 self.Program += program |
253 else: |
253 else: |
254 raise PLCGenException, _("Undefined pou type \"%s\"")%pou_type |
254 raise PLCGenException, _("Undefined pou type \"%s\"") % pou_type |
255 |
255 |
256 # Generate a POU defined and used in text |
256 # Generate a POU defined and used in text |
257 def GeneratePouProgramInText(self, text): |
257 def GeneratePouProgramInText(self, text): |
258 for pou_name in self.PouComputed.keys(): |
258 for pou_name in self.PouComputed.keys(): |
259 model = re.compile("(?:^|[^0-9^A-Z])%s(?:$|[^0-9^A-Z])"%pou_name.upper()) |
259 model = re.compile("(?:^|[^0-9^A-Z])%s(?:$|[^0-9^A-Z])" % pou_name.upper()) |
260 if model.search(text) is not None: |
260 if model.search(text) is not None: |
261 self.GeneratePouProgram(pou_name) |
261 self.GeneratePouProgram(pou_name) |
262 |
262 |
263 # Generate a configuration from its model |
263 # Generate a configuration from its model |
264 def GenerateConfiguration(self, configuration): |
264 def GenerateConfiguration(self, configuration): |
421 ## if interval.microsecond != 0: |
421 ## if interval.microsecond != 0: |
422 ## resrce += [("%dms"%(interval.microsecond / 1000), (tagname, "task", task_number, "interval", "millisecond"))] |
422 ## resrce += [("%dms"%(interval.microsecond / 1000), (tagname, "task", task_number, "interval", "millisecond"))] |
423 ## resrce += [(",", ())] |
423 ## resrce += [(",", ())] |
424 # Priority argument |
424 # Priority argument |
425 resrce += [("PRIORITY := ", ()), |
425 resrce += [("PRIORITY := ", ()), |
426 ("%d"%task.getpriority(), (tagname, "task", task_number, "priority")), |
426 ("%d" % task.getpriority(), (tagname, "task", task_number, "priority")), |
427 (");\n", ())] |
427 (");\n", ())] |
428 task_number += 1 |
428 task_number += 1 |
429 instance_number = 0 |
429 instance_number = 0 |
430 # Generate any program assign to each task |
430 # Generate any program assign to each task |
431 for task in tasks: |
431 for task in tasks: |
824 for instance in undefined_blocks: |
824 for instance in undefined_blocks: |
825 block_infos = self.GetBlockType(instance.gettypeName(), tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"])) |
825 block_infos = self.GetBlockType(instance.gettypeName(), tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"])) |
826 if block_infos is not None: |
826 if block_infos is not None: |
827 self.ComputeBlockInputTypes(instance, block_infos, body) |
827 self.ComputeBlockInputTypes(instance, block_infos, body) |
828 else: |
828 else: |
829 raise PLCGenException, _("No informations found for \"%s\" block")%(instance.gettypeName()) |
829 raise PLCGenException, _("No informations found for \"%s\" block") % (instance.gettypeName()) |
830 if body_type == "SFC": |
830 if body_type == "SFC": |
831 previous_tagname = self.TagName |
831 previous_tagname = self.TagName |
832 for action in pou.getactionList(): |
832 for action in pou.getactionList(): |
833 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action.getname()) |
833 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action.getname()) |
834 self.ComputeConnectionTypes(action) |
834 self.ComputeConnectionTypes(action) |
1073 if one_input_connected: |
1073 if one_input_connected: |
1074 for i, variable in enumerate(output_variables): |
1074 for i, variable in enumerate(output_variables): |
1075 parameter = variable.getformalParameter() |
1075 parameter = variable.getformalParameter() |
1076 if not inout_variables.has_key(parameter) and parameter in output_names + ["", "ENO"]: |
1076 if not inout_variables.has_key(parameter) and parameter in output_names + ["", "ENO"]: |
1077 if variable.getformalParameter() == "": |
1077 if variable.getformalParameter() == "": |
1078 variable_name = "%s%d"%(type, block.getlocalId()) |
1078 variable_name = "%s%d" % (type, block.getlocalId()) |
1079 else: |
1079 else: |
1080 variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter) |
1080 variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter) |
1081 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1081 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1082 self.Interface.append(("VAR", None, False, [])) |
1082 self.Interface.append(("VAR", None, False, [])) |
1083 if variable.connectionPointOut in self.ConnectionTypes: |
1083 if variable.connectionPointOut in self.ConnectionTypes: |
1084 self.Interface[-1][3].append((self.ConnectionTypes[variable.connectionPointOut], variable_name, None, None)) |
1084 self.Interface[-1][3].append((self.ConnectionTypes[variable.connectionPointOut], variable_name, None, None)) |
1085 else: |
1085 else: |
1086 self.Interface[-1][3].append(("ANY", variable_name, None, None)) |
1086 self.Interface[-1][3].append(("ANY", variable_name, None, None)) |
1087 if len(output_variables) > 1 and parameter not in ["", "OUT"]: |
1087 if len(output_variables) > 1 and parameter not in ["", "OUT"]: |
1088 vars.append([(parameter, (self.TagName, "block", block.getlocalId(), "output", i)), |
1088 vars.append([(parameter, (self.TagName, "block", block.getlocalId(), "output", i)), |
1089 (" => %s"%variable_name, ())]) |
1089 (" => %s" % variable_name, ())]) |
1090 else: |
1090 else: |
1091 output_info = (self.TagName, "block", block.getlocalId(), "output", i) |
1091 output_info = (self.TagName, "block", block.getlocalId(), "output", i) |
1092 output_name = variable_name |
1092 output_name = variable_name |
1093 self.Program += [(self.CurrentIndent, ()), |
1093 self.Program += [(self.CurrentIndent, ()), |
1094 (output_name, output_info), |
1094 (output_name, output_info), |
1157 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx) |
1157 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx) |
1158 if inout_variables.has_key(output_parameter): |
1158 if inout_variables.has_key(output_parameter): |
1159 output_value = inout_variables[output_parameter] |
1159 output_value = inout_variables[output_parameter] |
1160 else: |
1160 else: |
1161 if output_parameter == "": |
1161 if output_parameter == "": |
1162 output_name = "%s%d"%(type, block.getlocalId()) |
1162 output_name = "%s%d" % (type, block.getlocalId()) |
1163 else: |
1163 else: |
1164 output_name = "%s%d_%s"%(type, block.getlocalId(), output_parameter) |
1164 output_name = "%s%d_%s" % (type, block.getlocalId(), output_parameter) |
1165 output_value = [(output_name, output_info)] |
1165 output_value = [(output_name, output_info)] |
1166 return self.ExtractModifier(output_variable, output_value, output_info) |
1166 return self.ExtractModifier(output_variable, output_value, output_info) |
1167 |
1167 |
1168 if block_infos["type"] == "functionBlock": |
1168 if block_infos["type"] == "functionBlock": |
1169 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx) |
1169 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx) |
1170 output_name = self.ExtractModifier(output_variable, [("%s.%s"%(name, output_parameter), output_info)], output_info) |
1170 output_name = self.ExtractModifier(output_variable, [("%s.%s" % (name, output_parameter), output_info)], output_info) |
1171 if to_inout: |
1171 if to_inout: |
1172 variable_name = "%s_%s"%(name, output_parameter) |
1172 variable_name = "%s_%s" % (name, output_parameter) |
1173 if not self.IsAlreadyDefined(variable_name): |
1173 if not self.IsAlreadyDefined(variable_name): |
1174 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1174 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1175 self.Interface.append(("VAR", None, False, [])) |
1175 self.Interface.append(("VAR", None, False, [])) |
1176 if variable.connectionPointOut in self.ConnectionTypes: |
1176 if variable.connectionPointOut in self.ConnectionTypes: |
1177 self.Interface[-1][3].append( |
1177 self.Interface[-1][3].append( |
1178 (self.ConnectionTypes[output_variable.connectionPointOut], variable_name, None, None)) |
1178 (self.ConnectionTypes[output_variable.connectionPointOut], variable_name, None, None)) |
1179 else: |
1179 else: |
1180 self.Interface[-1][3].append(("ANY", variable_name, None, None)) |
1180 self.Interface[-1][3].append(("ANY", variable_name, None, None)) |
1181 self.Program += [(self.CurrentIndent, ()), |
1181 self.Program += [(self.CurrentIndent, ()), |
1182 ("%s := "%variable_name, ())] |
1182 ("%s := " % variable_name, ())] |
1183 self.Program += output_name |
1183 self.Program += output_name |
1184 self.Program += [(";\n", ())] |
1184 self.Program += [(";\n", ())] |
1185 return [(variable_name, ())] |
1185 return [(variable_name, ())] |
1186 return output_name |
1186 return output_name |
1187 if link is not None: |
1187 if link is not None: |
1313 |
1313 |
1314 def AddTrigger(self, edge, expression, var_info): |
1314 def AddTrigger(self, edge, expression, var_info): |
1315 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1315 if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]: |
1316 self.Interface.append(("VAR", None, False, [])) |
1316 self.Interface.append(("VAR", None, False, [])) |
1317 i = 1 |
1317 i = 1 |
1318 name = "%s%d"%(edge, i) |
1318 name = "%s%d" % (edge, i) |
1319 while self.IsAlreadyDefined(name): |
1319 while self.IsAlreadyDefined(name): |
1320 i += 1 |
1320 i += 1 |
1321 name = "%s%d"%(edge, i) |
1321 name = "%s%d" % (edge, i) |
1322 self.Interface[-1][3].append((edge, name, None, None)) |
1322 self.Interface[-1][3].append((edge, name, None, None)) |
1323 self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())] |
1323 self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())] |
1324 self.Program += expression |
1324 self.Program += expression |
1325 self.Program += [(");\n", ())] |
1325 self.Program += [(");\n", ())] |
1326 return [("%s.Q"%name, var_info)] |
1326 return [("%s.Q" % name, var_info)] |
1327 |
1327 |
1328 def ExtractDivergenceInput(self, divergence, pou): |
1328 def ExtractDivergenceInput(self, divergence, pou): |
1329 connectionPointIn = divergence.getconnectionPointIn() |
1329 connectionPointIn = divergence.getconnectionPointIn() |
1330 if connectionPointIn is not None: |
1330 if connectionPointIn is not None: |
1331 connections = connectionPointIn.getconnections() |
1331 connections = connectionPointIn.getconnections() |
1439 if "indicator" in action: |
1439 if "indicator" in action: |
1440 action_infos["indicator"] = action["indicator"] |
1440 action_infos["indicator"] = action["indicator"] |
1441 if action["type"] == "reference": |
1441 if action["type"] == "reference": |
1442 self.GenerateSFCAction(action["value"], pou) |
1442 self.GenerateSFCAction(action["value"], pou) |
1443 else: |
1443 else: |
1444 action_name = "%s_INLINE%d"%(step_name.upper(), self.GetActionNumber()) |
1444 action_name = "%s_INLINE%d" % (step_name.upper(), self.GetActionNumber()) |
1445 self.SFCNetworks["Actions"][action_name] = ([(self.CurrentIndent, ()), |
1445 self.SFCNetworks["Actions"][action_name] = ([(self.CurrentIndent, ()), |
1446 (action["value"], (self.TagName, "action_block", action_infos["id"], "action", i, "inline")), |
1446 (action["value"], (self.TagName, "action_block", action_infos["id"], "action", i, "inline")), |
1447 ("\n", ())], ()) |
1447 ("\n", ())], ()) |
1448 action_infos["content"] = action_name |
1448 action_infos["content"] = action_name |
1449 self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos) |
1449 self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos) |
1486 "to" : [], |
1486 "to" : [], |
1487 "content": []} |
1487 "content": []} |
1488 self.SFCNetworks["Transitions"][transition] = transition_infos |
1488 self.SFCNetworks["Transitions"][transition] = transition_infos |
1489 transitionValues = transition.getconditionContent() |
1489 transitionValues = transition.getconditionContent() |
1490 if transitionValues["type"] == "inline": |
1490 if transitionValues["type"] == "inline": |
1491 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()), |
1491 transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ()), |
1492 (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")), |
1492 (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")), |
1493 (";\n", ())] |
1493 (";\n", ())] |
1494 elif transitionValues["type"] == "reference": |
1494 elif transitionValues["type"] == "reference": |
1495 transitionContent = pou.gettransition(transitionValues["value"]) |
1495 transitionContent = pou.gettransition(transitionValues["value"]) |
1496 transitionType = transitionContent.getbodyType() |
1496 transitionType = transitionContent.getbodyType() |
1509 or isinstance(instance, CoilClass) and instance.getvariable() == transitionValues["value"]: |
1509 or isinstance(instance, CoilClass) and instance.getvariable() == transitionValues["value"]: |
1510 connections = instance.connectionPointIn.getconnections() |
1510 connections = instance.connectionPointIn.getconnections() |
1511 if connections is not None: |
1511 if connections is not None: |
1512 expression = self.ComputeExpression(transitionBody, connections) |
1512 expression = self.ComputeExpression(transitionBody, connections) |
1513 if expression is not None: |
1513 if expression is not None: |
1514 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |
1514 transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())] |
1515 self.SFCComputedBlocks += self.Program |
1515 self.SFCComputedBlocks += self.Program |
1516 self.Program = [] |
1516 self.Program = [] |
1517 if not transition_infos.has_key("content"): |
1517 if not transition_infos.has_key("content"): |
1518 raise PLCGenException, _("Transition \"%s\" body must contain an output variable or coil referring to its name") % transitionValues["value"] |
1518 raise PLCGenException, _("Transition \"%s\" body must contain an output variable or coil referring to its name") % transitionValues["value"] |
1519 self.TagName = previous_tagname |
1519 self.TagName = previous_tagname |
1523 body = body[0] |
1523 body = body[0] |
1524 connections = transitionValues["value"].getconnections() |
1524 connections = transitionValues["value"].getconnections() |
1525 if connections is not None: |
1525 if connections is not None: |
1526 expression = self.ComputeExpression(body, connections) |
1526 expression = self.ComputeExpression(body, connections) |
1527 if expression is not None: |
1527 if expression is not None: |
1528 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |
1528 transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())] |
1529 self.SFCComputedBlocks += self.Program |
1529 self.SFCComputedBlocks += self.Program |
1530 self.Program = [] |
1530 self.Program = [] |
1531 for step in steps: |
1531 for step in steps: |
1532 self.GenerateSFCStep(step, pou) |
1532 self.GenerateSFCStep(step, pou) |
1533 step_name = step.getname() |
1533 step_name = step.getname() |
1562 if "indicator" in action_infos: |
1562 if "indicator" in action_infos: |
1563 self.Program += [(", ", ()), |
1563 self.Program += [(", ", ()), |
1564 (action_infos["indicator"], action_info + ("indicator",))] |
1564 (action_infos["indicator"], action_info + ("indicator",))] |
1565 self.Program += [(");\n", ())] |
1565 self.Program += [(");\n", ())] |
1566 self.IndentLeft() |
1566 self.IndentLeft() |
1567 self.Program += [("%sEND_STEP\n\n"%self.CurrentIndent, ())] |
1567 self.Program += [("%sEND_STEP\n\n" % self.CurrentIndent, ())] |
1568 for action in actions: |
1568 for action in actions: |
1569 self.ComputeSFCAction(action) |
1569 self.ComputeSFCAction(action) |
1570 for transition in step_infos["transitions"]: |
1570 for transition in step_infos["transitions"]: |
1571 self.ComputeSFCTransition(transition) |
1571 self.ComputeSFCTransition(transition) |
1572 |
1572 |
1573 def ComputeSFCAction(self, action_name): |
1573 def ComputeSFCAction(self, action_name): |
1574 if action_name in self.SFCNetworks["Actions"].keys(): |
1574 if action_name in self.SFCNetworks["Actions"].keys(): |
1575 action_content, action_info = self.SFCNetworks["Actions"].pop(action_name) |
1575 action_content, action_info = self.SFCNetworks["Actions"].pop(action_name) |
1576 self.Program += [("%sACTION "%self.CurrentIndent, ()), |
1576 self.Program += [("%sACTION " % self.CurrentIndent, ()), |
1577 (action_name, action_info), |
1577 (action_name, action_info), |
1578 (":\n", ())] |
1578 (":\n", ())] |
1579 self.Program += action_content |
1579 self.Program += action_content |
1580 self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())] |
1580 self.Program += [("%sEND_ACTION\n\n" % self.CurrentIndent, ())] |
1581 |
1581 |
1582 def ComputeSFCTransition(self, transition): |
1582 def ComputeSFCTransition(self, transition): |
1583 if transition in self.SFCNetworks["Transitions"].keys(): |
1583 if transition in self.SFCNetworks["Transitions"].keys(): |
1584 transition_infos = self.SFCNetworks["Transitions"].pop(transition) |
1584 transition_infos = self.SFCNetworks["Transitions"].pop(transition) |
1585 self.Program += [("%sTRANSITION"%self.CurrentIndent, ())] |
1585 self.Program += [("%sTRANSITION" % self.CurrentIndent, ())] |
1586 if transition_infos["priority"] != None: |
1586 if transition_infos["priority"] != None: |
1587 self.Program += [(" (PRIORITY := ", ()), |
1587 self.Program += [(" (PRIORITY := ", ()), |
1588 ("%d"%transition_infos["priority"], (self.TagName, "transition", transition_infos["id"], "priority")), |
1588 ("%d" % transition_infos["priority"], (self.TagName, "transition", transition_infos["id"], "priority")), |
1589 (")", ())] |
1589 (")", ())] |
1590 self.Program += [(" FROM ", ())] |
1590 self.Program += [(" FROM ", ())] |
1591 if len(transition_infos["from"]) > 1: |
1591 if len(transition_infos["from"]) > 1: |
1592 self.Program += [("(", ())] |
1592 self.Program += [("(", ())] |
1593 self.Program += JoinList([(", ", ())], transition_infos["from"]) |
1593 self.Program += JoinList([(", ", ())], transition_infos["from"]) |
1608 else: |
1608 else: |
1609 msg = _("Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU").\ |
1609 msg = _("Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU").\ |
1610 format(a1 = transition_infos["content"], a2 = self.Name) |
1610 format(a1 = transition_infos["content"], a2 = self.Name) |
1611 raise PLCGenException, msg |
1611 raise PLCGenException, msg |
1612 self.Program += transition_infos["content"] |
1612 self.Program += transition_infos["content"] |
1613 self.Program += [("%sEND_TRANSITION\n\n"%self.CurrentIndent, ())] |
1613 self.Program += [("%sEND_TRANSITION\n\n" % self.CurrentIndent, ())] |
1614 for [(step_name, step_infos)] in transition_infos["to"]: |
1614 for [(step_name, step_infos)] in transition_infos["to"]: |
1615 self.ComputeSFCStep(step_name) |
1615 self.ComputeSFCStep(step_name) |
1616 |
1616 |
1617 def GenerateProgram(self, pou): |
1617 def GenerateProgram(self, pou): |
1618 self.ComputeInterface(pou) |
1618 self.ComputeInterface(pou) |
1619 self.ComputeConnectionTypes(pou) |
1619 self.ComputeConnectionTypes(pou) |
1620 self.ComputeProgram(pou) |
1620 self.ComputeProgram(pou) |
1621 |
1621 |
1622 program = [("%s "%self.Type, ()), |
1622 program = [("%s " % self.Type, ()), |
1623 (self.Name, (self.TagName, "name"))] |
1623 (self.Name, (self.TagName, "name"))] |
1624 if self.ReturnType is not None: |
1624 if self.ReturnType is not None: |
1625 program += [(" : ", ()), |
1625 program += [(" : ", ()), |
1626 (self.ReturnType, (self.TagName, "return"))] |
1626 (self.ReturnType, (self.TagName, "return"))] |
1627 program += [("\n", ())] |
1627 program += [("\n", ())] |
1628 if len(self.Interface) == 0: |
1628 if len(self.Interface) == 0: |
1629 raise PLCGenException, _("No variable defined in \"%s\" POU")%self.Name |
1629 raise PLCGenException, _("No variable defined in \"%s\" POU") % self.Name |
1630 if len(self.Program) == 0 : |
1630 if len(self.Program) == 0 : |
1631 raise PLCGenException, _("No body defined in \"%s\" POU")%self.Name |
1631 raise PLCGenException, _("No body defined in \"%s\" POU") % self.Name |
1632 var_number = 0 |
1632 var_number = 0 |
1633 for list_type, option, located, variables in self.Interface: |
1633 for list_type, option, located, variables in self.Interface: |
1634 variable_type = errorVarTypes.get(list_type, "var_local") |
1634 variable_type = errorVarTypes.get(list_type, "var_local") |
1635 program += [(" %s"%list_type, ())] |
1635 program += [(" %s" % list_type, ())] |
1636 if option is not None: |
1636 if option is not None: |
1637 program += [(" %s"%option, (self.TagName, variable_type, (var_number, var_number + len(variables)), option.lower()))] |
1637 program += [(" %s" % option, (self.TagName, variable_type, (var_number, var_number + len(variables)), option.lower()))] |
1638 program += [("\n", ())] |
1638 program += [("\n", ())] |
1639 for var_type, var_name, var_address, var_initial in variables: |
1639 for var_type, var_name, var_address, var_initial in variables: |
1640 program += [(" ", ())] |
1640 program += [(" ", ())] |
1641 if var_name: |
1641 if var_name: |
1642 program += [(var_name, (self.TagName, variable_type, var_number, "name")), |
1642 program += [(var_name, (self.TagName, variable_type, var_number, "name")), |
1653 program += [(";\n", ())] |
1653 program += [(";\n", ())] |
1654 var_number += 1 |
1654 var_number += 1 |
1655 program += [(" END_VAR\n", ())] |
1655 program += [(" END_VAR\n", ())] |
1656 program += [("\n", ())] |
1656 program += [("\n", ())] |
1657 program += self.Program |
1657 program += self.Program |
1658 program += [("END_%s\n\n"%self.Type, ())] |
1658 program += [("END_%s\n\n" % self.Type, ())] |
1659 return program |
1659 return program |
1660 |
1660 |
1661 def GenerateCurrentProgram(controler, project, errors, warnings): |
1661 def GenerateCurrentProgram(controler, project, errors, warnings): |
1662 generator = ProgramGenerator(controler, project, errors, warnings) |
1662 generator = ProgramGenerator(controler, project, errors, warnings) |
1663 generator.GenerateProgram() |
1663 generator.GenerateProgram() |