plcopen/structures.py
changeset 754 48966b6ceedc
parent 649 ea237e1431ec
equal deleted inserted replaced
753:8a70e85f7e12 754:48966b6ceedc
    40     if len(mylist) > 0 :
    40     if len(mylist) > 0 :
    41         return reduce(lambda x, y: x + separator + y, mylist)
    41         return reduce(lambda x, y: x + separator + y, mylist)
    42     else :
    42     else :
    43         return mylist
    43         return mylist
    44 
    44 
    45 def generate_block(generator, block, block_infos, body, link, order=False):
    45 def generate_block(generator, block, block_infos, body, link, order=False, to_inout=False):
    46     body_type = body.getcontent()["name"]
    46     body_type = body.getcontent()["name"]
    47     name = block.getinstanceName()
    47     name = block.getinstanceName()
    48     type = block.gettypeName()
    48     type = block.gettypeName()
    49     executionOrderId = block.getexecutionOrderId()
    49     executionOrderId = block.getexecutionOrderId()
       
    50     inout_variables = {}
       
    51     for input_variable in block.inputVariables.getvariable():
       
    52         for output_variable in block.outputVariables.getvariable():
       
    53             if input_variable.getformalParameter() == output_variable.getformalParameter():
       
    54                 inout_variables[input_variable.getformalParameter()] = ""
    50     if block_infos["type"] == "function":
    55     if block_infos["type"] == "function":
    51         output_variables = block.outputVariables.getvariable()
    56         output_variables = block.outputVariables.getvariable()
    52         if not generator.ComputedBlocks.get(block, False) and not order:
    57         if not generator.ComputedBlocks.get(block, False) and not order:
    53             generator.ComputedBlocks[block] = True
    58             generator.ComputedBlocks[block] = True
    54             vars = []
    59             vars = []
    58                 connections = variable.connectionPointIn.getconnections()
    63                 connections = variable.connectionPointIn.getconnections()
    59                 if connections is not None:
    64                 if connections is not None:
    60                     parameter = variable.getformalParameter()
    65                     parameter = variable.getformalParameter()
    61                     if parameter != "EN":
    66                     if parameter != "EN":
    62                         one_input_connected = True
    67                         one_input_connected = True
    63                     value = generator.ComputeExpression(body, connections, executionOrderId > 0)
    68                     if inout_variables.has_key(parameter):
       
    69                         value = generator.ComputeExpression(body, connections, executionOrderId > 0, True)
       
    70                         inout_variables[parameter] = value
       
    71                     else:
       
    72                         value = generator.ComputeExpression(body, connections, executionOrderId > 0)
    64                     if len(output_variables) > 1:
    73                     if len(output_variables) > 1:
    65                         vars.append([(parameter, input_info),
    74                         vars.append([(parameter, input_info),
    66                                      (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
    75                                      (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
    67                     else:
    76                     else:
    68                         vars.append(generator.ExtractModifier(variable, value, input_info))
    77                         vars.append(generator.ExtractModifier(variable, value, input_info))
    69             if one_input_connected:
    78             if one_input_connected:
    70                 for i, variable in enumerate(output_variables):
    79                 for i, variable in enumerate(output_variables):
    71                     parameter = variable.getformalParameter()
    80                     parameter = variable.getformalParameter()
    72                     if variable.getformalParameter() == "":
    81                     if not inout_variables.has_key(parameter):
    73                         variable_name = "%s%d"%(type, block.getlocalId())
    82                         if variable.getformalParameter() == "":
    74                     else:
    83                             variable_name = "%s%d"%(type, block.getlocalId())
    75                         variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
    84                         else:
    76                     if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]:
    85                             variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
    77                         generator.Interface.append(("VAR", None, False, []))
    86                         if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]:
    78                     if variable.connectionPointOut in generator.ConnectionTypes:
    87                             generator.Interface.append(("VAR", None, False, []))
    79                         generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None))
    88                         if variable.connectionPointOut in generator.ConnectionTypes:
    80                     else:
    89                             generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None))
    81                         generator.Interface[-1][3].append(("ANY", variable_name, None, None))
    90                         else:
    82                     if len(output_variables) > 1 and parameter not in ["", "OUT"]:
    91                             generator.Interface[-1][3].append(("ANY", variable_name, None, None))
    83                         vars.append([(parameter, (generator.TagName, "block", block.getlocalId(), "output", i)), 
    92                         if len(output_variables) > 1 and parameter not in ["", "OUT"]:
    84                                      (" => %s"%variable_name, ())])
    93                             vars.append([(parameter, (generator.TagName, "block", block.getlocalId(), "output", i)), 
    85                     else:
    94                                          (" => %s"%variable_name, ())])
    86                         output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
    95                         else:
    87                         output_name = variable_name
    96                             output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
       
    97                             output_name = variable_name
    88                 generator.Program += [(generator.CurrentIndent, ()),
    98                 generator.Program += [(generator.CurrentIndent, ()),
    89                                       (output_name, output_info),
    99                                       (output_name, output_info),
    90                                       (" := ", ()),
   100                                       (" := ", ()),
    91                                       (type, (generator.TagName, "block", block.getlocalId(), "type")),
   101                                       (type, (generator.TagName, "block", block.getlocalId(), "type")),
    92                                       ("(", ())]
   102                                       ("(", ())]
   100             connectionPoint = None
   110             connectionPoint = None
   101         for i, variable in enumerate(output_variables):
   111         for i, variable in enumerate(output_variables):
   102             blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
   112             blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
   103             if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
   113             if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
   104                 output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
   114                 output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
   105                 output_name = variable.getformalParameter()
   115                 parameter = variable.getformalParameter()
   106                 if variable.getformalParameter() == "":
   116                 if inout_variables.has_key(parameter):
   107                     output_name = "%s%d"%(type, block.getlocalId())
   117                     output_value = inout_variables[parameter]
   108                 else:
   118                 else:
   109                     output_name = "%s%d_%s"%(type, block.getlocalId(), variable.getformalParameter())
   119                     if parameter == "":
   110                 return generator.ExtractModifier(variable, [(output_name, output_info)], output_info)
   120                         output_name = "%s%d"%(type, block.getlocalId())
       
   121                     else:
       
   122                         output_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
       
   123                     output_value = [(output_name, output_info)]
       
   124                 return generator.ExtractModifier(variable, output_value, output_info)
   111     elif block_infos["type"] == "functionBlock":
   125     elif block_infos["type"] == "functionBlock":
   112         if not generator.ComputedBlocks.get(block, False) and not order:
   126         if not generator.ComputedBlocks.get(block, False) and not order:
   113             generator.ComputedBlocks[block] = True
   127             generator.ComputedBlocks[block] = True
   114             vars = []
   128             vars = []
   115             for i, variable in enumerate(block.inputVariables.getvariable()):
   129             for i, variable in enumerate(block.inputVariables.getvariable()):
   116                 input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
   130                 input_info = (generator.TagName, "block", block.getlocalId(), "input", i)
   117                 connections = variable.connectionPointIn.getconnections()
   131                 connections = variable.connectionPointIn.getconnections()
   118                 if connections is not None:
   132                 if connections is not None:
   119                     parameter = variable.getformalParameter()
   133                     parameter = variable.getformalParameter()
   120                     value = generator.ComputeExpression(body, connections, executionOrderId > 0)
   134                     value = generator.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter))
   121                     vars.append([(parameter, input_info),
   135                     vars.append([(parameter, input_info),
   122                                  (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
   136                                  (" := ", ())] + generator.ExtractModifier(variable, value, input_info))
   123             generator.Program += [(generator.CurrentIndent, ()), 
   137             generator.Program += [(generator.CurrentIndent, ()), 
   124                                   (name, (generator.TagName, "block", block.getlocalId(), "name")),
   138                                   (name, (generator.TagName, "block", block.getlocalId(), "name")),
   125                                   ("(", ())]
   139                                   ("(", ())]
   131             connectionPoint = None
   145             connectionPoint = None
   132         for i, variable in enumerate(block.outputVariables.getvariable()):
   146         for i, variable in enumerate(block.outputVariables.getvariable()):
   133             blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
   147             blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
   134             if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
   148             if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety():
   135                 output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
   149                 output_info = (generator.TagName, "block", block.getlocalId(), "output", i)
   136                 return generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info)
   150                 output_name = generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info)
       
   151                 if to_inout:
       
   152                     variable_name = "%s_%s"%(name, variable.getformalParameter())
       
   153                     if not generator.IsAlreadyDefined(variable_name):
       
   154                         if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]:
       
   155                             generator.Interface.append(("VAR", None, False, []))
       
   156                         if variable.connectionPointOut in generator.ConnectionTypes:
       
   157                             generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None))
       
   158                         else:
       
   159                             generator.Interface[-1][3].append(("ANY", variable_name, None, None))
       
   160                         generator.Program += [(generator.CurrentIndent, ()),
       
   161                                               ("%s := "%variable_name, ())]
       
   162                         generator.Program += output_name
       
   163                         generator.Program += [(";\n", ())]
       
   164                     return [(variable_name, ())]
       
   165                 return output_name 
   137     if link is not None:
   166     if link is not None:
   138         raise ValueError, _("No output variable found")
   167         raise ValueError, _("No output variable found")
   139 
   168 
   140 def initialise_block(type, name, block = None):
   169 def initialise_block(type, name, block = None):
   141     return [(type, name, None, None)]
   170     return [(type, name, None, None)]