plcopen/plcopen.py
changeset 389 6a72016d721a
parent 387 fcae4e40f296
child 391 07447ee3538e
equal deleted inserted replaced
388:7ea1f5094df3 389:6a72016d721a
    87         if self.y_min is not None and self.y_max is not None:
    87         if self.y_min is not None and self.y_max is not None:
    88             height = self.y_max - self.y_min
    88             height = self.y_max - self.y_min
    89         return self.x_min, self.y_min, width, height
    89         return self.x_min, self.y_min, width, height
    90             
    90             
    91 
    91 
    92 PLCOpenClasses = GenerateClassesFromXSD(os.path.join(os.path.split(__file__)[0], "TC6_XML_V10_B.xsd"))
    92 PLCOpenClasses = GenerateClassesFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
    93 
    93 
    94 ElementNameToClass = {}
    94 ElementNameToClass = {}
    95 
    95 
    96 cls = PLCOpenClasses.get("formattedText", None)
    96 cls = PLCOpenClasses.get("formattedText", None)
    97 if cls:
    97 if cls:
   701             task.updateElementName(old_name, new_name)
   701             task.updateElementName(old_name, new_name)
   702     setattr(cls, "updateElementName", updateElementName)
   702     setattr(cls, "updateElementName", updateElementName)
   703 
   703 
   704 cls = PLCOpenClasses.get("resource_task", None)
   704 cls = PLCOpenClasses.get("resource_task", None)
   705 if cls:
   705 if cls:
       
   706     def compatibility(self, tree):
       
   707         if tree.hasAttribute("interval"):
       
   708             interval = GetAttributeValue(tree._attrs["interval"])
       
   709             result = time_model.match(interval)
       
   710             if result is not None:
       
   711                 values = result.groups()
       
   712                 time_values = [int(v) for v in values[:2]]
       
   713                 seconds = float(values[2])
       
   714                 time_values.extend([int(seconds), int((seconds % 1) * 1000000)])
       
   715                 text = "t#"
       
   716                 if time_values[0] != 0:
       
   717                     text += "%dh"%time_values[0]
       
   718                 if time_values[1] != 0:
       
   719                     text += "%dm"%time_values[1]
       
   720                 if time_values[2] != 0:
       
   721                     text += "%ds"%time_values[2]
       
   722                 if time_values[3] != 0:
       
   723                     if time_values[3] % 1000 != 0:
       
   724                         text += "%.3fms"%(float(time_values[3]) / 1000)
       
   725                     else:
       
   726                         text += "%dms"%(time_values[3] / 1000)
       
   727                 NodeSetAttr(tree, "interval", text)
       
   728     setattr(cls, "compatibility", compatibility)
       
   729     
   706     def updateElementName(self, old_name, new_name):
   730     def updateElementName(self, old_name, new_name):
   707         if self.single == old_name:
   731         if self.single == old_name:
   708             self.single = new_name
   732             self.single = new_name
   709         for instance in self.getpouInstance():
   733         for instance in self.getpouInstance():
   710             instance.updateElementName(old_name, new_name)
   734             instance.updateElementName(old_name, new_name)
   711     setattr(cls, "updateElementName", updateElementName)
   735     setattr(cls, "updateElementName", updateElementName)
   712 
   736 
   713 cls = PLCOpenClasses.get("pouInstance", None)
   737 cls = PLCOpenClasses.get("pouInstance", None)
   714 if cls:
   738 if cls:
       
   739     def compatibility(self, tree):
       
   740         if tree.hasAttribute("type"):
       
   741             NodeRenameAttr(tree, "type", "typeName")
       
   742     setattr(cls, "compatibility", compatibility)
       
   743     
   715     def updateElementName(self, old_name, new_name):
   744     def updateElementName(self, old_name, new_name):
   716         if self.type == old_name:
   745         if self.type == old_name:
   717             self.type = new_name
   746             self.type = new_name
   718     setattr(cls, "updateElementName", updateElementName)
   747     setattr(cls, "updateElementName", updateElementName)
   719 
   748 
   770             if element.getname() == name:
   799             if element.getname() == name:
   771                 raise ValueError, "\"%s\" POU already exists !!!"%name
   800                 raise ValueError, "\"%s\" POU already exists !!!"%name
   772         new_pou = PLCOpenClasses["pous_pou"]()
   801         new_pou = PLCOpenClasses["pous_pou"]()
   773         new_pou.setname(name)
   802         new_pou.setname(name)
   774         new_pou.setpouType(pou_type)
   803         new_pou.setpouType(pou_type)
   775         new_pou.setbody(PLCOpenClasses["body"]())
   804         new_pou.appendbody(PLCOpenClasses["body"]())
   776         new_pou.setbodyType(body_type)
   805         new_pou.setbodyType(body_type)
   777         self.pous.appendpou(new_pou)
   806         self.pous.appendpou(new_pou)
   778     setattr(cls, "appendpouElement", appendpouElement)
   807     setattr(cls, "appendpouElement", appendpouElement)
   779         
   808         
   780     def insertpouElement(self, index, pou):
   809     def insertpouElement(self, index, pou):
   790                 break
   819                 break
   791         if not found:
   820         if not found:
   792             raise ValueError, "\"%s\" POU doesn't exist !!!"%name
   821             raise ValueError, "\"%s\" POU doesn't exist !!!"%name
   793     setattr(cls, "removepouElement", removepouElement)
   822     setattr(cls, "removepouElement", removepouElement)
   794 
   823 
   795 def setbodyType(self, type):
       
   796     if type == "IL":
       
   797         self.body.setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()})
       
   798     elif type == "ST":
       
   799         self.body.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()})
       
   800     elif type == "LD":
       
   801         self.body.setcontent({"name" : "LD", "value" : PLCOpenClasses["body_LD"]()})
       
   802     elif type == "FBD":
       
   803         self.body.setcontent({"name" : "FBD", "value" : PLCOpenClasses["body_FBD"]()})
       
   804     elif type == "SFC":
       
   805         self.body.setcontent({"name" : "SFC", "value" : PLCOpenClasses["body_SFC"]()})
       
   806     else:
       
   807         raise ValueError, "%s isn't a valid body type!"%type
       
   808         
       
   809 def getbodyType(self):
       
   810     return self.body.getcontent()["name"]
       
   811 
       
   812 def resetexecutionOrder(self):
       
   813     self.body.resetexecutionOrder()
       
   814 
       
   815 def compileexecutionOrder(self):
       
   816     self.body.compileexecutionOrder()
       
   817 
       
   818 def setelementExecutionOrder(self, instance, new_executionOrder):
       
   819     self.body.setelementExecutionOrder(instance, new_executionOrder)
       
   820 
       
   821 def addinstance(self, name, instance):
       
   822     self.body.appendcontentInstance(name, instance)
       
   823 
       
   824 def getinstances(self):
       
   825     return self.body.getcontentInstances()
       
   826 
       
   827 def getinstance(self, id):
       
   828     return self.body.getcontentInstance(id)
       
   829 
       
   830 def getrandomInstance(self, exclude):
       
   831     return self.body.getcontentRandomInstance(exclude)
       
   832 
       
   833 def getinstanceByName(self, name):
       
   834     return self.body.getcontentInstanceByName(name)
       
   835 
       
   836 def removeinstance(self, id):
       
   837     self.body.removecontentInstance(id)
       
   838 
       
   839 def settext(self, text):
       
   840     self.body.settext(text)
       
   841 
       
   842 def gettext(self):
       
   843     return self.body.gettext()
       
   844 setattr(cls, "gettext", gettext)
       
   845 
       
   846 cls = PLCOpenClasses.get("pous_pou", None)
   824 cls = PLCOpenClasses.get("pous_pou", None)
   847 if cls:
   825 if cls:
       
   826     
       
   827     def setbodyType(self, type):
       
   828         if len(self.body) > 0:
       
   829             if type == "IL":
       
   830                 self.body[0].setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()})
       
   831             elif type == "ST":
       
   832                 self.body[0].setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()})
       
   833             elif type == "LD":
       
   834                 self.body[0].setcontent({"name" : "LD", "value" : PLCOpenClasses["body_LD"]()})
       
   835             elif type == "FBD":
       
   836                 self.body[0].setcontent({"name" : "FBD", "value" : PLCOpenClasses["body_FBD"]()})
       
   837             elif type == "SFC":
       
   838                 self.body[0].setcontent({"name" : "SFC", "value" : PLCOpenClasses["body_SFC"]()})
       
   839             else:
       
   840                 raise ValueError, "%s isn't a valid body type!"%type
   848     setattr(cls, "setbodyType", setbodyType)
   841     setattr(cls, "setbodyType", setbodyType)
       
   842     
       
   843     def getbodyType(self):
       
   844         if len(self.body) > 0:
       
   845             return self.body[0].getcontent()["name"]
   849     setattr(cls, "getbodyType", getbodyType)
   846     setattr(cls, "getbodyType", getbodyType)
       
   847     
       
   848     def resetexecutionOrder(self):
       
   849         if len(self.body) > 0:
       
   850             self.body[0].resetexecutionOrder()
   850     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
   851     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
       
   852     
       
   853     def compileexecutionOrder(self):
       
   854         if len(self.body) > 0:
       
   855             self.body[0].compileexecutionOrder()
   851     setattr(cls, "compileexecutionOrder", compileexecutionOrder)
   856     setattr(cls, "compileexecutionOrder", compileexecutionOrder)
       
   857     
       
   858     def setelementExecutionOrder(self, instance, new_executionOrder):
       
   859         if len(self.body) > 0:
       
   860             self.body[0].setelementExecutionOrder(instance, new_executionOrder)
   852     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
   861     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
       
   862     
       
   863     def addinstance(self, name, instance):
       
   864         if len(self.body) > 0:
       
   865             self.body[0].appendcontentInstance(name, instance)
   853     setattr(cls, "addinstance", addinstance)
   866     setattr(cls, "addinstance", addinstance)
       
   867     
       
   868     def getinstances(self):
       
   869         if len(self.body) > 0:
       
   870             return self.body[0].getcontentInstances()
       
   871         return []
   854     setattr(cls, "getinstances", getinstances)
   872     setattr(cls, "getinstances", getinstances)
       
   873     
       
   874     def getinstance(self, id):
       
   875         if len(self.body) > 0:
       
   876             return self.body[0].getcontentInstance(id)
       
   877         return None
   855     setattr(cls, "getinstance", getinstance)
   878     setattr(cls, "getinstance", getinstance)
       
   879     
       
   880     def getrandomInstance(self, exclude):
       
   881         if len(self.body) > 0:
       
   882             return self.body[0].getcontentRandomInstance(exclude)
       
   883         return None
   856     setattr(cls, "getrandomInstance", getrandomInstance)
   884     setattr(cls, "getrandomInstance", getrandomInstance)
       
   885     
       
   886     def getinstanceByName(self, name):
       
   887         if len(self.body) > 0:
       
   888             return self.body[0].getcontentInstanceByName(name)
       
   889         return None
   857     setattr(cls, "getinstanceByName", getinstanceByName)
   890     setattr(cls, "getinstanceByName", getinstanceByName)
       
   891     
       
   892     def removeinstance(self, id):
       
   893         if len(self.body) > 0:
       
   894             self.body[0].removecontentInstance(id)
   858     setattr(cls, "removeinstance", removeinstance)
   895     setattr(cls, "removeinstance", removeinstance)
       
   896     
       
   897     def settext(self, text):
       
   898         if len(self.body) > 0:
       
   899             self.body[0].settext(text)
   859     setattr(cls, "settext", settext)
   900     setattr(cls, "settext", settext)
       
   901     
       
   902     def gettext(self):
       
   903         if len(self.body) > 0:
       
   904             return self.body[0].gettext()
       
   905         return ""
   860     setattr(cls, "gettext", gettext)
   906     setattr(cls, "gettext", gettext)
   861 
   907 
   862     def getvars(self):
   908     def getvars(self):
   863         vars = []
   909         vars = []
   864         if self.interface is not None:
   910         if self.interface is not None:
  1040             action.updateElementName(old_name, new_name)
  1086             action.updateElementName(old_name, new_name)
  1041         for transition in self.gettransitionList():
  1087         for transition in self.gettransitionList():
  1042             transition.updateElementName(old_name, new_name)
  1088             transition.updateElementName(old_name, new_name)
  1043     setattr(cls, "updateElementName", updateElementName)
  1089     setattr(cls, "updateElementName", updateElementName)
  1044 
  1090 
       
  1091 def setbodyType(self, type):
       
  1092     if type == "IL":
       
  1093         self.body.setcontent({"name" : "IL", "value" : PLCOpenClasses["formattedText"]()})
       
  1094     elif type == "ST":
       
  1095         self.body.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()})
       
  1096     elif type == "LD":
       
  1097         self.body.setcontent({"name" : "LD", "value" : PLCOpenClasses["body_LD"]()})
       
  1098     elif type == "FBD":
       
  1099         self.body.setcontent({"name" : "FBD", "value" : PLCOpenClasses["body_FBD"]()})
       
  1100     elif type == "SFC":
       
  1101         self.body.setcontent({"name" : "SFC", "value" : PLCOpenClasses["body_SFC"]()})
       
  1102     else:
       
  1103         raise ValueError, "%s isn't a valid body type!"%type
       
  1104 
       
  1105 def getbodyType(self):
       
  1106     return self.body.getcontent()["name"]
       
  1107 
       
  1108 def resetexecutionOrder(self):
       
  1109     self.body.resetexecutionOrder()
       
  1110 
       
  1111 def compileexecutionOrder(self):
       
  1112     self.body.compileexecutionOrder()
       
  1113 
       
  1114 def setelementExecutionOrder(self, instance, new_executionOrder):
       
  1115     self.body.setelementExecutionOrder(instance, new_executionOrder)
       
  1116 
       
  1117 def addinstance(self, name, instance):
       
  1118     self.body.appendcontentInstance(name, instance)
       
  1119 
       
  1120 def getinstances(self):
       
  1121     return self.body.getcontentInstances()
       
  1122 
       
  1123 def getinstance(self, id):
       
  1124     return self.body.getcontentInstance(id)
       
  1125 
       
  1126 def getrandomInstance(self, exclude):
       
  1127     return self.body.getcontentRandomInstance(exclude)
       
  1128 
       
  1129 def getinstanceByName(self, name):
       
  1130     return self.body.getcontentInstanceByName(name)
       
  1131 
       
  1132 def removeinstance(self, id):
       
  1133     self.body.removecontentInstance(id)
       
  1134 
       
  1135 def settext(self, text):
       
  1136     self.body.settext(text)
       
  1137 
       
  1138 def gettext(self):
       
  1139     return self.body.gettext()
       
  1140 
  1045 cls = PLCOpenClasses.get("transitions_transition", None)
  1141 cls = PLCOpenClasses.get("transitions_transition", None)
  1046 if cls:
  1142 if cls:
  1047     setattr(cls, "setbodyType", setbodyType)
  1143     setattr(cls, "setbodyType", setbodyType)
  1048     setattr(cls, "getbodyType", getbodyType)
  1144     setattr(cls, "getbodyType", getbodyType)
  1049     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
  1145     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
  1633         if self.connectionPointOutAction:
  1729         if self.connectionPointOutAction:
  1634             specific_values["action"] = _getconnectioninfos(self, self.connectionPointOutAction)
  1730             specific_values["action"] = _getconnectioninfos(self, self.connectionPointOutAction)
  1635         return infos
  1731         return infos
  1636     setattr(cls, "getinfos", getinfos)
  1732     setattr(cls, "getinfos", getinfos)
  1637 
  1733 
       
  1734 cls = PLCOpenClasses.get("transition_condition", None)
       
  1735 if cls:
       
  1736     def compatibility(self, tree):
       
  1737         connections = []
       
  1738         for child in tree.childNodes:
       
  1739             if child.nodeName == "connection":
       
  1740                 connections.append(child)
       
  1741         if len(connections) > 0:
       
  1742             node = CreateNode("connectionPointIn")
       
  1743             relPosition = CreateNode("relPosition")
       
  1744             NodeSetAttr(relPosition, "x", "0")
       
  1745             NodeSetAttr(relPosition, "y", "0")
       
  1746             node.childNodes.append(relPosition)
       
  1747             node.childNodes.extend(connections)
       
  1748             tree.childNodes = [node]
       
  1749     setattr(cls, "compatibility", compatibility)
       
  1750 
  1638 cls = _initElementClass("transition", "sfcObjects_transition", "single")
  1751 cls = _initElementClass("transition", "sfcObjects_transition", "single")
  1639 if cls:
  1752 if cls:
  1640     def getinfos(self):
  1753     def getinfos(self):
  1641         infos = _getelementinfos(self)
  1754         infos = _getelementinfos(self)
  1642         infos["type"] = "transition"
  1755         infos["type"] = "transition"
  1646             priority = 0
  1759             priority = 0
  1647         specific_values["priority"] = priority
  1760         specific_values["priority"] = priority
  1648         condition = self.getconditionContent()
  1761         condition = self.getconditionContent()
  1649         specific_values["condition_type"] = condition["type"]
  1762         specific_values["condition_type"] = condition["type"]
  1650         if specific_values["condition_type"] == "connection":
  1763         if specific_values["condition_type"] == "connection":
  1651             
  1764             specific_values["connection"] = _getconnectioninfos(self, condition["value"], True)
  1652             specific_values["connection"] = _getconnectioninfos(self, self, True)
       
  1653         else:
  1765         else:
  1654             specific_values["condition"] = condition["value"]
  1766             specific_values["condition"] = condition["value"]
  1655         infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
  1767         infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
  1656         infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
  1768         infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
  1657         return infos
  1769         return infos
  1666         elif type == "inline":
  1778         elif type == "inline":
  1667             condition = PLCOpenClasses["condition_inline"]()
  1779             condition = PLCOpenClasses["condition_inline"]()
  1668             condition.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()})
  1780             condition.setcontent({"name" : "ST", "value" : PLCOpenClasses["formattedText"]()})
  1669             condition.settext(value)
  1781             condition.settext(value)
  1670         elif type == "connection":
  1782         elif type == "connection":
  1671             condition = [PLCOpenClasses["connection"]()]
  1783             type = "connectionPointIn"
       
  1784             condition = PLCOpenClasses["connectionPointIn"]()
  1672         self.condition.setcontent({"name" : type, "value" : condition})
  1785         self.condition.setcontent({"name" : type, "value" : condition})
  1673     setattr(cls, "setconditionContent", setconditionContent)
  1786     setattr(cls, "setconditionContent", setconditionContent)
  1674         
  1787         
  1675     def getconditionContent(self):
  1788     def getconditionContent(self):
  1676         if self.condition:
  1789         if self.condition:
  1678             values = {"type" : content["name"]}
  1791             values = {"type" : content["name"]}
  1679             if values["type"] == "reference":
  1792             if values["type"] == "reference":
  1680                 values["value"] = content["value"].getname()
  1793                 values["value"] = content["value"].getname()
  1681             elif values["type"] == "inline":
  1794             elif values["type"] == "inline":
  1682                 values["value"] = content["value"].gettext()
  1795                 values["value"] = content["value"].gettext()
       
  1796             elif values["type"] == "connectionPointIn":
       
  1797                 values["type"] = "connection"
       
  1798                 values["value"] = content["value"]
  1683             return values
  1799             return values
  1684         return ""
  1800         return ""
  1685     setattr(cls, "getconditionContent", getconditionContent)
  1801     setattr(cls, "getconditionContent", getconditionContent)
  1686 
  1802 
  1687     def updateElementName(self, old_name, new_name):
  1803     def updateElementName(self, old_name, new_name):
  1692                     content["value"].setname(new_name)
  1808                     content["value"].setname(new_name)
  1693             elif content["name"] == "inline":
  1809             elif content["name"] == "inline":
  1694                 content["value"].updateElementName(old_name, new_name)
  1810                 content["value"].updateElementName(old_name, new_name)
  1695     setattr(cls, "updateElementName", updateElementName)
  1811     setattr(cls, "updateElementName", updateElementName)
  1696 
  1812 
  1697     def setrelPositionXY(self, x, y):
       
  1698         pass
       
  1699     setattr(cls, "setrelPositionXY", setrelPositionXY)
       
  1700 
       
  1701     def getrelPositionXY(self):
       
  1702         return None
       
  1703     setattr(cls, "getrelPositionXY", getrelPositionXY)
       
  1704 
       
  1705     def addconnection(self):
       
  1706         if self.condition:
       
  1707             content = self.condition.getcontent()
       
  1708             if content["name"] != "connection":
       
  1709                 self.condition.setcontent({"name" : "connection", "value" : [PLCOpenClasses["connection"]()]})
       
  1710                 content = self.condition.getcontent()
       
  1711             else:
       
  1712                 content["value"].append(PLCOpenClasses["connection"]())
       
  1713     setattr(cls, "addconnection", addconnection)
       
  1714     
       
  1715     def removeconnection(self, idx):
       
  1716         if self.condition:
       
  1717             content = self.condition.getcontent()
       
  1718             if content["name"] == "connection":
       
  1719                 content["value"].pop(idx)
       
  1720         setattr(cls, "removeconnection", removeconnection)
       
  1721 
       
  1722     def removeconnections(self):
       
  1723         if self.condition:
       
  1724             content = self.condition.getcontent()
       
  1725             if content["name"] == "connection":
       
  1726                 content["value"] = [PLCOpenClasses["connection"]()]
       
  1727     setattr(cls, "removeconnections", removeconnections)
       
  1728     
       
  1729     def getconnections(self):
  1813     def getconnections(self):
  1730         if self.condition:
  1814         if self.condition:
  1731             content = self.condition.getcontent()
  1815             content = self.condition.getcontent()
  1732             if content["name"] == "connection":
  1816             if content["name"] == "connectionPointIn":
  1733                 return content["value"]
  1817                 return content["value"].getconnections()
  1734     setattr(cls, "getconnections", getconnections)
  1818     setattr(cls, "getconnections", getconnections)
  1735 
       
  1736     def setconnectionId(self, idx, id):
       
  1737         if self.condition:
       
  1738             content = self.condition.getcontent()
       
  1739             if content["name"] == "connection":
       
  1740                 content["value"][idx].setrefLocalId(id)
       
  1741     setattr(cls, "setconnectionId", setconnectionId)
       
  1742     
       
  1743     def getconnectionId(self, idx):
       
  1744         if self.condition:
       
  1745             content = self.condition.getcontent()
       
  1746             if content["name"] == "connection":
       
  1747                 return content["value"][idx].getrefLocalId()
       
  1748         return None
       
  1749     setattr(cls, "getconnectionId", getconnectionId)
       
  1750     
       
  1751     def setconnectionPoints(self, idx, points):
       
  1752         if self.condition:
       
  1753             content = self.condition.getcontent()
       
  1754             if content["name"] == "connection":
       
  1755                 content["value"][idx].setpoints(points)
       
  1756     setattr(cls, "setconnectionPoints", setconnectionPoints)
       
  1757 
       
  1758     def getconnectionPoints(self, idx):
       
  1759         if self.condition:
       
  1760             content = self.condition.getcontent()
       
  1761             if content["name"] == "connection":
       
  1762                 return content["value"][idx].getpoints()
       
  1763         return None
       
  1764     setattr(cls, "getconnectionPoints", getconnectionPoints)
       
  1765 
       
  1766     def setconnectionParameter(self, idx, parameter):
       
  1767         if self.condition:
       
  1768             content = self.condition.getcontent()
       
  1769             if content["name"] == "connection":
       
  1770                 content["value"][idx].setformalParameter(parameter)
       
  1771     setattr(cls, "setconnectionParameter", setconnectionParameter)
       
  1772     
       
  1773     def getconnectionParameter(self, idx):
       
  1774         if self.condition:
       
  1775             content = self.condition.getcontent()
       
  1776             if content["name"] == "connection":
       
  1777                 content["value"][idx].getformalParameter()
       
  1778         return None
       
  1779     setattr(cls, "getconnectionParameter", getconnectionParameter)
       
  1780     
  1819     
  1781 cls = _initElementClass("selectionDivergence", "sfcObjects_selectionDivergence", "single")
  1820 cls = _initElementClass("selectionDivergence", "sfcObjects_selectionDivergence", "single")
  1782 if cls:
  1821 if cls:
  1783     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
  1822     setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
  1784 
  1823 
  1804         return infos
  1843         return infos
  1805     setattr(cls, "getinfos", getinfos)
  1844     setattr(cls, "getinfos", getinfos)
  1806 
  1845 
  1807 cls = PLCOpenClasses.get("actionBlock_action", None)
  1846 cls = PLCOpenClasses.get("actionBlock_action", None)
  1808 if cls:
  1847 if cls:
       
  1848     def compatibility(self, tree):
       
  1849         relPosition = reduce(lambda x, y: x | (y.nodeName == "relPosition"), tree.childNodes, False)
       
  1850         if not tree.hasAttribute("localId"):
       
  1851             NodeSetAttr(tree, "localId", "0")
       
  1852         if not relPosition:
       
  1853             node = CreateNode("relPosition")
       
  1854             NodeSetAttr(node, "x", "0")
       
  1855             NodeSetAttr(node, "y", "0")
       
  1856             tree.childNodes.insert(0, node)
       
  1857     setattr(cls, "compatibility", compatibility)
       
  1858     
  1809     def setreferenceName(self, name):
  1859     def setreferenceName(self, name):
  1810         if self.reference:
  1860         if self.reference:
  1811             self.reference.setname(name)
  1861             self.reference.setname(name)
  1812     setattr(cls, "setreferenceName", setreferenceName)
  1862     setattr(cls, "setreferenceName", setreferenceName)
  1813     
  1863     
  2080             item = item.strip()
  2130             item = item.strip()
  2081             element = PLCOpenClasses["arrayValue_value"]()
  2131             element = PLCOpenClasses["arrayValue_value"]()
  2082             result = arrayValue_model.match(item)
  2132             result = arrayValue_model.match(item)
  2083             if result is not None:
  2133             if result is not None:
  2084                 groups = result.groups()
  2134                 groups = result.groups()
  2085                 element.setrepetitionValue(int(groups[0]))
  2135                 element.setrepetitionValue(groups[0])
  2086                 element.setvalue(groups[1].strip())
  2136                 element.setvalue(groups[1].strip())
  2087             else:
  2137             else:
  2088                 element.setvalue(item)
  2138                 element.setvalue(item)
  2089             self.value.append(element)
  2139             self.value.append(element)
  2090     setattr(cls, "setvalue", setvalue)
  2140     setattr(cls, "setvalue", setvalue)
  2092     def getvalue(self):
  2142     def getvalue(self):
  2093         values = []
  2143         values = []
  2094         for element in self.value:
  2144         for element in self.value:
  2095             repetition = element.getrepetitionValue()
  2145             repetition = element.getrepetitionValue()
  2096             if repetition is not None and repetition > 1:
  2146             if repetition is not None and repetition > 1:
  2097                 values.append("%d(%s)"%(repetition, element.getvalue()))
  2147                 values.append("%s(%s)"%(repetition, element.getvalue()))
  2098             else:
  2148             else:
  2099                 values.append(element.getvalue())
  2149                 values.append(element.getvalue())
  2100         return "[%s]"%", ".join(values)
  2150         return "[%s]"%", ".join(values)
  2101     setattr(cls, "getvalue", getvalue)
  2151     setattr(cls, "getvalue", getvalue)
  2102 
  2152