This commit is contained in:
gobbo_a
2024-05-14 14:52:28 +02:00
commit 89d8f2cb11
21 changed files with 769 additions and 0 deletions

59
config/config.properties Normal file
View File

@@ -0,0 +1,59 @@
#Tue May 14 14:52:10 CEST 2024
autoSaveScanData=true
simulation=false
xscanCrlogicChannel=
dataScanSaveOutput=false
userAuthenticator=
dataScanSaveScript=false
notifiedTasks=
parallelInitialization=false
fdaSerialization=false
dataTransferPath=
xscanAppendSuffix=true
saveConsoleSessionFiles=false
hostName=
disableEmbeddedAttributes=true
serverPort=8080
versionTrackingEnabled=true
dataPath={data}/{date}/{name}
serverEnabled=true
depthDimension=0
logLevel=Info
dataLayout=table
disableDataFileLogs=true
sessionHandling=Off
terminalEnabled=false
notificationLevel=Off
terminalPort=3579
dataTransferUser=
xscanContinuousUpdate=false
versionTrackingLogin=
noBytecodeFiles=false
versionTrackingRemote=
dataScanLazyTableCreation=false
pythonHome=
xscanMoveTimeout=600
logDaysToLive=7
xscanCrlogicSimulated=false
logLevelConsole=Off
filePermissionsConfig=Default
scanStreamerPort=-1
dataScanSaveSetpoints=false
versionTrackingManual=false
dataTransferMode=Off
userManagement=false
instanceName=MiniArchiver
dataServerPort=-1
hideServerMessages=false
dataScanReleaseRecords=true
dataScanPreserveTypes=true
dataScanFlushRecords=true
filePermissionsLogs=Default
logPath={logs}/{date}_{time}
filePermissionsScripts=Default
xscanCrlogicPrefix=
filePermissionsData=Default
xscanCrlogicAbortable=true
dataProvider=txt
xscanCrlogicIoc=
saveCommandStatistics=false

12
config/jcae.properties Normal file
View File

@@ -0,0 +1,12 @@
#Fri May 10 14:18:40 CEST 2024
ch.psi.jcae.ContextFactory.addressList=
ch.psi.jcae.ContextFactory.serverPort=
ch.psi.jcae.ContextFactory.maxArrayBytes=
ch.psi.jcae.ContextFactory.maxSendArrayBytes=
ch.psi.jcae.ChannelFactory.retries=1
ch.psi.jcae.ChannelFactory.timeout=1000
ch.psi.jcae.impl.DefaultChannelService.retries=
ch.psi.jcae.impl.DefaultChannelService.timeout=
ch.psi.jcae.ContextFactory.autoAddressList=false
ch.psi.jcae.ContextFactory.useShellVariables=true
ch.psi.jcae.ContextFactory.addLocalBroadcastInterfaces=false

9
config/mail.properties Normal file
View File

@@ -0,0 +1,9 @@
#Fri May 10 13:44:32 CEST 2024
port=0
usr=
auth=None
smsSuffix=@sms.switch.ch
host=
from=
to=
pwd=

134
config/preferences.json Normal file
View File

