BNA8/.resources/e1dbded488ff4ad4c0037130019075ed29b953f5692d1a6696a04874cf2be626

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"""