--- a/plcopen/plcopen.py Fri Sep 29 16:48:42 2017 +0300
+++ b/plcopen/plcopen.py Mon Oct 02 12:43:01 2017 +0300
@@ -338,8 +338,10 @@
-cls = PLCOpenParser.GetElementClass("formattedText")
+# ---------------------------------------------------------------------- +def _updateFormattedTextClass(cls): def updateElementName(self, old_name, new_name):
pattern = re.compile('\\b' + old_name + '\\b', re.IGNORECASE)
@@ -370,9 +372,16 @@
return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)]
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("project")
+cls = PLCOpenParser.GetElementClass("formattedText")
+ _updateFormattedTextClass(cls) +# ---------------------------------------------------------------------- +def _updateProjectClass(cls): self.contentHeader.setname(name)
setattr(cls, "setname", setname)
@@ -614,9 +623,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("contentHeader", "project")
+cls = PLCOpenParser.GetElementClass("project")
+ _updateProjectClass(cls) +# ---------------------------------------------------------------------- +def _updateContentHeaderProjectClass(cls): def setpageSize(self, width, height):
self.coordinateInfo.setpageSize(width, height)
setattr(cls, "setpageSize", setpageSize)
@@ -638,8 +654,16 @@
setattr(cls, "getscaling", getscaling)
-cls = PLCOpenParser.GetElementClass("coordinateInfo", "contentHeader")
+cls = PLCOpenParser.GetElementClass("contentHeader", "project") + _updateContentHeaderProjectClass(cls) +# ---------------------------------------------------------------------- +def _updateCoordinateInfoContentHeaderClass(cls): def setpageSize(self, width, height):
if width == 0 and height == 0:
@@ -679,6 +703,14 @@
setattr(cls, "getscaling", getscaling)
+cls = PLCOpenParser.GetElementClass("coordinateInfo", "contentHeader") + _updateCoordinateInfoContentHeaderClass(cls) +# ---------------------------------------------------------------------- def _Search(attributes, criteria, parent_infos):
for attr, value in attributes:
@@ -744,9 +776,10 @@
-cls = PLCOpenParser.GetElementClass("configuration", "configurations")
+# ---------------------------------------------------------------------- +def _updateConfigurationConfigurationsClass(cls): def addglobalVar(self, var_type, name, location="", description=""):
globalvars = self.getglobalVars()
@@ -789,8 +822,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("resource", "configuration")
+cls = PLCOpenParser.GetElementClass("configuration", "configurations") + _updateConfigurationConfigurationsClass(cls) +# ---------------------------------------------------------------------- +def _updateResourceConfigurationClass(cls): def updateElementName(self, old_name, new_name):
_updateConfigurationResourceElementName(self, old_name, new_name)
for instance in self.getpouInstance():
@@ -830,8 +871,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("task", "resource")
+cls = PLCOpenParser.GetElementClass("resource", "configuration") + _updateResourceConfigurationClass(cls) +# ---------------------------------------------------------------------- +def _updateTaskResourceClass(cls): def updateElementName(self, old_name, new_name):
if TextMatched(self.single, old_name):
@@ -855,8 +904,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("pouInstance")
+cls = PLCOpenParser.GetElementClass("task", "resource") + _updateTaskResourceClass(cls) +# ---------------------------------------------------------------------- +def _updatePouInstanceClass(cls): def updateElementName(self, old_name, new_name):
if TextMatched(self.typeName, old_name):
@@ -868,8 +925,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("variable", "varListPlain")
+cls = PLCOpenParser.GetElementClass("pouInstance") + _updatePouInstanceClass(cls) +# ---------------------------------------------------------------------- +def _updateVariableVarListPlain(cls): vartype_content = self.gettype().getcontent()
vartype_content_name = vartype_content.getLocalTag()
@@ -911,8 +976,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("types", "project")
+cls = PLCOpenParser.GetElementClass("variable", "varListPlain") + _updateVariableVarListPlain(cls) +# ---------------------------------------------------------------------- +def _updateTypesProjectClass(cls): def getdataTypeElements(self):
return self.dataTypes.getdataType()
setattr(cls, "getdataTypeElements", getdataTypeElements)
@@ -997,12 +1070,19 @@
setattr(cls, "Search", Search)
+cls = PLCOpenParser.GetElementClass("types", "project") + _updateTypesProjectClass(cls) +# ---------------------------------------------------------------------- def _updateBaseTypeElementName(self, old_name, new_name):
self.baseType.updateElementName(old_name, new_name)
-cls = PLCOpenParser.GetElementClass("dataType", "dataTypes")
+def _updateDataTypeDataTypesClass(cls): setattr(cls, "updateElementName", _updateBaseTypeElementName)
def Search(self, criteria, parent_infos=[]):
@@ -1017,9 +1097,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("dataType")
+cls = PLCOpenParser.GetElementClass("dataType", "dataTypes")
+ _updateDataTypeDataTypesClass(cls) +# ---------------------------------------------------------------------- +def _updateDataTypeClass(cls): def updateElementName(self, old_name, new_name):
content_name = self.content.getLocalTag()
if content_name in ["derived", "array", "subrangeSigned", "subrangeUnsigned"]:
@@ -1044,8 +1131,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("derived", "dataType")
+cls = PLCOpenParser.GetElementClass("dataType") + _updateDataTypeClass(cls) +# ---------------------------------------------------------------------- +def _updateDerivedDataTypeClass(cls): def updateElementName(self, old_name, new_name):
if TextMatched(self.name, old_name):
@@ -1055,8 +1150,16 @@
return [(tuple(parent_infos),) + result for result in TestTextElement(self.name, criteria)]
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("array", "dataType")
+cls = PLCOpenParser.GetElementClass("derived", "dataType") + _updateDerivedDataTypeClass(cls) +# ---------------------------------------------------------------------- +def _updateArrayDataTypeClass(cls): setattr(cls, "updateElementName", _updateBaseTypeElementName)
def Search(self, criteria, parent_infos=[]):
@@ -1069,6 +1172,14 @@
setattr(cls, "Search", Search)
+cls = PLCOpenParser.GetElementClass("array", "dataType") + _updateArrayDataTypeClass(cls) +# ---------------------------------------------------------------------- def _SearchInSubrange(self, criteria, parent_infos=[]):
search_result = self.baseType.Search(criteria, parent_infos)
search_result.extend(_Search([("lower", self.range.getlower()),
@@ -1082,14 +1193,20 @@
setattr(cls, "updateElementName", _updateBaseTypeElementName)
setattr(cls, "Search", _SearchInSubrange)
+# ---------------------------------------------------------------------- cls = PLCOpenParser.GetElementClass("subrangeUnsigned", "dataType")
setattr(cls, "updateElementName", _updateBaseTypeElementName)
setattr(cls, "Search", _SearchInSubrange)
-cls = PLCOpenParser.GetElementClass("enum", "dataType")
+# ---------------------------------------------------------------------- +def _updateEnumDataTypeClass(cls): def updateElementName(self, old_name, new_name):
setattr(cls, "updateElementName", updateElementName)
@@ -1105,6 +1222,14 @@
setattr(cls, "Search", Search)
+cls = PLCOpenParser.GetElementClass("enum", "dataType") + _updateEnumDataTypeClass(cls) +# ---------------------------------------------------------------------- def _getvariableTypeinfos(variable_type):
type_content = variable_type.getcontent()
type_content_type = type_content.getLocalTag()
@@ -1113,14 +1238,7 @@
return type_content_type.upper()
-cls = PLCOpenParser.GetElementClass("pou", "pous")
- block_inputs_xpath = PLCOpen_XPath(
- "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars]/ppx:variable")
- block_outputs_xpath = PLCOpen_XPath(
- "ppx:interface/*[self::ppx:outputVars or self::ppx:inOutVars]/ppx:variable")
+def _updatePouPousClass(cls): @@ -1520,6 +1638,18 @@
setattr(cls, "Search", Search)
+cls = PLCOpenParser.GetElementClass("pou", "pous") + block_inputs_xpath = PLCOpen_XPath( + "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars]/ppx:variable") + block_outputs_xpath = PLCOpen_XPath( + "ppx:interface/*[self::ppx:outputVars or self::ppx:inOutVars]/ppx:variable") + _updatePouPousClass(cls) +# ---------------------------------------------------------------------- def setbodyType(self, body_type):
if body_type in ["IL", "ST", "LD", "FBD", "SFC"]:
self.body.setcontent(PLCOpenParser.CreateElement(body_type, "body"))
@@ -1594,8 +1724,9 @@
self.body.updateElementAddress(address_model, new_leading)
-cls = PLCOpenParser.GetElementClass("transition", "transitions")
+# ---------------------------------------------------------------------- +def _updateTransitionTransitionsClass(cls): setattr(cls, "setbodyType", setbodyType)
setattr(cls, "getbodyType", getbodyType)
setattr(cls, "resetexecutionOrder", resetexecutionOrder)
@@ -1622,8 +1753,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("action", "actions")
+cls = PLCOpenParser.GetElementClass("transition", "transitions") + _updateTransitionTransitionsClass(cls) +# ---------------------------------------------------------------------- +def _updateActionActionsClass(cls): setattr(cls, "setbodyType", setbodyType)
setattr(cls, "getbodyType", getbodyType)
setattr(cls, "resetexecutionOrder", resetexecutionOrder)
@@ -1650,8 +1789,16 @@
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("body")
+cls = PLCOpenParser.GetElementClass("action", "actions") + _updateActionActionsClass(cls) +# ---------------------------------------------------------------------- +def _updateBodyClass(cls): cls.currentExecutionOrderId = 0
cls.checkedBlocksDict = {}
@@ -1835,6 +1982,14 @@
setattr(cls, "Search", Search)
+cls = PLCOpenParser.GetElementClass("body") +# ---------------------------------------------------------------------- return self.position.getx()
@@ -2001,8 +2156,10 @@
-cls = _initElementClass("comment", "commonObjects")
+# ---------------------------------------------------------------------- +def _updateCommentCommonObjectsClass(cls): def setcontentText(self, text):
self.content.setanyText(text)
setattr(cls, "setcontentText", setcontentText)
@@ -2023,8 +2180,16 @@
return self.content.Search(criteria, parent_infos + ["comment", self.getlocalId(), "content"])
setattr(cls, "Search", Search)
-cls = _initElementClass("block", "fbdObjects")
+cls = _initElementClass("comment", "commonObjects") + _updateCommentCommonObjectsClass(cls) +# ---------------------------------------------------------------------- +def _updateBlockFbdObjectsClass(cls): def getBoundingBox(self):
bbox = _getBoundingBox(self)
for input in self.inputVariables.getvariable():
@@ -2069,6 +2234,15 @@
setattr(cls, "Search", Search)
+cls = _initElementClass("block", "fbdObjects") + _updateBlockFbdObjectsClass(cls) +# ---------------------------------------------------------------------- _initElementClass("leftPowerRail", "ldObjects")
_initElementClass("rightPowerRail", "ldObjects", "multiple")
@@ -2088,26 +2262,44 @@
+# ---------------------------------------------------------------------- cls = _initElementClass("contact", "ldObjects", "single")
setattr(cls, "updateElementName", _UpdateLDElementName)
setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
setattr(cls, "Search", _getSearchInLDElement("contact"))
+# ---------------------------------------------------------------------- cls = _initElementClass("coil", "ldObjects", "single")
setattr(cls, "updateElementName", _UpdateLDElementName)
setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
setattr(cls, "Search", _getSearchInLDElement("coil"))
-cls = _initElementClass("step", "sfcObjects", "single")
+# ---------------------------------------------------------------------- +def _updateStepSfcObjectSingleClass(cls): def Search(self, criteria, parent_infos=[]):
return _Search([("name", self.getname())], criteria, parent_infos + ["step", self.getlocalId()])
setattr(cls, "Search", Search)
-cls = _initElementClass("transition", "sfcObjects")
+cls = _initElementClass("step", "sfcObjects", "single") + _updateStepSfcObjectSingleClass(cls) +# ---------------------------------------------------------------------- +def _updateTransitionSfcObjectsClass(cls): def setconditionContent(self, condition_type, value):
if self.condition is None:
@@ -2218,19 +2410,36 @@
setattr(cls, "Search", Search)
+cls = _initElementClass("transition", "sfcObjects") + _updateTransitionSfcObjectsClass(cls) +# ---------------------------------------------------------------------- _initElementClass("selectionDivergence", "sfcObjects", "single")
_initElementClass("selectionConvergence", "sfcObjects", "multiple")
_initElementClass("simultaneousDivergence", "sfcObjects", "single")
_initElementClass("simultaneousConvergence", "sfcObjects", "multiple")
-cls = _initElementClass("jumpStep", "sfcObjects", "single")
+def _updateJumpStepSfcObjectSingleClass(cls): def Search(self, criteria, parent_infos):
return _Search([("target", self.gettargetName())], criteria, parent_infos + ["jump", self.getlocalId()])
setattr(cls, "Search", Search)
-cls = PLCOpenParser.GetElementClass("action", "actionBlock")
+cls = _initElementClass("jumpStep", "sfcObjects", "single") + _updateJumpStepSfcObjectSingleClass(cls) +# ---------------------------------------------------------------------- +def _updateActionActionBlockClass(cls): def setreferenceName(self, name):
if self.reference is not None:
self.reference.setname(name)
@@ -2280,8 +2489,16 @@
setattr(cls, "Search", Search)
-cls = _initElementClass("actionBlock", "commonObjects", "single")
+cls = PLCOpenParser.GetElementClass("action", "actionBlock") + _updateActionActionBlockClass(cls) +# ---------------------------------------------------------------------- +def _updateActionBlockCommonObjectsSingleClass(cls): def setactions(self, actions):
@@ -2342,6 +2559,14 @@
setattr(cls, "Search", Search)
+cls = _initElementClass("actionBlock", "commonObjects", "single") + _updateActionBlockCommonObjectsSingleClass(cls) +# ---------------------------------------------------------------------- def _SearchInIOVariable(self, criteria, parent_infos=[]):
return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()])
@@ -2378,8 +2603,10 @@
return _Search([("name", self.getname())], criteria, parent_infos + ["connector", self.getlocalId()])
-cls = _initElementClass("continuation", "commonObjects")
+# ---------------------------------------------------------------------- +def _updateContinuationCommonObjectsClass(cls): setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):
@@ -2387,8 +2614,16 @@
setattr(cls, "updateElementName", updateElementName)
-cls = _initElementClass("connector", "commonObjects", "single")
+cls = _initElementClass("continuation", "commonObjects") + _updateContinuationCommonObjectsClass(cls) +# ---------------------------------------------------------------------- +def _updateConnectorCommonObjectsSingleClass(cls): setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):
@@ -2396,8 +2631,16 @@
setattr(cls, "updateElementName", updateElementName)
-cls = PLCOpenParser.GetElementClass("connection")
+cls = _initElementClass("connector", "commonObjects", "single") + _updateConnectorCommonObjectsSingleClass(cls) +# ---------------------------------------------------------------------- +def _updateConnectionClass(cls): def setpoints(self, points):
@@ -2415,8 +2658,16 @@
setattr(cls, "getpoints", getpoints)
-cls = PLCOpenParser.GetElementClass("connectionPointIn")
+cls = PLCOpenParser.GetElementClass("connection") + _updateConnectionClass(cls) +# ---------------------------------------------------------------------- +def _updateConnectionPointInClass(cls): def setrelPositionXY(self, x, y):
self.relPosition = PLCOpenParser.CreateElement("relPosition", "connectionPointIn")
@@ -2495,6 +2746,7 @@
setattr(cls, "getconnectionParameter", getconnectionParameter)
cls = PLCOpenParser.GetElementClass("connectionPointOut")
def setrelPositionXY(self, x, y):
@@ -2509,8 +2761,16 @@
setattr(cls, "getrelPositionXY", getrelPositionXY)
-cls = PLCOpenParser.GetElementClass("value")
+cls = PLCOpenParser.GetElementClass("connectionPointIn") + _updateConnectionPointInClass(cls) +# ---------------------------------------------------------------------- +def _updateValueClass(cls): def setvalue(self, value):
if value.startswith("[") and value.endswith("]"):
@@ -2528,6 +2788,14 @@
setattr(cls, "getvalue", getvalue)
+cls = PLCOpenParser.GetElementClass("value") +# ---------------------------------------------------------------------- def extractValues(values):
items = values.split(",")
@@ -2543,10 +2811,7 @@
-cls = PLCOpenParser.GetElementClass("arrayValue", "value")
- arrayValue_model = re.compile("([0-9]+)\((.*)\)$")
+def _updateArrayValueValueClass(cls): def setvalue(self, value):
for item in extractValues(value[1:-1]):
@@ -2580,10 +2845,16 @@
return "[%s]" % ", ".join(values)
setattr(cls, "getvalue", getvalue)
-cls = PLCOpenParser.GetElementClass("structValue", "value")
+cls = PLCOpenParser.GetElementClass("arrayValue", "value") - structValue_model = re.compile("(.*):=(.*)")
+ arrayValue_model = re.compile("([0-9]+)\((.*)\)$") + _updateArrayValueValueClass(cls) +# ---------------------------------------------------------------------- +def _updateStructValueValueClass(cls): def setvalue(self, value):
for item in extractValues(value[1:-1]):
@@ -2603,3 +2874,9 @@
values.append("%s := %s" % (element.getmember(), element.getvalue()))
return "(%s)" % ", ".join(values)
setattr(cls, "getvalue", getvalue)
+cls = PLCOpenParser.GetElementClass("structValue", "value") + structValue_model = re.compile("(.*):=(.*)") + _updateStructValueValueClass(cls)