@@ -0,0 +1,134 @@
{
"fontShellPanel" : {
"name" : "Monospaced",
"style" : 0,
"size" : 13
},
"fontShellCommand" : {
"name" : "SansSerif",
"style" : 0,
"size" : 13
},
"fontOutput" : {
"name" : "Monospaced",
"style" : 0,
"size" : 13
},
"fontEditor" : {
"name" : "Monospaced",
"style" : 0,
"size" : 13
},
"fontPlotLabel" : {
"name" : "SansSerif",
"style" : 0,
"size" : 11
},
"fontPlotTick" : {
"name" : "SansSerif",
"style" : 0,
"size" : 10
},
"fontPlotTitle" : {
"name" : "SansSerif",
"style" : 1,
"size" : 13
},
"fontTerminal" : {
"name" : "Monospaced",
"style" : 0,
"size" : 14
},
"tabSize" : 4,
"contentWidth" : 0,
"editorBackground" : null,
"editorForeground" : null,
"simpleEditor" : false,
"hideEditorLineNumbers" : false,
"hideEditorContextMenu" : false,
"consoleLocation" : "Left",
"dataPanelLocation" : "Status",
"openDataFilesInDocTab" : false,
"noVariableEvaluationPropagation" : false,
"processingScripts" : [ ],
"asyncViewersUpdate" : false,
"asyncHistoryPlotsUpdate" : false,
"scanPlotDisabled" : false,
"scanTableDisabled" : false,
"cachedDataPanel" : false,
"dataExtensions" : null,
"dataSubFiles" : null,
"hideFileName" : false,
"showEmergencyStop" : false,
"showHomingButtons" : false,
"showJogButtons" : false,
"hideScanPanel" : false,
"hideOutputPanel" : false,
"showXScanFileBrowser" : false,
"showQueueBrowser" : false,
"backgroundRendering" : false,
"showImageStatusBar" : true,
"persistRendererWindows" : false,
"defaultRendererColormap" : "Grayscale",
"linePlot" : "ch.psi.pshell.plot.LinePlotJFree",
"matrixPlot" : "ch.psi.pshell.plot.MatrixPlotJFree",
"surfacePlot" : null,
"timePlot" : "ch.psi.pshell.plot.TimePlotJFree",
"plotsDetached" : false,
"plotsHidden" : false,
"plotLayout" : "Vertical",
"quality" : "High",
"defaultPlotColormap" : "Temperature",
"markerSize" : 0,
"plotBackground" : null,
"gridColor" : null,
"outlineColor" : null,
"disableOffscreenBuffer" : false,
"defaultPanels" : [ {
"deviceClassName" : "ch.psi.pshell.epics.Scaler",
"panelClassName" : "ch.psi.pshell.swing.ScalerPanel"
}, {
"deviceClassName" : "ch.psi.pshell.epics.Scienta",
"panelClassName" : "ch.psi.pshell.swing.ScientaPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.Motor",
"panelClassName" : "ch.psi.pshell.swing.MotorPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.MasterPositioner",
"panelClassName" : "ch.psi.pshell.swing.MasterPositionerPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.ProcessVariable",
"panelClassName" : "ch.psi.pshell.swing.ProcessVariablePanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.MotorGroup",
"panelClassName" : "ch.psi.pshell.swing.MotorGroupPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.DiscretePositioner",
"panelClassName" : "ch.psi.pshell.swing.DiscretePositionerPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.Camera",
"panelClassName" : "ch.psi.pshell.swing.CameraPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.Slit",
"panelClassName" : "ch.psi.pshell.swing.SlitPanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.HistogramGenerator",
"panelClassName" : "ch.psi.pshell.swing.HistogramGeneratorPanel"
}, {
"deviceClassName" : "ch.psi.pshell.bs.Stream",
"panelClassName" : "ch.psi.pshell.swing.StreamPanel"
}, {
"deviceClassName" : "ch.psi.pshell.bs.StreamChannel",
"panelClassName" : "ch.psi.pshell.swing.StreamChannelPanel"
}, {
"deviceClassName" : "ch.psi.pshell.camserver.CamServerStream",
"panelClassName" : "ch.psi.pshell.swing.CamServerStreamPanel"
}, {
"deviceClassName" : "ch.psi.pshell.camserver.CamServerService",
"panelClassName" : "ch.psi.pshell.swing.CamServerServicePanel"
}, {
"deviceClassName" : "ch.psi.pshell.device.ReadonlyRegister",
"panelClassName" : "ch.psi.pshell.swing.DeviceValueChart"
} ],
"scriptPopupDialog" : "None"
}

25
config/setup.properties Normal file
View File

@@ -0,0 +1,25 @@
#Fri May 10 13:44:32 CEST 2024
scriptPath={home}/script
sessionsPath={outp}/sessions
configFileDevices={config}/devices.properties
xscanPath={script}
queuePath={script}
extensionsPath={home}/extensions
configPath={home}/config
configFileSessions={config}/sessions.properties
userSessionsPath={sessions}/user
dataPath={outp}/data
configFileVariables={config}/variables.properties
wwwPath={home}/www
logPath={outp}/log
configFile={config}/config.properties
configFileTasks={config}/tasks.properties
pluginsPath={home}/plugins
consoleSessionsPath={sessions}/console
libraryPath={script}; {script}/Lib
contextPath={outp}/context
configFilePlugins={config}/plugins.properties
devicesPath={home}/devices
configFileSettings={config}/settings.properties
imagesPath={data}
scriptType=py

