PLCGenerator.py
changeset 1763 bcc07ff2362c
parent 1753 19f19c66b67e
child 1765 ccf59c1f0b45
equal deleted inserted replaced
1762:fcc406143e5b 1763:bcc07ff2362c
   246 
   246 
   247             # Getting POU model from project
   247             # Getting POU model from project
   248             pou = self.Project.getpou(pou_name)
   248             pou = self.Project.getpou(pou_name)
   249             pou_type = pou.getpouType()
   249             pou_type = pou.getpouType()
   250             # Verify that POU type exists
   250             # Verify that POU type exists
   251             if pouTypeNames.has_key(pou_type):
   251             if pou_type in pouTypeNames:
   252                 # Create a POU program generator
   252                 # Create a POU program generator
   253                 pou_program = PouProgramGenerator(self, pou.getname(), pouTypeNames[pou_type], self.Errors, self.Warnings)
   253                 pou_program = PouProgramGenerator(self, pou.getname(), pouTypeNames[pou_type], self.Errors, self.Warnings)
   254                 program = pou_program.GenerateProgram(pou)
   254                 program = pou_program.GenerateProgram(pou)
   255                 self.Program += program
   255                 self.Program += program
   256             else:
   256             else:
   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 self.ConnectionTypes.has_key(connected):
   748                             if connected is not None and not connected 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 self.ConnectionTypes.has_key(connected):
   757                         if connected is not None and not connected 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 self.ConnectionTypes.has_key(connected):
   769                             if connected is not None and not connected 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":
   776                         connections = content["value"].getconnections()
   776                         connections = content["value"].getconnections()
   777                         if not connections:
   777                         if not connections:
   778                             raise PLCGenException, _("SFC transition in POU \"%s\" must be connected.") % self.Name
   778                             raise PLCGenException, _("SFC transition in POU \"%s\" must be connected.") % self.Name
   779                         for link in connections:
   779                         for link in connections:
   780                             connected = self.GetLinkedConnector(link, body)
   780                             connected = self.GetLinkedConnector(link, body)
   781                             if connected is not None and not self.ConnectionTypes.has_key(connected):
   781                             if connected is not None and not connected in self.ConnectionTypes:
   782                                 for related in self.ExtractRelatedConnections(connected):
   782                                 for related in self.ExtractRelatedConnections(connected):
   783                                     self.ConnectionTypes[related] = "BOOL"
   783                                     self.ConnectionTypes[related] = "BOOL"
   784                 elif isinstance(instance, ContinuationClass):
   784                 elif isinstance(instance, ContinuationClass):
   785                     name = instance.getname()
   785                     name = instance.getname()
   786                     connector = None
   786                     connector = None
   796                         connected = self.GetConnectedConnector(connector.connectionPointIn, body)
   796                         connected = self.GetConnectedConnector(connector.connectionPointIn, body)
   797                         if connected is not None:
   797                         if connected is not None:
   798                             undefined.append(connected)
   798                             undefined.append(connected)
   799                         related = []
   799                         related = []
   800                         for connection in undefined:
   800                         for connection in undefined:
   801                             if self.ConnectionTypes.has_key(connection):
   801                             if connection in self.ConnectionTypes:
   802                                 var_type = self.ConnectionTypes[connection]
   802                                 var_type = self.ConnectionTypes[connection]
   803                             else:
   803                             else:
   804                                 related.extend(self.ExtractRelatedConnections(connection))
   804                                 related.extend(self.ExtractRelatedConnections(connection))
   805                         if var_type.startswith("ANY") and len(related) > 0:
   805                         if var_type.startswith("ANY") and len(related) > 0:
   806                             self.RelatedConnections.append(related)
   806                             self.RelatedConnections.append(related)
   851                     self.ConnectionTypes[connection] = "BOOL"
   851                     self.ConnectionTypes[connection] = "BOOL"
   852             else:
   852             else:
   853                 for oname, otype, oqualifier in block_infos["outputs"]:
   853                 for oname, otype, oqualifier in block_infos["outputs"]:
   854                     if output_name == oname:
   854                     if output_name == oname:
   855                         if otype.startswith("ANY"):
   855                         if otype.startswith("ANY"):
   856                             if not undefined.has_key(otype):
   856                             if not otype in undefined:
   857                                 undefined[otype] = []
   857                                 undefined[otype] = []
   858                             undefined[otype].append(variable.connectionPointOut)
   858                             undefined[otype].append(variable.connectionPointOut)
   859                         elif not self.ConnectionTypes.has_key(variable.connectionPointOut):
   859                         elif not variable.connectionPointOut in self.ConnectionTypes:
   860                             for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
   860                             for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
   861                                 self.ConnectionTypes[connection] = otype
   861                                 self.ConnectionTypes[connection] = otype
   862         for variable in instance.inputVariables.getvariable():
   862         for variable in instance.inputVariables.getvariable():
   863             input_name = variable.getformalParameter()
   863             input_name = variable.getformalParameter()
   864             if input_name == "EN":
   864             if input_name == "EN":
   867             else:
   867             else:
   868                 for iname, itype, iqualifier in block_infos["inputs"]:
   868                 for iname, itype, iqualifier in block_infos["inputs"]:
   869                     if input_name == iname:
   869                     if input_name == iname:
   870                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   870                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
   871                         if itype.startswith("ANY"):
   871                         if itype.startswith("ANY"):
   872                             if not undefined.has_key(itype):
   872                             if not itype in undefined:
   873                                 undefined[itype] = []
   873                                 undefined[itype] = []
   874                             undefined[itype].append(variable.connectionPointIn)
   874                             undefined[itype].append(variable.connectionPointIn)
   875                             if connected is not None:
   875                             if connected is not None:
   876                                 undefined[itype].append(connected)
   876                                 undefined[itype].append(connected)
   877                         else:
   877                         else:
   878                             self.ConnectionTypes[variable.connectionPointIn] = itype
   878                             self.ConnectionTypes[variable.connectionPointIn] = itype
   879                             if connected is not None and not self.ConnectionTypes.has_key(connected):
   879                             if connected is not None and not connected in self.ConnectionTypes:
   880                                 for connection in self.ExtractRelatedConnections(connected):
   880                                 for connection in self.ExtractRelatedConnections(connected):
   881                                     self.ConnectionTypes[connection] = itype
   881                                     self.ConnectionTypes[connection] = itype
   882         for var_type, connections in undefined.items():
   882         for var_type, connections in undefined.items():
   883             related = []
   883             related = []
   884             for connection in connections:
   884             for connection in connections:
  1034                 if not block_infos["extensible"]:
  1034                 if not block_infos["extensible"]:
  1035                     input_connected = dict([("EN", None)] +
  1035                     input_connected = dict([("EN", None)] +
  1036                                            [(input_name, None) for input_name in input_names])
  1036                                            [(input_name, None) for input_name in input_names])
  1037                     for variable in input_variables:
  1037                     for variable in input_variables:
  1038                         parameter = variable.getformalParameter()
  1038                         parameter = variable.getformalParameter()
  1039                         if input_connected.has_key(parameter):
  1039                         if parameter in input_connected:
  1040                             input_connected[parameter] = variable
  1040                             input_connected[parameter] = variable
  1041                     if input_connected["EN"] is None:
  1041                     if input_connected["EN"] is None:
  1042                         input_connected.pop("EN")
  1042                         input_connected.pop("EN")
  1043                         input_parameters = input_names
  1043                         input_parameters = input_names
  1044                     else:
  1044                     else:
  1056                         input_info = (self.TagName, "block", block.getlocalId(), "input", i)
  1056                         input_info = (self.TagName, "block", block.getlocalId(), "input", i)
  1057                         connections = variable.connectionPointIn.getconnections()
  1057                         connections = variable.connectionPointIn.getconnections()
  1058                         if connections is not None:
  1058                         if connections is not None:
  1059                             if parameter != "EN":
  1059                             if parameter != "EN":
  1060                                 one_input_connected = True
  1060                                 one_input_connected = True
  1061                             if inout_variables.has_key(parameter):
  1061                             if parameter in inout_variables:
  1062                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0, True)
  1062                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0, True)
  1063                                 if expression is not None:
  1063                                 if expression is not None:
  1064                                     inout_variables[parameter] = value
  1064                                     inout_variables[parameter] = value
  1065                             else:
  1065                             else:
  1066                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0)
  1066                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0)
  1076                 else:
  1076                 else:
  1077                     vars = [value for name, value in connected_vars]
  1077                     vars = [value for name, value in connected_vars]
  1078                 if one_input_connected:
  1078                 if one_input_connected:
  1079                     for i, variable in enumerate(output_variables):
  1079                     for i, variable in enumerate(output_variables):
  1080                         parameter = variable.getformalParameter()
  1080                         parameter = variable.getformalParameter()
  1081                         if not inout_variables.has_key(parameter) and parameter in output_names + ["", "ENO"]:
  1081                         if not parameter in inout_variables and parameter in output_names + ["", "ENO"]:
  1082                             if variable.getformalParameter() == "":
  1082                             if variable.getformalParameter() == "":
  1083                                 variable_name = "%s%d" % (type, block.getlocalId())
  1083                                 variable_name = "%s%d" % (type, block.getlocalId())
  1084                             else:
  1084                             else:
  1085                                 variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter)
  1085                                 variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter)
  1086                             if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
  1086                             if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
  1119                         else:
  1119                         else:
  1120                             input_idx = offset_idx + input_names.index(parameter)
  1120                             input_idx = offset_idx + input_names.index(parameter)
  1121                         input_info = (self.TagName, "block", block.getlocalId(), "input", input_idx)
  1121                         input_info = (self.TagName, "block", block.getlocalId(), "input", input_idx)
  1122                         connections = variable.connectionPointIn.getconnections()
  1122                         connections = variable.connectionPointIn.getconnections()
  1123                         if connections is not None:
  1123                         if connections is not None:
  1124                             expression = self.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter))
  1124                             expression = self.ComputeExpression(body, connections, executionOrderId > 0, parameter in inout_variables)
  1125                             if expression is not None:
  1125                             if expression is not None:
  1126                                 vars.append([(parameter, input_info),
  1126                                 vars.append([(parameter, input_info),
  1127                                              (" := ", ())] + self.ExtractModifier(variable, expression, input_info))
  1127                                              (" := ", ())] + self.ExtractModifier(variable, expression, input_info))
  1128                 self.Program += [(self.CurrentIndent, ()),
  1128                 self.Program += [(self.CurrentIndent, ()),
  1129                                  (name, (self.TagName, "block", block.getlocalId(), "name")),
  1129                                  (name, (self.TagName, "block", block.getlocalId(), "name")),
  1158                     output_idx = i
  1158                     output_idx = i
  1159 
  1159 
  1160         if output_variable is not None:
  1160         if output_variable is not None:
  1161             if block_infos["type"] == "function":
  1161             if block_infos["type"] == "function":
  1162                 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx)
  1162                 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx)
  1163                 if inout_variables.has_key(output_parameter):
  1163                 if output_parameter in inout_variables:
  1164                     output_value = inout_variables[output_parameter]
  1164                     output_value = inout_variables[output_parameter]
  1165                 else:
  1165                 else:
  1166                     if output_parameter == "":
  1166                     if output_parameter == "":
  1167                         output_name = "%s%d" % (type, block.getlocalId())
  1167                         output_name = "%s%d" % (type, block.getlocalId())
  1168                     else:
  1168                     else:
  1517                                 expression = self.ComputeExpression(transitionBody, connections)
  1517                                 expression = self.ComputeExpression(transitionBody, connections)
  1518                                 if expression is not None:
  1518                                 if expression is not None:
  1519                                     transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
  1519                                     transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
  1520                                     self.SFCComputedBlocks += self.Program
  1520                                     self.SFCComputedBlocks += self.Program
  1521                                     self.Program = []
  1521                                     self.Program = []
  1522                     if not transition_infos.has_key("content"):
  1522                     if not "content" in transition_infos:
  1523                         raise PLCGenException, _("Transition \"%s\" body must contain an output variable or coil referring to its name") % transitionValues["value"]
  1523                         raise PLCGenException, _("Transition \"%s\" body must contain an output variable or coil referring to its name") % transitionValues["value"]
  1524                 self.TagName = previous_tagname
  1524                 self.TagName = previous_tagname
  1525             elif transitionValues["type"] == "connection":
  1525             elif transitionValues["type"] == "connection":
  1526                 body = pou.getbody()
  1526                 body = pou.getbody()
  1527                 if isinstance(body, ListType):
  1527                 if isinstance(body, ListType):