PLCGenerator.py
changeset 1297 cd639725fba5
parent 1239 d1f6ea56555d
child 1298 f034fb2b1aab
equal deleted inserted replaced
1296:5f8e02717560 1297:cd639725fba5
    20 #
    20 #
    21 #You should have received a copy of the GNU General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
    25 from plcopen import plcopen
    25 from plcopen import PLCOpenParser
    26 from plcopen.structures import *
    26 from plcopen.structures import *
    27 from types import *
    27 from types import *
    28 import re
    28 import re
    29 
    29 
    30 # Dictionary associating PLCOpen variable categories to the corresponding 
    30 # Dictionary associating PLCOpen variable categories to the corresponding 
   124             tagname = self.Controler.ComputeDataTypeName(datatype.getname())
   124             tagname = self.Controler.ComputeDataTypeName(datatype.getname())
   125             datatype_def = [("  ", ()), 
   125             datatype_def = [("  ", ()), 
   126                             (datatype.getname(), (tagname, "name")),
   126                             (datatype.getname(), (tagname, "name")),
   127                             (" : ", ())]
   127                             (" : ", ())]
   128             basetype_content = datatype.baseType.getcontent()
   128             basetype_content = datatype.baseType.getcontent()
   129             # Data type derived directly from a string type 
   129             basetype_content_type = basetype_content.getLocalTag()
   130             if basetype_content["name"] in ["string", "wstring"]:
       
   131                 datatype_def += [(basetype_content["name"].upper(), (tagname, "base"))]
       
   132             # Data type derived directly from a user defined type 
   130             # Data type derived directly from a user defined type 
   133             elif basetype_content["name"] == "derived":
   131             if basetype_content_type == "derived":
   134                 basetype_name = basetype_content["value"].getname()
   132                 basetype_name = basetype_content.getname()
   135                 self.GenerateDataType(basetype_name)
   133                 self.GenerateDataType(basetype_name)
   136                 datatype_def += [(basetype_name, (tagname, "base"))]
   134                 datatype_def += [(basetype_name, (tagname, "base"))]
   137             # Data type is a subrange
   135             # Data type is a subrange
   138             elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]:
   136             elif basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]:
   139                 base_type = basetype_content["value"].baseType.getcontent()
   137                 base_type = basetype_content.baseType.getcontent()
       
   138                 base_type_type = base_type.getLocalTag()
   140                 # Subrange derived directly from a user defined type 
   139                 # Subrange derived directly from a user defined type 
   141                 if base_type["name"] == "derived":
   140                 if base_type_type == "derived":
   142                     basetype_name = base_type["value"].getname()
   141                     basetype_name = base_type_type.getname()
   143                     self.GenerateDataType(basetype_name)
   142                     self.GenerateDataType(basetype_name)
   144                 # Subrange derived directly from an elementary type 
   143                 # Subrange derived directly from an elementary type 
   145                 else:
   144                 else:
   146                     basetype_name = base_type["name"]
   145                     basetype_name = base_type_type
   147                 min_value = basetype_content["value"].range.getlower()
   146                 min_value = basetype_content.range.getlower()
   148                 max_value = basetype_content["value"].range.getupper()
   147                 max_value = basetype_content.range.getupper()
   149                 datatype_def += [(basetype_name, (tagname, "base")),
   148                 datatype_def += [(basetype_name, (tagname, "base")),
   150                                  (" (", ()),
   149                                  (" (", ()),
   151                                  ("%s"%min_value, (tagname, "lower")),
   150                                  ("%s"%min_value, (tagname, "lower")),
   152                                  ("..", ()),
   151                                  ("..", ()),
   153                                  ("%s"%max_value, (tagname, "upper")),
   152                                  ("%s"%max_value, (tagname, "upper")),
   154                                  (")",())]
   153                                  (")",())]
   155             # Data type is an enumerated type
   154             # Data type is an enumerated type
   156             elif basetype_content["name"] == "enum":
   155             elif basetype_content_type == "enum":
   157                 values = [[(value.getname(), (tagname, "value", i))]
   156                 values = [[(value.getname(), (tagname, "value", i))]
   158                           for i, value in enumerate(basetype_content["value"].values.getvalue())]
   157                           for i, value in enumerate(
       
   158                               basetype_content.xpath("ppx:values/ppx:value", 
       
   159                                   namespaces=PLCOpenParser.NSMAP))]
   159                 datatype_def += [("(", ())]
   160                 datatype_def += [("(", ())]
   160                 datatype_def += JoinList([(", ", ())], values)
   161                 datatype_def += JoinList([(", ", ())], values)
   161                 datatype_def += [(")", ())]
   162                 datatype_def += [(")", ())]
   162             # Data type is an array
   163             # Data type is an array
   163             elif basetype_content["name"] == "array":
   164             elif basetype_content_type == "array":
   164                 base_type = basetype_content["value"].baseType.getcontent()
   165                 base_type = basetype_content.baseType.getcontent()
       
   166                 base_type_type = base_type.getLocalTag()
   165                 # Array derived directly from a user defined type 
   167                 # Array derived directly from a user defined type 
   166                 if base_type["name"] == "derived":
   168                 if base_type_type == "derived":
   167                     basetype_name = base_type["value"].getname()
   169                     basetype_name = base_type.getname()
   168                     self.GenerateDataType(basetype_name)
   170                     self.GenerateDataType(basetype_name)
   169                 # Array derived directly from a string type 
       
   170                 elif base_type["name"] in ["string", "wstring"]:
       
   171                     basetype_name = base_type["name"].upper()
       
   172                 # Array derived directly from an elementary type 
   171                 # Array derived directly from an elementary type 
   173                 else:
   172                 else:
   174                     basetype_name = base_type["name"]
   173                     basetype_name = base_type_type.upper()
   175                 dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")),
   174                 dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")),
   176                                ("..", ()),
   175                                ("..", ()),
   177                                ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))] 
   176                                ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))] 
   178                               for i, dimension in enumerate(basetype_content["value"].getdimension())]
   177                               for i, dimension in enumerate(basetype_content.getdimension())]
   179                 datatype_def += [("ARRAY [", ())]
   178                 datatype_def += [("ARRAY [", ())]
   180                 datatype_def += JoinList([(",", ())], dimensions)
   179                 datatype_def += JoinList([(",", ())], dimensions)
   181                 datatype_def += [("] OF " , ()),
   180                 datatype_def += [("] OF " , ()),
   182                                  (basetype_name, (tagname, "base"))]
   181                                  (basetype_name, (tagname, "base"))]
   183             # Data type is a structure
   182             # Data type is a structure
   184             elif basetype_content["name"] == "struct":
   183             elif basetype_content_type == "struct":
   185                 elements = []
   184                 elements = []
   186                 for i, element in enumerate(basetype_content["value"].getvariable()):
   185                 for i, element in enumerate(basetype_content.getvariable()):
   187                     element_type = element.type.getcontent()
   186                     element_type = element.type.getcontent()
       
   187                     element_type_type = element_type.getLocalTag()
   188                     # Structure element derived directly from a user defined type 
   188                     # Structure element derived directly from a user defined type 
   189                     if element_type["name"] == "derived":
   189                     if element_type_type == "derived":
   190                         elementtype_name = element_type["value"].getname()
   190                         elementtype_name = element_type.getname()
   191                         self.GenerateDataType(elementtype_name)
   191                         self.GenerateDataType(elementtype_name)
   192                     elif element_type["name"] == "array":
   192                     elif element_type_type == "array":
   193                         base_type = element_type["value"].baseType.getcontent()
   193                         base_type = element_type.baseType.getcontent()
       
   194                         base_type_type = base_type.getLocalTag()
   194                         # Array derived directly from a user defined type 
   195                         # Array derived directly from a user defined type 
   195                         if base_type["name"] == "derived":
   196                         if base_type_type == "derived":
   196                             basetype_name = base_type["value"].getname()
   197                             basetype_name = base_type.getname()
   197                             self.GenerateDataType(basetype_name)
   198                             self.GenerateDataType(basetype_name)
   198                         # Array derived directly from a string type 
       
   199                         elif base_type["name"] in ["string", "wstring"]:
       
   200                             basetype_name = base_type["name"].upper()
       
   201                         # Array derived directly from an elementary type 
   199                         # Array derived directly from an elementary type 
   202                         else:
   200                         else:
   203                             basetype_name = base_type["name"]
   201                             basetype_name = base_type_type.upper()
   204                         dimensions = ["%s..%s" % (dimension.getlower(), dimension.getupper())
   202                         dimensions = ["%s..%s" % (dimension.getlower(), dimension.getupper())
   205                                       for dimension in element_type["value"].getdimension()]
   203                                       for dimension in element_type.getdimension()]
   206                         elementtype_name = "ARRAY [%s] OF %s" % (",".join(dimensions), basetype_name)
   204                         elementtype_name = "ARRAY [%s] OF %s" % (",".join(dimensions), basetype_name)
   207                     # Structure element derived directly from a string type 
       
   208                     elif element_type["name"] in ["string", "wstring"]:
       
   209                         elementtype_name = element_type["name"].upper()
       
   210                     # Structure element derived directly from an elementary type 
   205                     # Structure element derived directly from an elementary type 
   211                     else:
   206                     else:
   212                         elementtype_name = element_type["name"]
   207                         elementtype_name = element_type_type.upper()
   213                     element_text = [("\n    ", ()),
   208                     element_text = [("\n    ", ()),
   214                                     (element.getname(), (tagname, "struct", i, "name")),
   209                                     (element.getname(), (tagname, "struct", i, "name")),
   215                                     (" : ", ()),
   210                                     (" : ", ()),
   216                                     (elementtype_name, (tagname, "struct", i, "type"))]
   211                                     (elementtype_name, (tagname, "struct", i, "type"))]
   217                     if element.initialValue is not None:
   212                     if element.initialValue is not None:
   222                 datatype_def += [("STRUCT", ())]
   217                 datatype_def += [("STRUCT", ())]
   223                 datatype_def += JoinList([("", ())], elements)
   218                 datatype_def += JoinList([("", ())], elements)
   224                 datatype_def += [("\n  END_STRUCT", ())]
   219                 datatype_def += [("\n  END_STRUCT", ())]
   225             # Data type derived directly from a elementary type 
   220             # Data type derived directly from a elementary type 
   226             else:
   221             else:
   227                 datatype_def += [(basetype_content["name"], (tagname, "base"))]
   222                 datatype_def += [(basetype_content_type.upper(), (tagname, "base"))]
   228             # Data type has an initial value
   223             # Data type has an initial value
   229             if datatype.initialValue is not None:
   224             if datatype.initialValue is not None:
   230                 datatype_def += [(" := ", ()),
   225                 datatype_def += [(" := ", ()),
   231                                  (self.ComputeValue(datatype.initialValue.getvalue(), datatype_name), (tagname, "initial value"))]
   226                                  (self.ComputeValue(datatype.initialValue.getvalue(), datatype_name), (tagname, "initial value"))]
   232             datatype_def += [(";\n", ())]
   227             datatype_def += [(";\n", ())]
   269         varlists = [(varlist, varlist.getvariable()[:]) for varlist in configuration.getglobalVars()]
   264         varlists = [(varlist, varlist.getvariable()[:]) for varlist in configuration.getglobalVars()]
   270         
   265         
   271         extra_variables = self.Controler.GetConfigurationExtraVariables()
   266         extra_variables = self.Controler.GetConfigurationExtraVariables()
   272         if len(extra_variables) > 0:
   267         if len(extra_variables) > 0:
   273             if len(varlists) == 0:
   268             if len(varlists) == 0:
   274                 varlists = [(plcopen.interface_globalVars(), [])]
   269                 varlists = [(PLCOpenParser.CreateElement("globalVars", "interface"), [])]
   275             varlists[-1][1].extend(extra_variables)
   270             varlists[-1][1].extend(extra_variables)
   276             
   271             
   277         # Generate any global variable in configuration
   272         # Generate any global variable in configuration
   278         for varlist, varlist_variables in varlists:
   273         for varlist, varlist_variables in varlists:
   279             variable_type = errorVarTypes.get("VAR_GLOBAL", "var_local")
   274             variable_type = errorVarTypes.get("VAR_GLOBAL", "var_local")
   287                 config += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   282                 config += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   288             config += [("\n", ())]
   283             config += [("\n", ())]
   289             # Generate any variable of this block
   284             # Generate any variable of this block
   290             for var in varlist_variables:
   285             for var in varlist_variables:
   291                 vartype_content = var.gettype().getcontent()
   286                 vartype_content = var.gettype().getcontent()
   292                 if vartype_content["name"] == "derived":
   287                 if vartype_content.getLocalTag() == "derived":
   293                     var_type = vartype_content["value"].getname()
   288                     var_type = vartype_content.getname()
   294                     self.GenerateDataType(var_type)
   289                     self.GenerateDataType(var_type)
   295                 else:
   290                 else:
   296                     var_type = var.gettypeAsText()
   291                     var_type = var.gettypeAsText()
   297                 
   292                 
   298                 config += [("    ", ()),
   293                 config += [("    ", ()),
   340                 resrce += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   335                 resrce += [(" NON_RETAIN", (tagname, variable_type, (var_number, var_number + len(varlist.getvariable())), "non_retain"))]
   341             resrce += [("\n", ())]
   336             resrce += [("\n", ())]
   342             # Generate any variable of this block
   337             # Generate any variable of this block
   343             for var in varlist.getvariable():
   338             for var in varlist.getvariable():
   344                 vartype_content = var.gettype().getcontent()
   339                 vartype_content = var.gettype().getcontent()
   345                 if vartype_content["name"] == "derived":
   340                 if vartype_content.getLocalTag() == "derived":
   346                     var_type = vartype_content["value"].getname()
   341                     var_type = vartype_content.getname()
   347                     self.GenerateDataType(var_type)
   342                     self.GenerateDataType(var_type)
   348                 else:
   343                 else:
   349                     var_type = var.gettypeAsText()
   344                     var_type = var.gettypeAsText()
   350                 
   345                 
   351                 resrce += [("      ", ()),
   346                 resrce += [("      ", ()),
   456 
   451 
   457 #-------------------------------------------------------------------------------
   452 #-------------------------------------------------------------------------------
   458 #                           Generator of POU programs
   453 #                           Generator of POU programs
   459 #-------------------------------------------------------------------------------
   454 #-------------------------------------------------------------------------------
   460 
   455 
       
   456 [ConnectorClass, ContinuationClass, ActionBlockClass] = [
       
   457     PLCOpenParser.GetElementClass(instance_name, "commonObjects")
       
   458     for instance_name in ["connector", "continuation", "actionBlock"]]
       
   459 [InVariableClass, InOutVariableClass, OutVariableClass, BlockClass] = [
       
   460     PLCOpenParser.GetElementClass(instance_name, "fbdObjects")
       
   461     for instance_name in ["inVariable", "inOutVariable", "outVariable", "block"]]
       
   462 [ContactClass, CoilClass, LeftPowerRailClass, RightPowerRailClass] = [
       
   463     PLCOpenParser.GetElementClass(instance_name, "ldObjects")
       
   464     for instance_name in ["contact", "coil", "leftPowerRail", "rightPowerRail"]]
       
   465 [StepClass, TransitionClass, JumpStepClass, 
       
   466  SelectionConvergenceClass, SelectionDivergenceClass,
       
   467  SimultaneousConvergenceClass, SimultaneousDivergenceClass] = [
       
   468     PLCOpenParser.GetElementClass(instance_name, "sfcObjects")
       
   469     for instance_name in ["step", "transition", "jumpStep", 
       
   470         "selectionConvergence", "selectionDivergence",
       
   471         "simultaneousConvergence", "simultaneousDivergence"]]
       
   472 TransitionObjClass = PLCOpenParser.GetElementClass("transition", "transitions")
       
   473 ActionObjClass = PLCOpenParser.GetElementClass("action", "actions")
   461 
   474 
   462 class PouProgramGenerator:
   475 class PouProgramGenerator:
   463     
   476     
   464     # Create a new POU program generator
   477     # Create a new POU program generator
   465     def __init__(self, parent, name, type, errors, warnings):
   478     def __init__(self, parent, name, type, errors, warnings):
   546         return None        
   559         return None        
   547 
   560 
   548     def GetLinkedConnector(self, link, body):
   561     def GetLinkedConnector(self, link, body):
   549         parameter = link.getformalParameter()
   562         parameter = link.getformalParameter()
   550         instance = body.getcontentInstance(link.getrefLocalId())
   563         instance = body.getcontentInstance(link.getrefLocalId())
   551         if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable, plcopen.commonObjects_continuation, plcopen.ldObjects_contact, plcopen.ldObjects_coil)):
   564         if isinstance(instance, (InVariableClass, InOutVariableClass, 
       
   565              ContinuationClass, ContactClass, CoilClass)):
   552             return instance.connectionPointOut
   566             return instance.connectionPointOut
   553         elif isinstance(instance, plcopen.fbdObjects_block):
   567         elif isinstance(instance, BlockClass):
   554             outputvariables = instance.outputVariables.getvariable()
   568             outputvariables = instance.outputVariables.getvariable()
   555             if len(outputvariables) == 1:
   569             if len(outputvariables) == 1:
   556                 return outputvariables[0].connectionPointOut
   570                 return outputvariables[0].connectionPointOut
   557             elif parameter:
   571             elif parameter:
   558                 for variable in outputvariables:
   572                 for variable in outputvariables:
   563                 for variable in outputvariables:
   577                 for variable in outputvariables:
   564                     relposition = variable.connectionPointOut.getrelPositionXY()
   578                     relposition = variable.connectionPointOut.getrelPositionXY()
   565                     blockposition = instance.getposition()
   579                     blockposition = instance.getposition()
   566                     if point.x == blockposition.x + relposition[0] and point.y == blockposition.y + relposition[1]:
   580                     if point.x == blockposition.x + relposition[0] and point.y == blockposition.y + relposition[1]:
   567                         return variable.connectionPointOut
   581                         return variable.connectionPointOut
   568         elif isinstance(instance, plcopen.ldObjects_leftPowerRail):
   582         elif isinstance(instance, LeftPowerRailClass):
   569             outputconnections = instance.getconnectionPointOut()
   583             outputconnections = instance.getconnectionPointOut()
   570             if len(outputconnections) == 1:
   584             if len(outputconnections) == 1:
   571                 return outputconnections[0]
   585                 return outputconnections[0]
   572             else:
   586             else:
   573                 point = link.getposition()[-1]
   587                 point = link.getposition()[-1]
   589         if interface is not None:
   603         if interface is not None:
   590             body = pou.getbody()
   604             body = pou.getbody()
   591             if isinstance(body, ListType):
   605             if isinstance(body, ListType):
   592                 body = body[0]
   606                 body = body[0]
   593             body_content = body.getcontent()
   607             body_content = body.getcontent()
       
   608             body_type = body_content.getLocalTag()
   594             if self.Type == "FUNCTION":
   609             if self.Type == "FUNCTION":
   595                 returntype_content = interface.getreturnType().getcontent()
   610                 returntype_content = interface.getreturnType().getcontent()
   596                 if returntype_content["name"] == "derived":
   611                 returntype_content_type = returntype_content.getLocalTag()
   597                     self.ReturnType = returntype_content["value"].getname()
   612                 if returntype_content_type == "derived":
   598                 elif returntype_content["name"] in ["string", "wstring"]:
   613                     self.ReturnType = returntype_content.getname()
   599                     self.ReturnType = returntype_content["name"].upper()
   614                 else:
   600                 else:
   615                     self.ReturnType = returntype_content_type.upper()
   601                     self.ReturnType = returntype_content["name"]
       
   602             for varlist in interface.getcontent():
   616             for varlist in interface.getcontent():
   603                 variables = []
   617                 variables = []
   604                 located = []
   618                 located = []
   605                 for var in varlist["value"].getvariable():
   619                 varlist_type = varlist.getLocalTag()
       
   620                 for var in varlist.getvariable():
   606                     vartype_content = var.gettype().getcontent()
   621                     vartype_content = var.gettype().getcontent()
   607                     if vartype_content["name"] == "derived":
   622                     if vartype_content.getLocalTag() == "derived":
   608                         var_type = vartype_content["value"].getname()
   623                         var_type = vartype_content.getname()
   609                         blocktype = self.GetBlockType(var_type)
   624                         blocktype = self.GetBlockType(var_type)
   610                         if blocktype is not None:
   625                         if blocktype is not None:
   611                             self.ParentGenerator.GeneratePouProgram(var_type)
   626                             self.ParentGenerator.GeneratePouProgram(var_type)
   612                             if body_content["name"] in ["FBD", "LD", "SFC"]:
   627                             if body_type in ["FBD", "LD", "SFC"]:
   613                                 block = pou.getinstanceByName(var.getname())
   628                                 block = pou.getinstanceByName(var.getname())
   614                             else:
   629                             else:
   615                                 block = None
   630                                 block = None
   616                             for variable in blocktype["initialise"](var_type, var.getname(), block):
   631                             for variable in blocktype["initialise"](var_type, var.getname(), block):
   617                                 if variable[2] is not None:
   632                                 if variable[2] is not None:
   625                                 initial_value = initial.getvalue()
   640                                 initial_value = initial.getvalue()
   626                             else:
   641                             else:
   627                                 initial_value = None
   642                                 initial_value = None
   628                             address = var.getaddress()
   643                             address = var.getaddress()
   629                             if address is not None:
   644                             if address is not None:
   630                                 located.append((vartype_content["value"].getname(), var.getname(), address, initial_value))
   645                                 located.append((vartype_content.getname(), var.getname(), address, initial_value))
   631                             else:
   646                             else:
   632                                 variables.append((vartype_content["value"].getname(), var.getname(), None, initial_value))
   647                                 variables.append((vartype_content.getname(), var.getname(), None, initial_value))
   633                     else:
   648                     else:
   634                         var_type = var.gettypeAsText()
   649                         var_type = var.gettypeAsText()
   635                         initial = var.getinitialValue()
   650                         initial = var.getinitialValue()
   636                         if initial:
   651                         if initial:
   637                             initial_value = initial.getvalue()
   652                             initial_value = initial.getvalue()
   640                         address = var.getaddress()
   655                         address = var.getaddress()
   641                         if address is not None:
   656                         if address is not None:
   642                             located.append((var_type, var.getname(), address, initial_value))
   657                             located.append((var_type, var.getname(), address, initial_value))
   643                         else:
   658                         else:
   644                             variables.append((var_type, var.getname(), None, initial_value))
   659                             variables.append((var_type, var.getname(), None, initial_value))
   645                 if varlist["value"].getconstant():
   660                 if varlist.getconstant():
   646                     option = "CONSTANT"
   661                     option = "CONSTANT"
   647                 elif varlist["value"].getretain():
   662                 elif varlist.getretain():
   648                     option = "RETAIN"
   663                     option = "RETAIN"
   649                 elif varlist["value"].getnonretain():
   664                 elif varlist.getnonretain():
   650                     option = "NON_RETAIN"
   665                     option = "NON_RETAIN"
   651                 else:
   666                 else:
   652                     option = None
   667                     option = None
   653                 if len(variables) > 0:
   668                 if len(variables) > 0:
   654                     self.Interface.append((varTypeNames[varlist["name"]], option, False, variables))
   669                     self.Interface.append((varTypeNames[varlist_type], option, False, variables))
   655                 if len(located) > 0:
   670                 if len(located) > 0:
   656                     self.Interface.append((varTypeNames[varlist["name"]], option, True, located))
   671                     self.Interface.append((varTypeNames[varlist_type], option, True, located))
   657     
   672     
   658     LITERAL_TYPES = {
   673     LITERAL_TYPES = {
   659         "T": "TIME",
   674         "T": "TIME",
   660         "D": "DATE",
   675         "D": "DATE",
   661         "TOD": "TIME_OF_DAY",
   676         "TOD": "TIME_OF_DAY",
   667     def ComputeConnectionTypes(self, pou):
   682     def ComputeConnectionTypes(self, pou):
   668         body = pou.getbody()
   683         body = pou.getbody()
   669         if isinstance(body, ListType):
   684         if isinstance(body, ListType):
   670             body = body[0]
   685             body = body[0]
   671         body_content = body.getcontent()
   686         body_content = body.getcontent()
   672         body_type = body_content["name"]
   687         body_type = body_content.getLocalTag()
   673         if body_type in ["FBD", "LD", "SFC"]:
   688         if body_type in ["FBD", "LD", "SFC"]:
   674             undefined_blocks = []
   689             undefined_blocks = []
   675             for instance in body.getcontentInstances():
   690             for instance in body.getcontentInstances():
   676                 if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   691                 if isinstance(instance, (InVariableClass, OutVariableClass, 
   677                     expression = instance.getexpression()
   692                                          InOutVariableClass)):
       
   693                     expression = instance.getexpression().text
   678                     var_type = self.GetVariableType(expression)
   694                     var_type = self.GetVariableType(expression)
   679                     if isinstance(pou, plcopen.transitions_transition) and expression == pou.getname():
   695                     if (isinstance(pou, TransitionObjClass) 
       
   696                         and expression == pou.getname()):
   680                         var_type = "BOOL"
   697                         var_type = "BOOL"
   681                     elif (not isinstance(pou, (plcopen.transitions_transition, plcopen.actions_action)) and
   698                     elif (not isinstance(pou, (TransitionObjClass, ActionObjClass)) and
   682                           pou.getpouType() == "function" and expression == pou.getname()):
   699                           pou.getpouType() == "function" and expression == pou.getname()):
   683                         returntype_content = pou.interface.getreturnType().getcontent()
   700                         returntype_content = pou.interface.getreturnType().getcontent()
   684                         if returntype_content["name"] == "derived":
   701                         returntype_content_type = returntype_content.getLocalTag()
   685                             var_type = returntype_content["value"].getname()
   702                         if returntype_content_type == "derived":
   686                         elif returntype_content["name"] in ["string", "wstring"]:
   703                             var_type = returntype_content.getname()
   687                             var_type = returntype_content["name"].upper()
       
   688                         else:
   704                         else:
   689                             var_type = returntype_content["name"]
   705                             var_type = returntype_content_type.upper()
   690                     elif var_type is None:
   706                     elif var_type is None:
   691                         parts = expression.split("#")
   707                         parts = expression.split("#")
   692                         if len(parts) > 1:
   708                         if len(parts) > 1:
   693                             literal_prefix = parts[0].upper()
   709                             literal_prefix = parts[0].upper()
   694                             var_type = self.LITERAL_TYPES.get(literal_prefix, 
   710                             var_type = self.LITERAL_TYPES.get(literal_prefix, 
   696                         elif expression.startswith("'"):
   712                         elif expression.startswith("'"):
   697                             var_type = "STRING"
   713                             var_type = "STRING"
   698                         elif expression.startswith('"'):
   714                         elif expression.startswith('"'):
   699                             var_type = "WSTRING"
   715                             var_type = "WSTRING"
   700                     if var_type is not None:
   716                     if var_type is not None:
   701                         if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable)):
   717                         if isinstance(instance, (InVariableClass, InOutVariableClass)):
   702                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   718                             for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   703                                 self.ConnectionTypes[connection] = var_type
   719                                 self.ConnectionTypes[connection] = var_type
   704                         if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   720                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   705                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   721                             self.ConnectionTypes[instance.connectionPointIn] = var_type
   706                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   722                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   707                             if connected and not self.ConnectionTypes.has_key(connected):
   723                             if connected and not self.ConnectionTypes.has_key(connected):
   708                                 for connection in self.ExtractRelatedConnections(connected):
   724                                 for connection in self.ExtractRelatedConnections(connected):
   709                                     self.ConnectionTypes[connection] = var_type
   725                                     self.ConnectionTypes[connection] = var_type
   710                 elif isinstance(instance, (plcopen.ldObjects_contact, plcopen.ldObjects_coil)):
   726                 elif isinstance(instance, (ContactClass, CoilClass)):
   711                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   727                     for connection in self.ExtractRelatedConnections(instance.connectionPointOut):
   712                         self.ConnectionTypes[connection] = "BOOL"
   728                         self.ConnectionTypes[connection] = "BOOL"
   713                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   729                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
   714                     connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   730                     connected = self.GetConnectedConnector(instance.connectionPointIn, body)
   715                     if connected and not self.ConnectionTypes.has_key(connected):
   731                     if connected and not self.ConnectionTypes.has_key(connected):
   716                         for connection in self.ExtractRelatedConnections(connected):
   732                         for connection in self.ExtractRelatedConnections(connected):
   717                             self.ConnectionTypes[connection] = "BOOL"
   733                             self.ConnectionTypes[connection] = "BOOL"
   718                 elif isinstance(instance, plcopen.ldObjects_leftPowerRail):
   734                 elif isinstance(instance, LeftPowerRailClass):
   719                     for connection in instance.getconnectionPointOut():
   735                     for connection in instance.getconnectionPointOut():
   720                         for related in self.ExtractRelatedConnections(connection):
   736                         for related in self.ExtractRelatedConnections(connection):
   721                             self.ConnectionTypes[related] = "BOOL"
   737                             self.ConnectionTypes[related] = "BOOL"
   722                 elif isinstance(instance, plcopen.ldObjects_rightPowerRail):
   738                 elif isinstance(instance, RightPowerRailClass):
   723                     for connection in instance.getconnectionPointIn():
   739                     for connection in instance.getconnectionPointIn():
   724                         self.ConnectionTypes[connection] = "BOOL"
   740                         self.ConnectionTypes[connection] = "BOOL"
   725                         connected = self.GetConnectedConnector(connection, body)
   741                         connected = self.GetConnectedConnector(connection, body)
   726                         if connected and not self.ConnectionTypes.has_key(connected):
   742                         if connected and not self.ConnectionTypes.has_key(connected):
   727                             for connection in self.ExtractRelatedConnections(connected):
   743                             for connection in self.ExtractRelatedConnections(connected):
   728                                 self.ConnectionTypes[connection] = "BOOL"
   744                                 self.ConnectionTypes[connection] = "BOOL"
   729                 elif isinstance(instance, plcopen.sfcObjects_transition):
   745                 elif isinstance(instance, TransitionClass):
   730                     content = instance.condition.getcontent()
   746                     content = instance.getconditionContent()
   731                     if content["name"] == "connection" and len(content["value"]) == 1:
   747                     if content["type"] == "connection":
   732                         connected = self.GetLinkedConnector(content["value"][0], body)
   748                         connected = self.GetLinkedConnector(content["value"], body)
   733                         if connected and not self.ConnectionTypes.has_key(connected):
   749                         if connected and not self.ConnectionTypes.has_key(connected):
   734                             for connection in self.ExtractRelatedConnections(connected):
   750                             for connection in self.ExtractRelatedConnections(connected):
   735                                 self.ConnectionTypes[connection] = "BOOL"
   751                                 self.ConnectionTypes[connection] = "BOOL"
   736                 elif isinstance(instance, plcopen.commonObjects_continuation):
   752                 elif isinstance(instance, ContinuationClass):
   737                     name = instance.getname()
   753                     name = instance.getname()
   738                     connector = None
   754                     connector = None
   739                     var_type = "ANY"
   755                     var_type = "ANY"
   740                     for element in body.getcontentInstances():
   756                     for element in body.getcontentInstances():
   741                         if isinstance(element, plcopen.commonObjects_connector) and element.getname() == name:
   757                         if isinstance(element, ConnectorClass) and element.getname() == name:
   742                             if connector is not None:
   758                             if connector is not None:
   743                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   759                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   744                             connector = element
   760                             connector = element
   745                     if connector is not None:
   761                     if connector is not None:
   746                         undefined = [instance.connectionPointOut, connector.connectionPointIn]
   762                         undefined = [instance.connectionPointOut, connector.connectionPointIn]
   758                         else:
   774                         else:
   759                             for connection in related:
   775                             for connection in related:
   760                                 self.ConnectionTypes[connection] = var_type
   776                                 self.ConnectionTypes[connection] = var_type
   761                     else:
   777                     else:
   762                         raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   778                         raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   763                 elif isinstance(instance, plcopen.fbdObjects_block):
   779                 elif isinstance(instance, BlockClass):
   764                     block_infos = self.GetBlockType(instance.gettypeName(), "undefined")
   780                     block_infos = self.GetBlockType(instance.gettypeName(), "undefined")
   765                     if block_infos is not None:
   781                     if block_infos is not None:
   766                         self.ComputeBlockInputTypes(instance, block_infos, body)
   782                         self.ComputeBlockInputTypes(instance, block_infos, body)
   767                     else:
   783                     else:
   768                         for variable in instance.inputVariables.getvariable():
   784                         for variable in instance.inputVariables.getvariable():
   846     def ComputeProgram(self, pou):
   862     def ComputeProgram(self, pou):
   847         body = pou.getbody()
   863         body = pou.getbody()
   848         if isinstance(body, ListType):
   864         if isinstance(body, ListType):
   849             body = body[0]
   865             body = body[0]
   850         body_content = body.getcontent()
   866         body_content = body.getcontent()
   851         body_type = body_content["name"]
   867         body_type = body_content.getLocalTag()
   852         if body_type in ["IL","ST"]:
   868         if body_type in ["IL","ST"]:
   853             text = body_content["value"].gettext()
   869             text = body_content.getanyText()
   854             self.ParentGenerator.GeneratePouProgramInText(text.upper())
   870             self.ParentGenerator.GeneratePouProgramInText(text.upper())
   855             self.Program = [(ReIndentText(text, len(self.CurrentIndent)), 
   871             self.Program = [(ReIndentText(text, len(self.CurrentIndent)), 
   856                             (self.TagName, "body", len(self.CurrentIndent)))]
   872                             (self.TagName, "body", len(self.CurrentIndent)))]
   857         elif body_type == "SFC":
   873         elif body_type == "SFC":
   858             self.IndentRight()
   874             self.IndentRight()
   859             for instance in body.getcontentInstances():
   875             for instance in body.getcontentInstances():
   860                 if isinstance(instance, plcopen.sfcObjects_step):
   876                 if isinstance(instance, StepClass):
   861                     self.GenerateSFCStep(instance, pou)
   877                     self.GenerateSFCStep(instance, pou)
   862                 elif isinstance(instance, plcopen.commonObjects_actionBlock):
   878                 elif isinstance(instance, ActionBlockClass):
   863                     self.GenerateSFCStepActions(instance, pou)
   879                     self.GenerateSFCStepActions(instance, pou)
   864                 elif isinstance(instance, plcopen.sfcObjects_transition):
   880                 elif isinstance(instance, TransitionClass):
   865                     self.GenerateSFCTransition(instance, pou)
   881                     self.GenerateSFCTransition(instance, pou)
   866                 elif isinstance(instance, plcopen.sfcObjects_jumpStep):
   882                 elif isinstance(instance, JumpClass):
   867                     self.GenerateSFCJump(instance, pou)
   883                     self.GenerateSFCJump(instance, pou)
   868             if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0:
   884             if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0:
   869                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   885                 action_name = "COMPUTE_FUNCTION_BLOCKS"
   870                 action_infos = {"qualifier" : "S", "content" : action_name}
   886                 action_infos = {"qualifier" : "S", "content" : action_name}
   871                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
   887                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
   876                 self.ComputeSFCStep(initialstep)
   892                 self.ComputeSFCStep(initialstep)
   877         else:
   893         else:
   878             otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []}
   894             otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []}
   879             orderedInstances = []
   895             orderedInstances = []
   880             for instance in body.getcontentInstances():
   896             for instance in body.getcontentInstances():
   881                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)):
   897                 if isinstance(instance, (OutVariableClass, InOutVariableClass, BlockClass)):
   882                     executionOrderId = instance.getexecutionOrderId()
   898                     executionOrderId = instance.getexecutionOrderId()
   883                     if executionOrderId > 0:
   899                     if executionOrderId > 0:
   884                         orderedInstances.append((executionOrderId, instance))
   900                         orderedInstances.append((executionOrderId, instance))
   885                     elif isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   901                     elif isinstance(instance, (OutVariableClass, InOutVariableClass)):
   886                         otherInstances["outVariables&coils"].append(instance)
   902                         otherInstances["outVariables&coils"].append(instance)
   887                     elif isinstance(instance, plcopen.fbdObjects_block):
   903                     elif isinstance(instance, BlockClass):
   888                         otherInstances["blocks"].append(instance)
   904                         otherInstances["blocks"].append(instance)
   889                 elif isinstance(instance, plcopen.commonObjects_connector):
   905                 elif isinstance(instance, ConnectorClass):
   890                     otherInstances["connectors"].append(instance)
   906                     otherInstances["connectors"].append(instance)
   891                 elif isinstance(instance, plcopen.ldObjects_coil):
   907                 elif isinstance(instance, CoilClass):
   892                     otherInstances["outVariables&coils"].append(instance)
   908                     otherInstances["outVariables&coils"].append(instance)
   893             orderedInstances.sort()
   909             orderedInstances.sort()
   894             otherInstances["outVariables&coils"].sort(SortInstances)
   910             otherInstances["outVariables&coils"].sort(SortInstances)
   895             otherInstances["blocks"].sort(SortInstances)
   911             otherInstances["blocks"].sort(SortInstances)
   896             instances = [instance for (executionOrderId, instance) in orderedInstances]
   912             instances = [instance for (executionOrderId, instance) in orderedInstances]
   897             instances.extend(otherInstances["outVariables&coils"] + otherInstances["blocks"] + otherInstances["connectors"])
   913             instances.extend(otherInstances["outVariables&coils"] + otherInstances["blocks"] + otherInstances["connectors"])
   898             for instance in instances:
   914             for instance in instances:
   899                 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)):
   915                 if isinstance(instance, (OutVariableClass, InOutVariableClass)):
   900                     connections = instance.connectionPointIn.getconnections()
   916                     connections = instance.connectionPointIn.getconnections()
   901                     if connections is not None:
   917                     if connections is not None:
   902                         expression = self.ComputeExpression(body, connections)
   918                         expression = self.ComputeExpression(body, connections)
   903                         if expression is not None:
   919                         if expression is not None:
   904                             self.Program += [(self.CurrentIndent, ()),
   920                             self.Program += [(self.CurrentIndent, ()),
   905                                              (instance.getexpression(), (self.TagName, "io_variable", instance.getlocalId(), "expression")),
   921                                              (instance.getexpression().text, (self.TagName, "io_variable", instance.getlocalId(), "expression")),
   906                                              (" := ", ())]
   922                                              (" := ", ())]
   907                             self.Program += expression
   923                             self.Program += expression
   908                             self.Program += [(";\n", ())]
   924                             self.Program += [(";\n", ())]
   909                 elif isinstance(instance, plcopen.fbdObjects_block):
   925                 elif isinstance(instance, BlockClass):
   910                     block_type = instance.gettypeName()
   926                     block_type = instance.gettypeName()
   911                     self.ParentGenerator.GeneratePouProgram(block_type)
   927                     self.ParentGenerator.GeneratePouProgram(block_type)
   912                     block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"]))
   928                     block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"]))
   913                     if block_infos is None:
   929                     if block_infos is None:
   914                         block_infos = self.GetBlockType(block_type)
   930                         block_infos = self.GetBlockType(block_type)
   916                         raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
   932                         raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
   917                     try:
   933                     try:
   918                         block_infos["generate"](self, instance, block_infos, body, None)
   934                         block_infos["generate"](self, instance, block_infos, body, None)
   919                     except ValueError, e:
   935                     except ValueError, e:
   920                         raise PLCGenException, e.message
   936                         raise PLCGenException, e.message
   921                 elif isinstance(instance, plcopen.commonObjects_connector):
   937                 elif isinstance(instance, ConnectorClass):
   922                     connector = instance.getname()
   938                     connector = instance.getname()
   923                     if self.ComputedConnectors.get(connector, None):
   939                     if self.ComputedConnectors.get(connector, None):
   924                         continue
   940                         continue
   925                     expression = self.ComputeExpression(body, instance.connectionPointIn.getconnections())
   941                     expression = self.ComputeExpression(body, instance.connectionPointIn.getconnections())
   926                     if expression is not None:
   942                     if expression is not None:
   927                         self.ComputedConnectors[connector] = expression
   943                         self.ComputedConnectors[connector] = expression
   928                 elif isinstance(instance, plcopen.ldObjects_coil):
   944                 elif isinstance(instance, CoilClass):
   929                     connections = instance.connectionPointIn.getconnections()
   945                     connections = instance.connectionPointIn.getconnections()
   930                     if connections is not None:
   946                     if connections is not None:
   931                         coil_info = (self.TagName, "coil", instance.getlocalId())
   947                         coil_info = (self.TagName, "coil", instance.getlocalId())
   932                         expression = self.ComputeExpression(body, connections)
   948                         expression = self.ComputeExpression(body, connections)
   933                         if expression is not None:
   949                         if expression is not None:
   934                             expression = self.ExtractModifier(instance, expression, coil_info)
   950                             expression = self.ExtractModifier(instance, expression, coil_info)
   935                             self.Program += [(self.CurrentIndent, ())]
   951                             self.Program += [(self.CurrentIndent, ())]
   936                             self.Program += [(instance.getvariable(), coil_info + ("reference",))]
   952                             self.Program += [(instance.getvariable().text, coil_info + ("reference",))]
   937                             self.Program += [(" := ", ())] + expression + [(";\n", ())]
   953                             self.Program += [(" := ", ())] + expression + [(";\n", ())]
   938                         
   954                         
   939     def FactorizePaths(self, paths):
   955     def FactorizePaths(self, paths):
   940         same_paths = {}
   956         same_paths = {}
   941         uncomputed_index = range(len(paths))
   957         uncomputed_index = range(len(paths))
   966     def GeneratePaths(self, connections, body, order = False, to_inout = False):
   982     def GeneratePaths(self, connections, body, order = False, to_inout = False):
   967         paths = []
   983         paths = []
   968         for connection in connections:
   984         for connection in connections:
   969             localId = connection.getrefLocalId()
   985             localId = connection.getrefLocalId()
   970             next = body.getcontentInstance(localId)
   986             next = body.getcontentInstance(localId)
   971             if isinstance(next, plcopen.ldObjects_leftPowerRail):
   987             if isinstance(next, LeftPowerRailClass):
   972                 paths.append(None)
   988                 paths.append(None)
   973             elif isinstance(next, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable)):
   989             elif isinstance(next, (InVariableClass, InOutVariableClass)):
   974                 paths.append(str([(next.getexpression(), (self.TagName, "io_variable", localId, "expression"))]))
   990                 paths.append(str([(next.getexpression().text, (self.TagName, "io_variable", localId, "expression"))]))
   975             elif isinstance(next, plcopen.fbdObjects_block):
   991             elif isinstance(next, BlockClass):
   976                 block_type = next.gettypeName()
   992                 block_type = next.gettypeName()
   977                 self.ParentGenerator.GeneratePouProgram(block_type)
   993                 self.ParentGenerator.GeneratePouProgram(block_type)
   978                 block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in next.inputVariables.getvariable() if variable.getformalParameter() != "EN"]))
   994                 block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in next.inputVariables.getvariable() if variable.getformalParameter() != "EN"]))
   979                 if block_infos is None:
   995                 if block_infos is None:
   980                     block_infos = self.GetBlockType(block_type)
   996                     block_infos = self.GetBlockType(block_type)
   982                     raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
   998                     raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name)
   983                 try:
   999                 try:
   984                     paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout)))
  1000                     paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout)))
   985                 except ValueError, e:
  1001                 except ValueError, e:
   986                     raise PLCGenException, e.message
  1002                     raise PLCGenException, e.message
   987             elif isinstance(next, plcopen.commonObjects_continuation):
  1003             elif isinstance(next, ContinuationClass):
   988                 name = next.getname()
  1004                 name = next.getname()
   989                 computed_value = self.ComputedConnectors.get(name, None)
  1005                 computed_value = self.ComputedConnectors.get(name, None)
   990                 if computed_value != None:
  1006                 if computed_value != None:
   991                     paths.append(str(computed_value))
  1007                     paths.append(str(computed_value))
   992                 else:
  1008                 else:
   993                     connector = None
  1009                     connector = None
   994                     for instance in body.getcontentInstances():
  1010                     for instance in body.getcontentInstances():
   995                         if isinstance(instance, plcopen.commonObjects_connector) and instance.getname() == name:
  1011                         if isinstance(instance, ConnectorClass) and instance.getname() == name:
   996                             if connector is not None:
  1012                             if connector is not None:
   997                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
  1013                                 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
   998                             connector = instance
  1014                             connector = instance
   999                     if connector is not None:
  1015                     if connector is not None:
  1000                         connections = connector.connectionPointIn.getconnections()
  1016                         connections = connector.connectionPointIn.getconnections()
  1003                             if expression is not None:
  1019                             if expression is not None:
  1004                                 self.ComputedConnectors[name] = expression
  1020                                 self.ComputedConnectors[name] = expression
  1005                                 paths.append(str(expression))
  1021                                 paths.append(str(expression))
  1006                     else:
  1022                     else:
  1007                         raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
  1023                         raise PLCGenException, _("No connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name)
  1008             elif isinstance(next, plcopen.ldObjects_contact):
  1024             elif isinstance(next, ContactClass):
  1009                 contact_info = (self.TagName, "contact", next.getlocalId())
  1025                 contact_info = (self.TagName, "contact", next.getlocalId())
  1010                 variable = str(self.ExtractModifier(next, [(next.getvariable(), contact_info + ("reference",))], contact_info))
  1026                 variable = str(self.ExtractModifier(next, [(next.getvariable().text, contact_info + ("reference",))], contact_info))
  1011                 result = self.GeneratePaths(next.connectionPointIn.getconnections(), body, order)
  1027                 result = self.GeneratePaths(next.connectionPointIn.getconnections(), body, order)
  1012                 if len(result) > 1:
  1028                 if len(result) > 1:
  1013                     factorized_paths = self.FactorizePaths(result)
  1029                     factorized_paths = self.FactorizePaths(result)
  1014                     if len(factorized_paths) > 1:
  1030                     if len(factorized_paths) > 1:
  1015                         paths.append([variable, tuple(factorized_paths)])
  1031                         paths.append([variable, tuple(factorized_paths)])
  1019                     paths.append([variable] + result[0])
  1035                     paths.append([variable] + result[0])
  1020                 elif result[0] is not None:
  1036                 elif result[0] is not None:
  1021                     paths.append([variable, result[0]])
  1037                     paths.append([variable, result[0]])
  1022                 else:
  1038                 else:
  1023                     paths.append(variable)
  1039                     paths.append(variable)
  1024             elif isinstance(next, plcopen.ldObjects_coil):
  1040             elif isinstance(next, CoilClass):
  1025                 paths.append(str(self.GeneratePaths(next.connectionPointIn.getconnections(), body, order)))
  1041                 paths.append(str(self.GeneratePaths(next.connectionPointIn.getconnections(), body, order)))
  1026         return paths
  1042         return paths
  1027 
  1043 
  1028     def ComputePaths(self, paths, first = False):
  1044     def ComputePaths(self, paths, first = False):
  1029         if type(paths) == TupleType:
  1045         if type(paths) == TupleType:
  1131                     instanceLocalId = connections[0].getrefLocalId()
  1147                     instanceLocalId = connections[0].getrefLocalId()
  1132                     body = pou.getbody()
  1148                     body = pou.getbody()
  1133                     if isinstance(body, ListType):
  1149                     if isinstance(body, ListType):
  1134                         body = body[0]
  1150                         body = body[0]
  1135                     instance = body.getcontentInstance(instanceLocalId)
  1151                     instance = body.getcontentInstance(instanceLocalId)
  1136                     if isinstance(instance, plcopen.sfcObjects_transition):
  1152                     if isinstance(instance, TransitionClass):
  1137                         instances.append(instance)
  1153                         instances.append(instance)
  1138                     elif isinstance(instance, plcopen.sfcObjects_selectionConvergence):
  1154                     elif isinstance(instance, SelectionConvergenceClass):
  1139                         instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1155                         instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1140                     elif isinstance(instance, plcopen.sfcObjects_simultaneousDivergence):
  1156                     elif isinstance(instance, SimultaneousDivergenceClass):
  1141                         transition = self.ExtractDivergenceInput(instance, pou)
  1157                         transition = self.ExtractDivergenceInput(instance, pou)
  1142                         if transition:
  1158                         if transition:
  1143                             if isinstance(transition, plcopen.sfcObjects_transition):
  1159                             if isinstance(transition, TransitionClass):
  1144                                 instances.append(transition)
  1160                                 instances.append(transition)
  1145                             elif isinstance(transition, plcopen.sfcObjects_selectionConvergence):
  1161                             elif isinstance(transition, SelectionConvergenceClass):
  1146                                 instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1162                                 instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1147                 for instance in instances:
  1163                 for instance in instances:
  1148                     self.GenerateSFCTransition(instance, pou)
  1164                     self.GenerateSFCTransition(instance, pou)
  1149                     if instance in self.SFCNetworks["Transitions"].keys():
  1165                     if instance in self.SFCNetworks["Transitions"].keys():
  1150                         target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"])
  1166                         target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"])
  1159                 instanceLocalId = connections[0].getrefLocalId()
  1175                 instanceLocalId = connections[0].getrefLocalId()
  1160                 body = pou.getbody()
  1176                 body = pou.getbody()
  1161                 if isinstance(body, ListType):
  1177                 if isinstance(body, ListType):
  1162                     body = body[0]
  1178                     body = body[0]
  1163                 instance = body.getcontentInstance(instanceLocalId)
  1179                 instance = body.getcontentInstance(instanceLocalId)
  1164                 if isinstance(instance, plcopen.sfcObjects_transition):
  1180                 if isinstance(instance, TransitionClass):
  1165                     instances.append(instance)
  1181                     instances.append(instance)
  1166                 elif isinstance(instance, plcopen.sfcObjects_selectionConvergence):
  1182                 elif isinstance(instance, SelectionConvergenceClass):
  1167                     instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1183                     instances.extend(self.ExtractConvergenceInputs(instance, pou))
  1168                 elif isinstance(instance, plcopen.sfcObjects_simultaneousDivergence):
  1184                 elif isinstance(instance, SimultaneousDivergenceClass):
  1169                     transition = self.ExtractDivergenceInput(instance, pou)
  1185                     transition = self.ExtractDivergenceInput(instance, pou)
  1170                     if transition:
  1186                     if transition:
  1171                         if isinstance(transition, plcopen.sfcObjects_transition):
  1187                         if isinstance(transition, TransitionClass):
  1172                             instances.append(transition)
  1188                             instances.append(transition)
  1173                         elif isinstance(transition, plcopen.sfcObjects_selectionConvergence):
  1189                         elif isinstance(transition, SelectionConvergenceClass):
  1174                             instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1190                             instances.extend(self.ExtractConvergenceInputs(transition, pou))
  1175             for instance in instances:
  1191             for instance in instances:
  1176                 self.GenerateSFCTransition(instance, pou)
  1192                 self.GenerateSFCTransition(instance, pou)
  1177                 if instance in self.SFCNetworks["Transitions"].keys():
  1193                 if instance in self.SFCNetworks["Transitions"].keys():
  1178                     target_info = (self.TagName, "jump", jump.getlocalId(), "target")
  1194                     target_info = (self.TagName, "jump", jump.getlocalId(), "target")
  1228                 instanceLocalId = connections[0].getrefLocalId()
  1244                 instanceLocalId = connections[0].getrefLocalId()
  1229                 body = pou.getbody()
  1245                 body = pou.getbody()
  1230                 if isinstance(body, ListType):
  1246                 if isinstance(body, ListType):
  1231                     body = body[0]
  1247                     body = body[0]
  1232                 instance = body.getcontentInstance(instanceLocalId)
  1248                 instance = body.getcontentInstance(instanceLocalId)
  1233                 if isinstance(instance, plcopen.sfcObjects_step):
  1249                 if isinstance(instance, StepClass):
  1234                     steps.append(instance)
  1250                     steps.append(instance)
  1235                 elif isinstance(instance, plcopen.sfcObjects_selectionDivergence):
  1251                 elif isinstance(instance, SelectionDivergenceClass):
  1236                     step = self.ExtractDivergenceInput(instance, pou)
  1252                     step = self.ExtractDivergenceInput(instance, pou)
  1237                     if step:
  1253                     if step:
  1238                         if isinstance(step, plcopen.sfcObjects_step):
  1254                         if isinstance(step, StepClass):
  1239                             steps.append(step)
  1255                             steps.append(step)
  1240                         elif isinstance(step, plcopen.sfcObjects_simultaneousConvergence):
  1256                         elif isinstance(step, SimultaneousConvergenceClass):
  1241                             steps.extend(self.ExtractConvergenceInputs(step, pou))
  1257                             steps.extend(self.ExtractConvergenceInputs(step, pou))
  1242                 elif isinstance(instance, plcopen.sfcObjects_simultaneousConvergence):
  1258                 elif isinstance(instance, SimultaneousConvergenceClass):
  1243                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
  1259                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
  1244             transition_infos = {"id" : transition.getlocalId(), 
  1260             transition_infos = {"id" : transition.getlocalId(), 
  1245                                 "priority": transition.getpriority(), 
  1261                                 "priority": transition.getpriority(), 
  1246                                 "from": [], 
  1262                                 "from": [], 
  1247                                 "to" : []}
  1263                                 "to" : []}
  1257                 transitionBody = transitionContent.getbody()
  1273                 transitionBody = transitionContent.getbody()
  1258                 previous_tagname = self.TagName
  1274                 previous_tagname = self.TagName
  1259                 self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transitionValues["value"])
  1275                 self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transitionValues["value"])
  1260                 if transitionType == "IL":
  1276                 if transitionType == "IL":
  1261                     transition_infos["content"] = [(":\n", ()),
  1277                     transition_infos["content"] = [(":\n", ()),
  1262                                                    (ReIndentText(transitionBody.gettext(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
  1278                                                    (ReIndentText(transitionBody.getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
  1263                 elif transitionType == "ST":
  1279                 elif transitionType == "ST":
  1264                     transition_infos["content"] = [("\n", ()),
  1280                     transition_infos["content"] = [("\n", ()),
  1265                                                    (ReIndentText(transitionBody.gettext(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
  1281                                                    (ReIndentText(transitionBody.getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
  1266                 else:
  1282                 else:
  1267                     for instance in transitionBody.getcontentInstances():
  1283                     for instance in transitionBody.getcontentInstances():
  1268                         if isinstance(instance, plcopen.fbdObjects_outVariable) and instance.getexpression() == transitionValues["value"]\
  1284                         if isinstance(instance, OutVariableClass) and instance.getexpression().text == transitionValues["value"]\
  1269                             or isinstance(instance, plcopen.ldObjects_coil) and instance.getvariable() == transitionValues["value"]:
  1285                             or isinstance(instance, CoilClass) and instance.getvariable().text == transitionValues["value"]:
  1270                             connections = instance.connectionPointIn.getconnections()
  1286                             connections = instance.connectionPointIn.getconnections()
  1271                             if connections is not None:
  1287                             if connections is not None:
  1272                                 expression = self.ComputeExpression(transitionBody, connections)
  1288                                 expression = self.ComputeExpression(transitionBody, connections)
  1273                                 if expression is not None:
  1289                                 if expression is not None:
  1274                                     transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]
  1290                                     transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]