1
config/tasks.properties Normal file
View File

@@ -0,0 +1 @@
archiver/short_term_archiver=10.0;1.0

View File

@@ -0,0 +1,4 @@
#Tue May 14 14:48:40 CEST 2024
LastRunDate=240514
DaySequentialNumber=29
FileSequentialNumber=40

12
devices/dp1.properties Normal file
View File

@@ -0,0 +1,12 @@
#Tue May 14 10:37:17 CEST 2024
motor7=null
motor8=null
motor5=null
motor6=null
precision=-1
description=null
positions=Park|Ready|Out|Clear
motor3=null
motor4=null
motor1=0.0|4.0|8.0|0.0
motor2=0.0|5.0|3.0|NaN

17
devices/m1.properties Normal file
View File

@@ -0,0 +1,17 @@
#Tue May 14 10:37:17 CEST 2024
offset=0.0
maxValue=10.0
rotation=false
precision=2
scale=1.0
description=null
estbilizationDelay=0
maxSpeed=10.0
resolution=NaN
startRetries=1
minValue=-10.0
unit=mm
defaultSpeed=1.0
sign_bit=0
monitorByPosition=false
minSpeed=0.1

17
devices/m2.properties Normal file
View File

@@ -0,0 +1,17 @@
#Tue May 14 10:37:17 CEST 2024
offset=0.0
maxValue=10.0
rotation=false
precision=2
scale=1.0
description=null
estbilizationDelay=0
maxSpeed=10.0
resolution=NaN
startRetries=1
minValue=-10.0
unit=mm
defaultSpeed=1.0
sign_bit=0
monitorByPosition=false
minSpeed=0.1

11
devices/p1.properties Normal file
View File

@@ -0,0 +1,11 @@
#Tue May 14 10:37:17 CEST 2024
minValue=0.0
unit=mm
offset=0.0
maxValue=1000.0
rotation=false
precision=-1
sign_bit=0
scale=1.0
description=null
resolution=NaN

25
devices/src1.properties Normal file
View File

@@ -0,0 +1,25 @@
#Tue May 14 10:46:48 CEST 2024
spatialCalOffsetY=NaN
spatialCalOffsetX=NaN
colormapLogarithmic=false
scale=1.0
grayscale=false
spatialCalScaleX=NaN
spatialCalScaleY=NaN
colormapMax=NaN
rescaleOffset=0.0
roiWidth=-1
colormap=Temperature
invert=false
colormapMin=NaN
rotation=0.0
rotationCrop=false
rescaleFactor=1.0
spatialCalUnits=mm
flipVertically=false
roiHeight=-1
flipHorizontally=false
colormapAutomatic=true
roiY=0
roiX=0
transpose=false

25
devices/src2.properties Normal file
View File

@@ -0,0 +1,25 @@
#Tue May 14 10:46:48 CEST 2024
spatialCalOffsetY=NaN
spatialCalOffsetX=NaN
colormapLogarithmic=false
scale=1.0
grayscale=false
spatialCalScaleX=NaN
spatialCalScaleY=NaN
colormapMax=NaN
rescaleOffset=0.0
roiWidth=-1
colormap=Grayscale
invert=false
colormapMin=NaN
rotation=0.0
rotationCrop=false
rescaleFactor=1.0
spatialCalUnits=mm
flipVertically=false
roiHeight=-1
flipHorizontally=false
colormapAutomatic=true
roiY=0
roiX=0
transpose=false

View File

