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): |