72 lines
2.5 KiB
Plaintext
72 lines
2.5 KiB
Plaintext
import re
|
|
import system
|
|
|
|
reSource = re.compile(r"prov\:([^:]+)\:/tag\:([^:]+)\:")
|
|
reTagPathProvider = re.compile(r"(\[[^\]]+\])?(.+)")
|
|
|
|
SUBVIEWS = {
|
|
}
|
|
|
|
def resolveScreenByTagPath(tagPath, defaultOverview="Windows/Graphics/Overview", defaultError=""):
|
|
try:
|
|
(provider, path) = reTagPathProvider.findall(tagPath)[0]
|
|
if provider == None:
|
|
provider = "[default]"
|
|
except:
|
|
return defaultError
|
|
pathParts = path.split("/")
|
|
tags = [provider+"/".join(pathParts[:i])+"/Parameters.GoToScreen" for i in range(len(pathParts), 0, -1)]
|
|
for value in system.tag.readBlocking(tags):
|
|
if value.quality.isGood():
|
|
value = value.getValue()
|
|
if value not in (None, ""):
|
|
return value
|
|
else:
|
|
return defaultError
|
|
# Couldn't find a PathToInstance parameter, default to overview:
|
|
return defaultOverview
|
|
|
|
def resolveScreenBySource(source, defaultOverview="Windows/Graphics/Overview", defaultError=""):
|
|
try:
|
|
(provider, path) = reSource.findall(source)[0]
|
|
tagPath = "["+provider+"]"+path
|
|
except:
|
|
return defaultOverview
|
|
return resolveScreenByTagPath(tagPath, defaultOverview, defaultError)
|
|
|
|
|
|
def filterAlarms(screen, alarms):
|
|
# Only filter if this isn't the overview:
|
|
if screen <> "Windows/Graphics/Overview":
|
|
# Lookup views to filter on
|
|
views = SUBVIEWS.get(screen, [screen]) + [""] # Include any device tags not set up yet for all views
|
|
badrows = [row for row in range(alarms.getRowCount()) if resolveScreenBySource(alarms.getValueAt(row, "source")) not in views]
|
|
# Return filtered rows:
|
|
return system.dataset.deleteRows(alarms, badrows)
|
|
else:
|
|
return alarms
|
|
|
|
"""
|
|
reMCP = re.compile(r"\[([^\]]+)\]")
|
|
|
|
def resolveScreen(location, plctag):
|
|
conveyor = location.split(".")[0]
|
|
conveyor_parts = conveyor.split("-")
|
|
conveyor_num = int(conveyor_parts[1].strip(string.ascii_letters)) if len(conveyor_parts) > 1 and conveyor_parts[1].isalnum() and not conveyor_parts[1].isalpha() else 0
|
|
area = conveyor_parts[0]
|
|
area_num = int(area.strip(string.ascii_letters)) if area.isalnum() and not area.isalpha() else 0
|
|
mcp = reMCP.findall(plctag)[0]
|
|
|
|
return "Windows/Graphics/Overview"
|
|
|
|
def filterAlarms(screen, alarms):
|
|
# Lookup views to filter on
|
|
views = SUBVIEWS.get(screen, [])
|
|
# Only filter if there are views we found:
|
|
if len(views) > 0:
|
|
badrows = [row for row in range(alarms.getRowCount()) if resolveScreen(alarms.getValueAt(row, "device"), alarms.getValueAt(row, "plctag")) not in views]
|
|
# Return filtered rows:
|
|
return system.dataset.deleteRows(alarms, badrows)
|
|
else:
|
|
return alarms"""
|