@@ -0,0 +1,96 @@
if get_context().localMode:
raise Exception ("Must run in exclusive mode")
set_exec_pars(name="archiver", open=True)
#data_path = "/sls/rf/data/SLS_Teststand/PShell/data/"
def get_data_path(channel):
#path = data_path + expand_path("{date}")
#path = expand_path("{data}/{date}/archiver")
path = get_exec_pars().path
if not os.path.exists(path):
os.makedirs(path)
channel = channel.replace(":", "_") #FILENAMES DO NOT SUPPORT :
return path + "/"+ channel + ".txt"
if "stop_short_term_archiver" in globals():
stop_short_term_archiver()
def _log(msg):
print msg
log(msg)
def archive_channel(channel, interval):
_log("Enter: " + str(channel))
try:
monitored = interval == True
polling = 0 if monitored else int (interval)
filename = get_data_path(channel)
#dev = "ca://" + channel + ("?monitored=true" if monitored else ")
while True:
with Channel(channel, monitored, polling) as ch:
with open(filename, 'a') as data_file:
_log("Opened: " + filename)
channel_listener = ChannelListener(data_file)
ch.addListener(channel_listener)
ch.update()
while True:
if filename != get_data_path(channel):
_log("Closing: " + filename)
break
time.sleep(1.0)
"""
class Timestamp(Readable):
def read(self):
timestamp = ch.takeTimestamped().timestamp
return timestamp
timestamp = Timestamp()
devices = (ch, timestamp)
if monitored:
mscan(channel, devices, take_initial=True, display=False, keep=False, tag=channel)
else:
tscan(devices, -1, interval*100, display=False, keep=False, tag=channel)
"""
except Exception as ex:
_log("ERROR: " + str( sys.exc_info()[1]))
traceback.print_exc()
finally:
_log("Exit: " + str(channel))
short_term_archiver_cfg = {}
short_term_archiver_tasks=[]
def start_short_term_archiver(metadata=False):
global short_term_archiver_cfg
global short_term_archiver_tasks
print "Starting Short Term Archiver"
short_term_archiver_cfg = parse_short_term_archiver_config(metadata)
short_term_archiver_tasks = fork(* [[archive_channel,[channel, interval,]] for channel,interval in short_term_archiver_cfg.items()])
def wait_short_term_archiver():
global short_term_archiver_tasks
join(short_term_archiver_tasks)
def stop_short_term_archiver():
global short_term_archiver_tasks
print "Stopping Short Term Archiver"
for task in short_term_archiver_tasks:
try:
task.cancel(True)
except:
pass
try:
start_short_term_archiver()
wait_short_term_archiver()
finally:
stop_short_term_archiver()

View File

@@ -0,0 +1,35 @@
#PVs from the RF Booster / Teststand HV Modulator VME IOC
###################################################################
ABORF-A0:FirstError None None Monitor
ABORF-CAV0:Vcav 1 10 150
ABORF-A0-D50W:Pi 1 10 600
ABORF-A0-D50W:Pi.EGU None None Monitor
ABORF-A0-D50W:Pi-C 1 10 600
ABORF-A0-D50W:Pi-C.EGU None None Monitor
ABORF-A0-D50W:Pr-C 1 10 600
ABORF-A0-D50W:Pr-C.EGU None None Monitor
ABORF-A0-AMLP:Vlim-R 6 30 600
ABORF-A0-AMLP:Vlim-R.EGU None None Monitor
ABORF-A0:ARCS None None Monitor
ABORF-WG0-CO1:Pki 1 10 600
ABORF-WG0-CO1:Pki.EGU None None Monitor
ABORF-WG0-CO1:Pki-C 1 10 600
ABORF-WG0-CO1:Pki-C.EGU None None Monitor
ABORF-WG0-CO1:Pkr 1 10 600
ABORF-WG0-CO1:Pkr.EGU None None Monitor
ABORF-WG0-CO1:Pkr-C 1 10 600
ABORF-WG0-CO1:Pkr-C.EGU None None Monitor
ABORF-A0-HVPS:I 1 10 600
ABORF-A0-HVPS:I.EGU None None Monitor
ABORF-A0-FIL:I 1 10 600
ABORF-A0-FIL:I.EGU None None Monitor
ABORF-A0-MOD:I 1 10 600
ABORF-A0-MOD:I.EGU None None Monitor
ABORF-A0-IPS1:V 1 10 600
ABORF-A0-IPS1:V.EGU None None Monitor
ABORF-CAV0-CLRK:FlowPr 1 10 600
ABORF-CAV0-CLRK:FlowPr.EGU None None Monitor
ABORF-CAV0-CLRK:ValvPos 1 10 600
ABORF-CAV0-CLRK:ValvPos.EGU None None Monitor
ABORF-CIR0TCU:COIL_CURRENT 1 10 600
ABORF-CIR0TCU:COIL_CURRENT.EGU None None Monitor

