PLCGenerator.py
changeset 1775 b45f2768fab1
parent 1769 4665ba25a0ba
child 1782 5b6ad7a7fd9d
equal deleted inserted replaced
1774:ac0fe8aabb5e 1775:b45f2768fab1
   743                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   743                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   744                                 self.ConnectionTypes[connection] = var_type
   744                                 self.ConnectionTypes[connection] = var_type
   745                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   745                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   746                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   746                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   747                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   747                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   748                             if connected is not None and not connected in self.ConnectionTypes:
   748                             if connected is not None and connected not in self.ConnectionTypes:
   749                                 for related in self.ExtractRelatedConnections(connected):
   749                                 for related in self.ExtractRelatedConnections(connected):
   750                                     self.ConnectionTypes[related] = var_type
   750                                     self.ConnectionTypes[related] = var_type
   751                 elif isinstance(instance, (ContactClass, CoilClass)):
   751                 elif isinstance(instance, (ContactClass, CoilClass)):
   752                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   752                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   753                         self.ConnectionTypes[connection] = "BOOL"
   753                         self.ConnectionTypes[connection] = "BOOL"
   754                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   754                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   755                     for link in instance.connectionPointIn.getconnections():
   755                     for link in instance.connectionPointIn.getconnections():
   756                         connected = self.GetLinkedConnector(link, body)
   756                         connected = self.GetLinkedConnector(link, body)
   757                         if connected is not None and not connected in self.ConnectionTypes:
   757                         if connected is not None and connected not in self.ConnectionTypes:
   758                             for related in self.ExtractRelatedConnections(connected):
   758                             for related in self.ExtractRelatedConnections(connected):
   759                                 self.ConnectionTypes[related] = "BOOL"
   759                                 self.ConnectionTypes[related] = "BOOL"
   760                 elif isinstance(instance, LeftPowerRailClass):
   760                 elif isinstance(instance, LeftPowerRailClass):
   761                     for connection in instance.getconnectionPointOut():
   761                     for connection in instance.getconnectionPointOut():
   762                         for related in self.ExtractRelatedConnections(connection):
   762                         for related in self.ExtractRelatedConnections(connection):
   764                 elif isinstance(instance, RightPowerRailClass):
   764                 elif isinstance(instance, RightPowerRailClass):
   765                     for connection in instance.getconnectionPointIn():
   765                     for connection in instance.getconnectionPointIn():
   766                         self.ConnectionTypes[connection] = "BOOL"
   766                         self.ConnectionTypes[connection] = "BOOL"
   767                         for link in connection.getconnections():
   767                         for link in connection.getconnections():
   768                             connected = self.GetLinkedConnector(link, body)
   768                             connected = self.GetLinkedConnector(link, body)
   769                             if connected is not None and not connected in self.ConnectionTypes:
   769                             if connected is not None and connected not in self.ConnectionTypes:
   770                                 for related in self.ExtractRelatedConnections(connected):
   770                                 for related in self.ExtractRelatedConnections(connected):
   771                                     self.ConnectionTypes[related] = "BOOL"
   771                                     self.ConnectionTypes[related] = "BOOL"
   772                 elif isinstance(instance, TransitionClass):
   772                 elif isinstance(instance, TransitionClass):
   773                     content = instance.getconditionContent()
   773                     content = instance.getconditionContent()
   774                     if content["type"] == "connection":
   774                     if content["type"] == "connection":
   778                             raise PLCGenException(
   778                             raise PLCGenException(
   779                                 _("SFC transition in POU \"%s\" must be connected.") % self.Name)
   779                                 _("SFC transition in POU \"%s\" must be connected.") % self.Name)
   780 
   780 
   781                         for link in connections:
   781                         for link in connections:
   782                             connected = self.GetLinkedConnector(link, body)
   782                             connected = self.GetLinkedConnector(link, body)
   783                             if connected is not None and not connected in self.ConnectionTypes:
   783                             if connected is not None and connected not in self.ConnectionTypes:
   784                                 for related in self.ExtractRelatedConnections(connected):
   784                                 for related in self.ExtractRelatedConnections(connected):
   785                                     self.ConnectionTypes[related] = "BOOL"
   785                                     self.ConnectionTypes[related] = "BOOL"
   786                 elif isinstance(instance, ContinuationClass):
   786                 elif isinstance(instance, ContinuationClass):
   787                     name = instance.getname()
   787                     name = instance.getname()
   788                     connector = None
   788                     connector = None
   857                     self.ConnectionTypes[connection] = "BOOL"
   857                     self.ConnectionTypes[connection] = "BOOL"
   858             else:
   858             else:
   859                 for oname, otype, oqualifier in block_infos["outputs"]:
   859                 for oname, otype, oqualifier in block_infos["outputs"]:
   860                     if output_name == oname:
   860                     if output_name == oname:
   861                         if otype.startswith("ANY"):
   861                         if otype.startswith("ANY"):
   862                             if not otype in undefined:
   862                             if otype not in undefined:
   863                                 undefined[otype] = []
   863                                 undefined[otype] = []
   864                             undefined[otype].append(variable.connectionPointOut)
   864                             undefined[otype].append(variable.connectionPointOut)
   865                         elif not variable.connectionPointOut in self.ConnectionTypes:
   865                         elif variable.connectionPointOut not in self.ConnectionTypes:
   866                             for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
   866                             for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
   867                                 self.ConnectionTypes[connection] = otype
   867                                 self.ConnectionTypes[connection] = otype
   868         for variable in instance.inputVariables.getvariable():
   868         for variable in instance.inputVariables.getvariable():
   869             input_name = variable.getformalParameter()
   869             input_name = variable.getformalParameter()
   870             if input_name == "EN":
   870             if input_name == "EN":
   873             else:
   873             else:
   874                 for iname, itype, iqualifier in block_infos["inputs"]:
   874                 for iname, itype, iqualifier in block_infos["inputs"]:
   875                     if input_name == iname:
   875                     if input_name == iname:
   876                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   876                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   877                         if itype.startswith("ANY"):
   877                         if itype.startswith("ANY"):
   878                             if not itype in undefined:
   878                             if itype not in undefined:
   879                                 undefined[itype] = []
   879                                 undefined[itype] = []
   880                             undefined[itype].append(variable.connectionPointIn)
   880                             undefined[itype].append(variable.connectionPointIn)
   881                             if connected is not None:
   881                             if connected is not None:
   882                                 undefined[itype].append(connected)
   882                                 undefined[itype].append(connected)
   883                         else:
   883                         else:
   884                             self.ConnectionTypes[variable.connectionPointIn] = itype
   884                             self.ConnectionTypes[variable.connectionPointIn] = itype
   885                             if connected is not None and not connected in self.ConnectionTypes:
   885                             if connected is not None and connected not in self.ConnectionTypes:
   886                                 for connection in self.ExtractRelatedConnections(connected):
   886                                 for connection in self.ExtractRelatedConnections(connected):
   887                                     self.ConnectionTypes[connection] = itype
   887                                     self.ConnectionTypes[connection] = itype
   888         for var_type, connections in undefined.items():
   888         for var_type, connections in undefined.items():
   889             related = []
   889             related = []
   890             for connection in connections:
   890             for connection in connections:
  1084                 else:
  1084                 else:
  1085                     vars = [value for name, value in connected_vars]
  1085                     vars = [value for name, value in connected_vars]
  1086                 if one_input_connected:
  1086                 if one_input_connected:
  1087                     for i, variable in enumerate(output_variables):
  1087                     for i, variable in enumerate(output_variables):
  1088                         parameter = variable.getformalParameter()
  1088                         parameter = variable.getformalParameter()
  1089                         if not parameter in inout_variables and parameter in output_names + ["", "ENO"]:
  1089                         if parameter not in inout_variables and parameter in output_names + ["", "ENO"]:
  1090                             if variable.getformalParameter() == "":
  1090                             if variable.getformalParameter() == "":
  1091                                 variable_name = "%s%d" % (type, block.getlocalId())
  1091                                 variable_name = "%s%d" % (type, block.getlocalId())
  1092                             else:
  1092                             else:
  1093                                 variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter)
  1093                                 variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter)
  1094                             if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
  1094                             if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
  1533                                 expression = self.ComputeExpression(transitionBody, connections)
  1533                                 expression = self.ComputeExpression(transitionBody, connections)
  1534                                 if expression is not None:
  1534                                 if expression is not None:
  1535                                     transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
  1535                                     transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
  1536                                     self.SFCComputedBlocks += self.Program
  1536                                     self.SFCComputedBlocks += self.Program
  1537                                     self.Program = []
  1537                                     self.Program = []
  1538                     if not "content" in transition_infos:
  1538                     if "content" not in transition_infos:
  1539                         raise PLCGenException(
  1539                         raise PLCGenException(
  1540                             _("Transition \"%s\" body must contain an output variable or coil referring to its name")
  1540                             _("Transition \"%s\" body must contain an output variable or coil referring to its name")
  1541                             % transitionValues["value"])
  1541                             % transitionValues["value"])
  1542                 self.TagName = previous_tagname
  1542                 self.TagName = previous_tagname
  1543             elif transitionValues["type"] == "connection":
  1543             elif transitionValues["type"] == "connection":