PLCGenerator.py
changeset 1734 750eeb7230a1
parent 1730 64d8f52bc8c8
child 1736 7e61baa047f0
equal deleted inserted replaced
1733:dea107dce0c4 1734:750eeb7230a1
    60             indent = ""
    60             indent = ""
    61             for i in xrange(spaces, nb_spaces):
    61             for i in xrange(spaces, nb_spaces):
    62                 indent += " "
    62                 indent += " "
    63             for line in lines:
    63             for line in lines:
    64                 if line != "":
    64                 if line != "":
    65                     compute += "%s%s\n"%(indent, line)
    65                     compute += "%s%s\n" % (indent, line)
    66                 else:
    66                 else:
    67                     compute += "\n"
    67                     compute += "\n"
    68     return compute
    68     return compute
    69 
    69 
    70 def SortInstances(a, b):
    70 def SortInstances(a, b):
   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()