View File

@@ -0,0 +1,82 @@
#PVs from the RF Teststand Cooling PLC
###################################################################
#mbbi
ATSRF-CAVR:EndDiscIn-Water-Flowswitch1 None None Monitor
ATSRF-CAVR:EndDiscIn-Water-Flowswitch2 None None Monitor
ATSRF-CAVR:EndDiscOut-Water-Flowswitchw1 None None Monitor
ATSRF-CAVR:EndDiscOut-Water-Flowswitchw2 None None Monitor
ATSRF-CAVR:Wedge-Water-Flowswitch None None Monitor
ATSRF-CAVR:TuningPlunger-Water-Flowswitch None None Monitor
ATSRF-CAVR:TopWG-Water-Flowswitch None None Monitor
ATSRF-CAVR:LeftWG-Water-Flowswitch None None Monitor
ATSRF-CAVR:RightWG-Water-Flowswitch None None Monitor
ATSRF-CAVR:Coupler-Water-Flowswitch None None Monitor
ATSRF-CAVR:BodyRidge1-Water-Flowswitch None None Monitor
ATSRF-CAVR:BodyRidge2-Water-Flowswitch None None Monitor
ATSRF-CAVR:Body-Water-Flowswitch1 None None Monitor
ATSRF-CAVR:Body-Water-Flowswitch2 None None Monitor
ATSRF-CAVR:Body-Water-Flowswitch3 None None Monitor
ATSRF-CAVR:Coupler-Plunger-Water-Flowswitch None None Monitor
ATSRF-CAVR:Coupler-Air-Pressureswitch None None Monitor
###################################################################
#bi
ATSRF-CAV:Water-Leak None None Monitor
ATSRF-CAV:Vacuum-SumILK None None Monitor
ATSRF-CAVR:Inlet-Watervalve-Open None None Monitor
ATSRF-CAVR:Inlet-Valvevalve-Closed None None Monitor
ATSRF-CAVR:Outlet-Watervalve-Open None None Monitor
ATSRF-CAVR:Outlet-Watervalve-Closed None None Monitor
ATSRF-CAVR:Inlet-Watervalve None None Monitor
ATSRF-CAVR:Outlet-Watervalve None None Monitor
ATSRF-CAVR:Outlet-Airvalve None None Monitor
###################################################################
#ai
ATSRF-CAVR:Water-Flow None 60 3600
ATSRF-CAVR:Water-Flow.EGU None None Monitor
ATSRF-CAVR:Water-Flow.HIHI None None Monitor
ATSRF-CAVR:Water-Flow.LOLO None None Monitor
#
ATSRF-CAVR:Coupler-Air-Flow None 60 3600
ATSRF-CAVR:Coupler-Air-Flow.EGU None None Monitor
ATSRF-CAVR:Coupler-Air-Flow.HIHI None None Monitor
ATSRF-CAVR:Coupler-Air-Flow.LOLO None None Monitor
#
ATSRF-CAVR:Water-Pressure-Inlet None 60 3600
ATSRF-CAVR:Water-Pressure-Inlet.EGU None None Monitor
ATSRF-CAVR:Water-Pressure-Inlet.HIHI None None Monitor
ATSRF-CAVR:Water-Pressure-Inlet.LOLO None None Monitor
#
ATSRF-CAVR:Water-Pressure-Outlet None 60 3600
ATSRF-CAVR:Water-Pressure-Outlet.EGU None None Monitor
ATSRF-CAVR:Water-Pressure-Outlet.HIHI None None Monitor
ATSRF-CAVR:Water-Pressure-Outlet.LOLO None None Monitor
#
ATSRF-CAVR:Inlet-Watervalve-Temp None 60 3600
ATSRF-CAVR:Inlet-Watervalve-Temp.EGU None None Monitor
ATSRF-CAVR:Inlet-Watervalve-Temp.HIHI None None Monitor
ATSRF-CAVR:Inlet-Watervalve-Temp.LOLO None None Monitor
#
ATSRF-CAVR:Outlet-Watervalve-Temp None 60 3600
ATSRF-CAVR:Outlet-Watervalve-Temp.EGU None None Monitor
ATSRF-CAVR:Outlet-Watervalve-Temp.HIHI None None Monitor
ATSRF-CAVR:Outlet-Watervalve-Temp.LOLO None None Monitor
#
ATSRF-CAVR:Wedge-Water-Temp None 60 3600
ATSRF-CAVR:Wedge-Water-Temp.EGU None None Monitor
ATSRF-CAVR:Wedge-Water-Temp.HIHI None None Monitor
ATSRF-CAVR:Wedge-Water-Temp.LOLO None None Monitor
#
ATSRF-CAVR:Tuner-Water-Temp None 60 3600
ATSRF-CAVR:Tuner-Water-Temp.EGU None None Monitor
ATSRF-CAVR:Tuner-Water-Temp.HIHI None None Monitor
ATSRF-CAVR:Tuner-Water-Temp.LOLO None None Monitor
#
ATSRF-CAVR:Coupler-Water-Temp None 60 3600
ATSRF-CAVR:Coupler-Water-Temp.EGU None None Monitor
ATSRF-CAVR:Coupler-Water-Temp.HIHI None None Monitor
ATSRF-CAVR:Coupler-Water-Temp.LOLO None None Monitor
#
ATSRF-CAVR:Coupler-Air-Temp None 60 3600
ATSRF-CAVR:Coupler-Air-Temp.EGU None None Monitor
ATSRF-CAVR:Coupler-Air-Temp.HIHI None None Monitor
ATSRF-CAVR:Coupler-Air-Temp.LOLO None None Monitor

