--- a/PLCGenerator.py Tue May 14 10:56:57 2013 +0200
+++ b/PLCGenerator.py Tue May 14 11:12:34 2013 +0200
@@ -902,7 +902,10 @@
block_infos = self.GetBlockType(block_type)
raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
- block_infos["generate"](self, instance, block_infos, body, None)
+ block_infos["generate"](self, instance, block_infos, body, None) + raise PLCGenException, e.message elif isinstance(instance, plcopen.commonObjects_connector):
connector = instance.getname()
if self.ComputedConnectors.get(connector, None):
@@ -961,7 +964,10 @@
block_infos = self.GetBlockType(block_type)
raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
- paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout)))
+ paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout))) + raise PLCGenException, e.message elif isinstance(next, plcopen.commonObjects_continuation):
computed_value = self.ComputedConnectors.get(name, None)
--- a/plcopen/structures.py Tue May 14 10:56:57 2013 +0200
+++ b/plcopen/structures.py Tue May 14 11:12:34 2013 +0200
@@ -46,38 +46,59 @@
name = block.getinstanceName()
type = block.gettypeName()
executionOrderId = block.getexecutionOrderId()
+ input_variables = block.inputVariables.getvariable() + output_variables = block.outputVariables.getvariable() - for input_variable in block.inputVariables.getvariable():
- for output_variable in block.outputVariables.getvariable():
+ for input_variable in input_variables: + for output_variable in output_variables: if input_variable.getformalParameter() == output_variable.getformalParameter():
inout_variables[input_variable.getformalParameter()] = ""
+ input_names = [input[0] for input in block_infos["inputs"]] + output_names = [output[0] for output in block_infos["outputs"]] if block_infos["type"] == "function":
- output_variables = block.outputVariables.getvariable()
if not generator.ComputedBlocks.get(block, False) and not order:
generator.ComputedBlocks[block] = True
+ input_connected = dict([("EN", None)] + + [(input_name, None) for input_name in input_names]) + for variable in input_variables: + parameter = variable.getformalParameter() + if input_connected.has_key(parameter): + input_connected[parameter] = variable + if input_connected["EN"] is None: + input_connected.pop("EN") + input_parameters = input_names + input_parameters = ["EN"] + input_names one_input_connected = False
- for i, variable in enumerate(block.inputVariables.getvariable()):
- input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
- connections = variable.connectionPointIn.getconnections()
- if connections is not None:
- parameter = variable.getformalParameter()
- one_input_connected = True
- if inout_variables.has_key(parameter):
- value = generator.ComputeExpression(body, connections, executionOrderId > 0, True)
- inout_variables[parameter] = value
+ all_input_connected = True + for i, parameter in enumerate(input_parameters): + variable = input_connected.get(parameter) + if variable is not None: + input_info = (generator.TagName, "block", block.getlocalId(), "input", i) + connections = variable.connectionPointIn.getconnections() + if connections is not None: + one_input_connected = True + if inout_variables.has_key(parameter): + value = generator.ComputeExpression(body, connections, executionOrderId > 0, True) + inout_variables[parameter] = value + value = generator.ComputeExpression(body, connections, executionOrderId > 0) + connected_vars.append(([(parameter, input_info), (" := ", ())], + generator.ExtractModifier(variable, value, input_info))) - value = generator.ComputeExpression(body, connections, executionOrderId > 0)
- if len(output_variables) > 1:
- vars.append([(parameter, input_info),
- (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
- vars.append(generator.ExtractModifier(variable, value, input_info))
+ all_input_connected = False + all_input_connected = False + if len(output_variables) > 1 or not all_input_connected: + vars = [name + value for name, value in connected_vars] + vars = [value for name, value in connected_vars] for i, variable in enumerate(output_variables):
parameter = variable.getformalParameter()
- if not inout_variables.has_key(parameter):
+ if not inout_variables.has_key(parameter) and parameter in output_names + ["ENO"]: if variable.getformalParameter() == "":
variable_name = "%s%d"%(type, block.getlocalId())
@@ -103,67 +124,98 @@
generator.Program += [(");\n", ())]
generator.Warnings.append(_("\"%s\" function cancelled in \"%s\" POU: No input connected")%(type, generator.TagName.split("::")[-1]))
- connectionPoint = link.getposition()[-1]
- for i, variable in enumerate(output_variables):
- blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
- if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
- output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
- parameter = variable.getformalParameter()
- if inout_variables.has_key(parameter):
- output_value = inout_variables[parameter]
- output_name = "%s%d"%(type, block.getlocalId())
- output_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
- output_value = [(output_name, output_info)]
- return generator.ExtractModifier(variable, output_value, output_info)
elif block_infos["type"] == "functionBlock":
if not generator.ComputedBlocks.get(block, False) and not order:
generator.ComputedBlocks[block] = True
- for i, variable in enumerate(block.inputVariables.getvariable()):
- input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
- connections = variable.connectionPointIn.getconnections()
- if connections is not None:
- parameter = variable.getformalParameter()
- value = generator.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter))
- vars.append([(parameter, input_info),
- (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
+ for variable in input_variables: + parameter = variable.getformalParameter() + if parameter in input_names or parameter == "EN": + input_idx = offset_idx + input_names.index(parameter) + input_info = (generator.TagName, "block", block.getlocalId(), "input", input_idx) + connections = variable.connectionPointIn.getconnections() + if connections is not None: + value = generator.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter)) + vars.append([(parameter, input_info), + (" := ", ())] + generator.ExtractModifier(variable, value, input_info)) generator.Program += [(generator.CurrentIndent, ()),
(name, (generator.TagName, "block", block.getlocalId(), "name")),
generator.Program += JoinList([(", ", ())], vars)
generator.Program += [(");\n", ())]
- connectionPoint = link.getposition()[-1]
- for i, variable in enumerate(block.outputVariables.getvariable()):
+ connectionPoint = link.getposition()[-1] + output_parameter = link.getformalParameter() + output_parameter = None + if output_parameter is not None: + if output_parameter in output_names or output_parameter == "ENO": + for variable in output_variables: + if variable.getformalParameter() == output_parameter: + output_variable = variable + if output_parameter != "ENO": + output_idx = output_names.index(output_parameter) + for i, variable in enumerate(output_variables): blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
- if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
- output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
- output_name = generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info)
- variable_name = "%s_%s"%(name, variable.getformalParameter())
- if not generator.IsAlreadyDefined(variable_name):
- if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]:
- generator.Interface.append(("VAR", None, False, []))
- if variable.connectionPointOut in generator.ConnectionTypes:
- generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None))
- generator.Interface[-1][3].append(("ANY", variable_name, None, None))
- generator.Program += [(generator.CurrentIndent, ()),
- ("%s := "%variable_name, ())]
- generator.Program += output_name
- generator.Program += [(";\n", ())]
- return [(variable_name, ())]
+ if (not connectionPoint or + block.getx() + blockPointx == connectionPoint.getx() and + block.gety() + blockPointy == connectionPoint.gety()): + output_variable = variable + output_parameter = variable.getformalParameter() + if output_variable is not None: + if block_infos["type"] == "function": + output_info = (generator.TagName, "block", block.getlocalId(), "output", output_idx) + if inout_variables.has_key(output_parameter): + output_value = inout_variables[output_parameter] + if output_parameter == "": + output_name = "%s%d"%(type, block.getlocalId()) + output_name = "%s%d_%s"%(type, block.getlocalId(), output_parameter) + output_value = [(output_name, output_info)] + return generator.ExtractModifier(output_variable, output_value, output_info) + if block_infos["type"] == "functionBlock": + output_info = (generator.TagName, "block", block.getlocalId(), "output", output_idx) + output_name = generator.ExtractModifier(output_variable, [("%s.%s"%(name, output_parameter), output_info)], output_info) + variable_name = "%s_%s"%(name, output_parameter) + if not generator.IsAlreadyDefined(variable_name): + if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]: + generator.Interface.append(("VAR", None, False, [])) + if variable.connectionPointOut in generator.ConnectionTypes: + generator.Interface[-1][3].append( + (generator.ConnectionTypes[output_variable.connectionPointOut], variable_name, None, None)) + generator.Interface[-1][3].append(("ANY", variable_name, None, None)) + generator.Program += [(generator.CurrentIndent, ()), + ("%s := "%variable_name, ())] + generator.Program += output_name + generator.Program += [(";\n", ())] + return [(variable_name, ())] - raise ValueError, _("No output variable found")
+ if output_parameter is None: + blockname = "%s(%s)" % (name, type) + raise ValueError, _("No output %s variable found in block %s in POU %s. Connection must be broken") % \ + (output_parameter, blockname, generator.Name) def initialise_block(type, name, block = None):
return [(type, name, None, None)]