3
script/local.groovy Normal file
View File

@@ -0,0 +1,3 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// Deployment specific global definitions - executed after startup.groovy
///////////////////////////////////////////////////////////////////////////////////////////////////

4
script/local.js Normal file
View File

@@ -0,0 +1,4 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
// Deployment specific global definitions - executed after startup.js
///////////////////////////////////////////////////////////////////////////////////////////////////

127
script/local.py Normal file
View File

@@ -0,0 +1,127 @@
###################################################################################################
# Deployment specific global definitions - executed after startup.py
###################################################################################################
import java.time.format.DateTimeFormatter as DateTimeFormatter
import java.time.Instant as Instant
import java.time.LocalDateTime as LocalDateTime
import java.time.ZoneOffset as ZoneOffset
import org.jfree.chart.axis.DateAxis as DateAxis
import traceback
import ch.psi.pshell.epics.InvalidValueAction as InvalidValueAction
#with Channel("ABORF-A0-HVPS:I", monitored=False) as ch:
# print ch.read()
class Channel:
def __init__(self,channel_name, monitored, polling):
self.channel_name=channel_name
self.monitored= monitored
self.polling = polling
def __enter__(self):
self.channel=GenericChannel(self.channel_name,self.channel_name, True, InvalidValueAction.None)
self.channel.setMonitored(self.monitored)
self.channel.setPolling(self.polling)
self.channel.initialize()
return self.channel
def __exit__(self, exc_type, exc_val, exc_tb):
self.channel.close()
#timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS")
def get_time_str(timestamp):
#instant = Instant.ofEpochMilli(timestamp)
#currentTime = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault())
#return currentTime.format(timeFormatter);
return str(timestamp)
ITEM_SEPARATOR = "; "
def init_archiver(f, cls = None):
if cls is None:
cls = "java.lang.Double"
f.write ("#Timestamp" + ITEM_SEPARATOR + "Value" + ITEM_SEPARATOR + "\n")
f.write ("#java.lang.Long" + ITEM_SEPARATOR + Class.getName(cls) + ITEM_SEPARATOR + "\n")
f.flush()
def write_archive(f, timestamp, value):
v = get_time_str(timestamp) + ITEM_SEPARATOR+ str(value) + ITEM_SEPARATOR
f.write (v+ "\n")
f.flush()
class ChannelListener (DeviceListener):
def __init__(self, f):
self.f = f
def onCacheChanged(self, ch, value, former, timestamp, valueChange):
if self.f.tell() == 0:
cls=ch.getElementType()
init_archiver(self.f, cls)
write_archive(self.f, timestamp, value)
def parse_archiver_config(metadata=True, file_name=None):
ret = {}
if not file_name:
for file_name in os.listdir(expand_path("{script}/config")):
if file_name.endswith(".config"):
# If the file has the desired extension, add it to the list
ret.update(parse_archiver_config(metadata, expand_path("{script}/config/" + file_name)))
else:
with open(file_name, 'r') as f:
for line in f:
line = line.strip()
if line.startswith('#'):
continue # Skip lines starting with '#'
parts = line.split() # Split the line by whitespace
if len(parts) >= 4:
def adjust(v):
try:
if v=="None":
return False
elif v=="Monitor":
return True
else:
return int(v)
except Exception as e:
print (e)
return None
name = parts[0]
if metadata or not "." in name:
v1 = adjust(parts[1])
v2 = adjust(parts[2])
v3 = adjust(parts[3])
ret[name] = [v1, v2, v3]
return ret
def parse_short_term_archiver_config(metadata):
ret = parse_archiver_config(metadata)
return {name:v[2] for name,v in ret.items()}
def plot_channel(channel, day, title=None):
path="/"+day+"/archiver|/" + channel.replace(":", "_")
data =load_data(path)
tm = [i[0]for i in data]
val = [i[1]for i in data]
p=plot(val, name=channel + " [" + day + "]", xdata=tm, title=title)[0]
axis = DateAxis(None)
axis.setTickLabelPaint(p.getAxisTextColor())
p.getChart().getXYPlot().setDomainAxis(axis)
#channels = parse_short_term_archiver_config(False)
#for c in channels.keys():
# print c, caget(c)

View File

@@ -0,0 +1,55 @@
import java.time.format.DateTimeFormatter as DateTimeFormatter
import java.time.Instant as Instant
import java.time.LocalDateTime as LocalDateTime
import java.time.ZoneOffset as ZoneOffset
#with Channel("ABORF-A0-HVPS:I", monitored=False) as ch:
# print ch.read()
class Channel:
def __init__(self,channel_name, monitored, polling):
self.channel_name=channel_name
self.monitored= monitored
self.polling = polling
def __enter__(self):
self.channel=GenericChannel(self.channel_name,self.channel_name)
self.channel.setMonitored(self.monitored)
self.channel.setPolling(self.polling)
self.channel.initialize()
return self.channel
def __exit__(self, exc_type, exc_val, exc_tb):
self.channel.close()
timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")
def get_time_str(timestamp):
instant = Instant.ofEpochMilli(timestamp)
currentTime = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault())
return currentTime.format(timeFormatter);
def write_archive(f, timestamp, value):
print f + " " + get_time_str(timestamp) + " " + str(value)
class ChannelListener (DeviceListener):
def onCacheChanged(self, ch, value, former, timestamp, valueChange):
write_archive(ch.name, timestamp, value)
val=None
with Channel("ABORF-A0-HVPS:I", True, 0) as ch:
#val = ch.update()
#val=ch.takeTimestamped()
#write_archive(ch.name, val.timestamp, val.value)
channel_listener = ChannelListener()
ch.addListener(channel_listener)
ch.update()
val=ch.take()
time.sleep(10.0)

16
script/test/test_plot Normal file
View File

@@ -0,0 +1,16 @@
import org.jfree.chart.axis.DateAxis as DateAxis
def plot_channel(channel, day, title=None):
path=day+"/archiver|/" + channel.replace(":", "_")
print(path)
data =load_data(path)
tm = [i[0]for i in data]
val = [i[1]for i in data]
p=plot(val, name=channel + " [" + day + "]", xdata=tm, title=title)[0]
axis = DateAxis(None)
axis.setTickLabelPaint(p.getAxisTextColor())
p.getChart().getXYPlot().setDomainAxis(axis)
plot_channel("ATSRF-CAVR:Water-Pressure-Inlet","20240514")