Compare commits

..

No commits in common. "wip" and "uniax" have entirely different histories.
wip ... uniax

987 changed files with 58852 additions and 79827 deletions

View File

@ -1,2 +1,2 @@
Frappy framework for implementing SEC-nodes (see SECoP protocol on github).
SECoP playground for creating specification and testing one implementation.

7
.gitignore vendored
View File

@ -1,4 +1,3 @@
frappydemo.PID
log/*
html/*
*.pyc
@ -21,9 +20,5 @@ doc/_build
.coverage
._*
# jupyter
.ipynb_checkpoints/
*.ipynb
# pyinstaller
dist/
dist/

View File

@ -1,8 +0,0 @@
[settings]
multi_line_output=2
combine_as_imports=True
known_qt=frappy.gui.qt
known_core=frappy
sections=FUTURE,STDLIB,QT,THIRDPARTY,CORE,FIRSTPARTY,LOCALFOLDER

View File

@ -9,7 +9,7 @@
# Add <file or directory> to the black list. It should be a base name, not a
# path. You may set this option multiple times.
ignore = .git,resources_qt5.py,resources_qt6.py
ignore = .git
# Pickle collected data for later comparisons.
persistent=yes
@ -38,23 +38,26 @@ confidence=
# multiple time.
disable=missing-docstring
,locally-disabled
,locally-enabled
,fixme
,no-member
,not-callable
,bad-whitespace
,wrong-import-position
,ungrouped-imports
,import-self
,bad-continuation
,protected-access
,unused-argument
,duplicate-code
,attribute-defined-outside-init
,access-member-before-definition
,no-self-use
,broad-except
,unneeded-not
,unidiomatic-typecheck
,undefined-loop-variable
,consider-using-f-string
,use-dict-literal
,redefined-variable-type
,deprecated-lambda
[REPORTS]
@ -64,6 +67,10 @@ disable=missing-docstring
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
# Put messages in a separate file for each module / package specified on the
# command line instead of printing them on stdout. Reports (if any) will be
# written in a file name "pylint_global.[txt|html]".
files-output=no
# Tells whether to display a full report or only the messages
reports=no
@ -86,11 +93,14 @@ dummy-variables-rgx=_|dummy
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=Node,Mod,Param,Command,Group
additional-builtins=
[BASIC]
# List of builtins function names that should not be used, separated by a comma
#bad-functions=map,filter,apply,input
bad-functions=apply,input
# Regular expression which should only match correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9_]+))$
@ -145,8 +155,14 @@ notes=FIXME,XXX,TODO
# Maximum number of characters on a single line.
max-line-length=132
# List of optional constructs for which whitespace checking is disabled. `dict-
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
# `empty-line` allows space-only lines.
no-space-check=trailing-comma,dict-separator
# Maximum number of lines in a module
max-module-lines=1000
max-module-lines=1200
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
@ -202,10 +218,7 @@ max-branches=50
max-statements=150
# Maximum number of parents for a class (see R0901).
max-parents=20
# Maximum number of positional arguments
max-positional-arguments=10
max-parents=15
# Maximum number of attributes for a class (see R0902).
max-attributes=50

View File

@ -3,18 +3,12 @@
all: clean doc
# Make spawns a new shell for each command.
# Save each PID in temporary file
# sleep in order for "test" to have started reliably
demo:
@rm -f frappydemo.PID || true
@{ bin/frappy-server -q demo & echo $$! >> frappydemo.PID; }
@{ bin/frappy-server -q test & echo $$! >> frappydemo.PID; }
@{ bin/frappy-server -q cryo & echo $$! >> frappydemo.PID; }
@sleep 0.2
@bin/frappy-gui localhost:10767 localhost:10768 localhost:10769
@cat frappydemo.PID | xargs kill || true
@rm frappydemo.PID
@bin/secop-server -q demo &
@bin/secop-server -q test &
@bin/secop-server -q cryo &
@bin/secop-gui localhost:10767 localhost:10768 localhost:10769
@ps aux|grep [s]ecop-server|awk '{print $$2}'|xargs kill
build:
python3 setup.py build
@ -38,18 +32,18 @@ test-verbose:
python3 $(shell which pytest) -v test -s
test-coverage:
python3 $(shell which pytest) -v test --cov=frappy
python3 $(shell which pytest) -v test --cov=secop
doc:
$(MAKE) -C doc html
lint:
pylint -f colorized -r n --rcfile=.pylintrc frappy frappy_* test
pylint -j 0 -f colorized -r n --rcfile=.pylintrc secop secop_* test
isort:
@find test -name '*.py' -print0 | xargs -0 isort -e -m 2 -w 80 -ns __init__.py
@find frappy -name '*.py' -print0 | xargs -0 isort -e -m 2 -w 80 -ns __init__.py
@find . -wholename './frappy_*.py' -print0 | xargs -0 isort -e -m 2 -w 80 -ns __init__.py
@find secop -name '*.py' -print0 | xargs -0 isort -e -m 2 -w 80 -ns __init__.py
@find . -wholename './secop_*.py' -print0 | xargs -0 isort -e -m 2 -w 80 -ns __init__.py
release-patch:
MODE="patch" $(MAKE) release
@ -61,8 +55,8 @@ release-major:
MODE="major" $(MAKE) release
release:
ssh jenkins.admin.frm2.tum.de -p 29417 build -v -s -p GERRIT_PROJECT=$(shell git config --get remote.origin.url | rev | cut -d '/' -f -2 | rev) -p ARCH=all -p MODE=$(MODE) ReleasePipeline
ssh jenkinsng.admin.frm2 -p 29417 build -v -s -p GERRIT_PROJECT=$(shell git config --get remote.origin.url | rev | cut -d '/' -f -3 | rev) -p ARCH=all -p MODE=$(MODE) ReleasePipeline
build-pkg:
debocker build --image docker.ictrl.frm2.tum.de:5443/mlzbase/buster
debocker build --image jenkinsng.admin.frm2:5000/mlzbase/buster

View File

@ -15,8 +15,9 @@ branches:
- work: current working version, usually in use on /home/l_samenv/frappy (and on neutron instruments)
this should be a copy of an earlier state of the wip branch
- wip: current test version, usually in use on /home/l_samenv/frappy_wip
IMPORTANT: make commits containing either only files to be pushed to Gerrit or only
PSI internal files, not mixed. Mark local commits with '[PSI]' in the commit message.
IMPORTANT: make commits containing either only files to be pushed to Gerrit or only
PSI internal files, not mixed. Mark local commits with '[PSI]' in the commit message.
master --> mlz # these branches match after a sync step, but they might have a different history
@ -34,7 +35,7 @@ where commits may be cherry picked for input to Gerrit. As generally in the revi
changes are done, eventually a sync step should happen:
1) ideally, this is done when work and wip match
2) make sure branches mlz, master, wip and work are in syns with remote, push/pull otherwise
2) make sure branches mlz, master, wip and work are in synv with remote, push/pull otherwise
3) cherry-pick commits from mlz to master
4) make sure master and mlz branches match (git diff --name-only master..wip should only return README.md)
5) create branch new_work from master
@ -42,12 +43,11 @@ changes are done, eventually a sync step should happen:
- core commits already pushed through gerrit are skipped
- all other commits are to be cherry-picked
7) when arrived at the point where the new working version should be,
copy new_wip branch to work with 'git checkout -B work'.
Not sure if this works, as work is to be pushed to git.psi.ch.
We might first remove the remote branch with 'git push origin --delete work'.
And then create again (git push origin work)?
8) continue with (6) if wip and work should differ, and do like (7) for wip branch
9) delete new_wip branch, push master, wip and work branches
copy new_wip branch to work with 'git checkout work;git checkout new_wip .'
(note the dot!) and then commit this.
8) continue with (6) if wip and work should differ
9) do like (7), but for wip branch
10) delete new_wip branch, push master, wip and work branches
## Procedure to update PPMS
@ -60,3 +60,4 @@ changes are done, eventually a sync step should happen:
cp -r secop /Volumes/PPMSData/zolliker/frappy/secop
it may be that additional folder have to copied ...

View File

@ -1,66 +0,0 @@
#!/usr/bin/env python3
# *****************************************************************************
# Copyright (c) 2015-2024 by the authors, see LICENSE
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Alexander Lenz <alexander.lenz@frm2.tum.de>
# Markus Zolliker <markus.zolliker@psi.ch>
#
# *****************************************************************************
import sys
import argparse
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import init, run, clientenv, interact
def parseArgv(argv):
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--include',
help='file to execute after connecting to the clients', metavar='file',
type=Path, action='append', default=[])
parser.add_argument('-o', '--only-execute',
help='Do not go into interactive mode after executing files. \
Has no effect without --include.', action='store_true')
parser.add_argument('node',
help='Nodes the client should connect to.\n', metavar='host:port',
nargs='*', type=str, default=[])
return parser.parse_args(argv)
args = parseArgv(sys.argv[1:])
success = init(*args.node)
run_error = ''
file_success = False
try:
for file in args.include:
run(file)
file_success = True
except Exception as e:
run_error = f'\n{clientenv.short_traceback()}'
if success:
if args.include and file_success and args.only_execute:
print('skipping interactive mode')
exit()
interact(run_error)

View File

@ -1,82 +0,0 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# *****************************************************************************
# Copyright (c) 2015-2024 by the authors, see LICENSE
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Alexander Lenz <alexander.lenz@frm2.tum.de>
#
# *****************************************************************************
from __future__ import print_function
import sys
import argparse
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
import logging
from mlzlog import ColoredConsoleHandler
from frappy.gui.qt import QApplication
from frappy.gui.mainwindow import MainWindow
def parseArgv(argv):
parser = argparse.ArgumentParser()
loggroup = parser.add_mutually_exclusive_group()
loggroup.add_argument('-d', '--debug',
help='Enable debug output',
action='store_true', default=False)
loggroup.add_argument('-q', '--quiet',
help='Supress everything but errors',
action='store_true', default=False)
parser.add_argument('-D', '--detailed',
help='Start in detailed mode',
action='store_true', default=False)
parser.add_argument('node',
help='Nodes the GUI should connect to.\n', metavar='host[:port]',
nargs='*', type=str, default=[])
return parser.parse_args(argv)
def main(argv=None):
if argv is None:
argv = sys.argv
args = parseArgv(argv[1:])
loglevel = logging.DEBUG if args.debug else (logging.ERROR if args.quiet else logging.INFO)
logger = logging.getLogger('gui')
logger.setLevel(logging.DEBUG)
if sys.stdout is not None:
console = ColoredConsoleHandler()
console.setLevel(loglevel)
logger.addHandler(console)
app = QApplication(argv, organizationName='frappy', applicationName='frappy_gui')
win = MainWindow(args, logger)
app.aboutToQuit.connect(win._onQuit)
win.show()
return app.exec()
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -1,139 +0,0 @@
#!/usr/bin/env python3
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Alexander Zaft <a.zaft@fz-juelich.de>
#
# *****************************************************************************
"""SEC node autodiscovery tool."""
import argparse
import json
import os
import select
import socket
import sys
from collections import namedtuple
from time import time as currenttime
UDP_PORT = 10767
Answer = namedtuple('Answer',
'address, port, equipment_id, firmware, description')
def decode(msg, addr):
msg = msg.decode('utf-8')
try:
data = json.loads(msg)
except Exception:
return None
if not isinstance(data, dict):
return None
if data.get('SECoP') != 'node':
return None
try:
eq_id = data['equipment_id']
fw = data['firmware']
desc = data['description']
port = data['port']
except KeyError:
return None
addr, _scanport = addr
return Answer(addr, port, eq_id, fw, desc)
def print_answer(answer, *, short=False):
try:
hostname = socket.gethostbyaddr(answer.address)[0]
address = hostname
numeric = f' ({answer.address})'
except Exception:
address = answer.address
numeric = ''
if short:
# NOTE: keep this easily parseable!
print(f'{answer.equipment_id} {address}:{answer.port}')
return
print(f'Found {answer.equipment_id} at {address}{numeric}:')
print(f' Port: {answer.port}')
print(f' Firmware: {answer.firmware}')
desc = answer.description.replace('\n', '\n ')
print(f' Node description: {desc}')
print('-' * 80)
def scan(max_wait=1.0):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# send a general broadcast
try:
s.sendto(json.dumps(dict(SECoP='discover')).encode('utf-8'),
('255.255.255.255', UDP_PORT))
except OSError as e:
print('could not send the broadcast:', e)
# we still keep listening for self-announcements
start = currenttime()
seen = set()
while currenttime() < start + max_wait:
res = select.select([s], [], [], 0.1)
if res[0]:
try:
msg, addr = s.recvfrom(1024)
except socket.error: # pragma: no cover
continue
answer = decode(msg, addr)
if answer is None:
continue
if (answer.address, answer.equipment_id, answer.port) in seen:
continue
seen.add((answer.address, answer.equipment_id, answer.port))
yield answer
def listen(*, short=False):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
if os.name == 'nt':
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
else:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(('0.0.0.0', UDP_PORT))
while True:
try:
msg, addr = s.recvfrom(1024)
except KeyboardInterrupt:
break
answer = decode(msg, addr)
if answer:
print_answer(answer, short=short)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-l', '--listen', action='store_true',
help='Keep listening after the broadcast.')
parser.add_argument('-s', '--short', action='store_true',
help='Print short info (always on when listen).')
args = parser.parse_args(sys.argv[1:])
short = args.listen or args.short
if not short:
print('-' * 80)
for answer in scan():
print_answer(answer, short=short)
if args.listen:
listen(short=short)

64
bin/make_doc.py Executable file
View File

@ -0,0 +1,64 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
#
# *****************************************************************************
import os
from os import path
import markdown
BASE_PATH = path.abspath(path.join(path.dirname(__file__), '..'))
DOC_SRC = path.join(BASE_PATH, 'doc')
DOC_DST = path.join(BASE_PATH, 'html')
conv = markdown.Markdown()
for dirpath, dirnames, filenames in os.walk(DOC_SRC):
# re-create the dir-structure of DOC_SRC into DOC_DST
dst_path = path.join(DOC_DST, path.relpath(dirpath, DOC_SRC))
try:
os.mkdir(dst_path)
except OSError:
pass
for fn in filenames:
full_name = path.join(dirpath, fn)
sub_name = path.relpath(full_name, DOC_SRC)
final_name = path.join(DOC_DST, sub_name)
if not fn.endswith('md'):
# just copy everything else
with open(full_name, 'rb') as fi:
with open(final_name, 'wb') as fo:
# WARNING: possible Memory hog!
fo.write(fi.read())
continue
# treat .md files special
final_sub_name = path.splitext(sub_name)[0] + '.html'
final_name = path.join(DOC_DST, final_sub_name)
print("Converting %s to %s" %(sub_name, final_sub_name))
# transform one file
conv.reset()
conv.convertFile(input=full_name,
output=final_name,
encoding="utf-8")

View File

@ -1,53 +0,0 @@
#!/usr/bin/env python3
import sys
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import Client
from frappy_psi.iqplot import Plot
import numpy as np
import matplotlib.pyplot as plt
if len(sys.argv) < 2:
print('Usage: peus-plot <maxY>')
def get_modules(name):
return list(filter(None, (globals().get(name % i) for i in range(10))))
secnode = Client('pc13252:5000')
time_size = {'time', 'size'}
int_mods = [u] + get_modules('roi%d')
t_rois = get_modules('roi%d')
i_rois = get_modules('roi%di')
q_rois = get_modules('roi%dq')
maxx = None
if len(sys.argv) > 1:
maxy = float(sys.argv[1])
if len(sys.argv) > 2:
maxx = float(sys.argv[2])
else:
maxy = 0.02
iqplot = Plot(maxy, maxx)
for i in range(99):
pass
try:
while True:
curves = np.array(u.get_curves())
iqplot.plot(curves,
rois=[(r.time - r.size * 0.5, r.time + r.size * 0.5) for r in int_mods],
average=([r.time for r in t_rois],
[r.value for r in i_rois],
[r.value for r in q_rois]))
if not iqplot.pause(0.5):
break
except KeyboardInterrupt:
iqplot.close()

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python
# pylint: disable=invalid-name
# -*- coding: utf-8 -*-
# *****************************************************************************
# Copyright (c) 2015-2024 by the authors, see LICENSE
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
@ -29,11 +29,8 @@ from os import path
# Add import path for inplace usage
sys.path.insert(0, path.abspath(path.join(path.dirname(__file__), '..')))
import logging
from mlzlog import ColoredConsoleHandler
from frappy.gui.qt import QApplication
from frappy.gui.cfg_editor.mainwindow import MainWindow
from secop.gui.qt import QApplication
from secop.gui.cfg_editor.mainwindow import MainWindow
def main(argv=None):
@ -41,13 +38,9 @@ def main(argv=None):
parser.add_argument('-f', '--file', help='Configuration file to open.')
args = parser.parse_args()
app = QApplication(argv)
logger = logging.getLogger('gui')
console = ColoredConsoleHandler()
console.setLevel(logging.INFO)
logger.addHandler(console)
window = MainWindow(args.file, log=logger)
window = MainWindow(args.file)
window.show()
return app.exec()
return app.exec_()
if __name__ == '__main__':

View File

@ -1,174 +0,0 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# -*- coding: utf-8 -*-
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
# Alexander Lenz <alexander.lenz@frm2.tum.de>
#
# *****************************************************************************
import sys
from os import path
# Add import path for inplace usage
sys.path.insert(0, path.abspath(path.join(path.dirname(__file__), '..')))
from secop.lib import generalConfig
from secop.logging import logger
from secop.server import Server
from secop.core import Attached
from secop.lib.enum import EnumMember
def rep(value):
if isinstance(value, EnumMember):
return repr(value.name)
return repr(value)
def guess(value):
try:
return '%.16g' % float(value)
except (TypeError, ValueError):
return rep(value)
def triplequote(description):
if '\n' in description:
return "'''%s'''" % '\n '.join(description.split('\n'))
else:
return repr(description)
def get_value(modobj, pname, value):
prop = modobj.propertyDict.get(pname)
if isinstance(prop, Attached):
return value
clsname = type(modobj).__qualname__
if pname in {'extra_modules', 'single_module', 'rel_paths', 'json_file'} and clsname.startswith('Sea'):
return value.split()
if pname == 'extra_params' and clsname.startswith('Sim'):
return [v.strip() for v in value.split(',')]
if pname == 'remote_class' and type(modobj).__bases__[0].__name__.startswith('Proxy'):
return value
return getattr(modobj, pname)
generalConfig.defaults = {k: True for k in (
'lazy_number_validation', 'disable_value_range_check', 'legacy_hasiodev', 'tolerate_poll_property')}
generalConfig.init()
logger.init('off')
def main(cfgs):
stats = {}
for name in cfgs:
try:
content = []
srv = Server(name, logger.log, cfgfiles=name, interface=5000, testonly=True)
if srv.node_cfg.get('class') is not None:
stats[name] = 'skip router'
continue
if 'FRAPPY' in srv.module_cfg:
stats[name] = 'skip genconfig'
continue
for modname, params in srv.module_cfg.items():
classname = params['class']
if classname == 'secop_psi.sea.SeaClient':
params['uri'] = 'none'
if 'iodev' in params:
params['io'] = params.pop('iodev')
if '.iodev' in params:
params['io'] = params.pop('.iodev')
node = dict(srv.node_cfg)
if 'description' in node:
content.append('Node(%r,\n %s,' % (node.pop('id'), triplequote(node.pop('description'))))
interface = srv.interface_cfg.get('uri')
if interface:
content.append(' interface=%r,' % interface)
for k, v in node.items():
content.append(' %s=%s,' % (k, guess(v)))
content.append(')\n')
errors = srv._processCfg()
if errors:
content = ['# %s' % e[:120] for e in errors] + content
stats[name] = ', '.join(errors[:2])
for modname, modcfg in srv.module_cfg.items():
modobj = srv.dispatcher._modules.get(modname)
classname = modcfg.pop('class')
content.append('Mod(%r,\n %r,' % (modname, classname))
description = modcfg.pop('description', None)
if description is not None:
content.append(' %s,' % triplequote(description))
result = {}
for key, value in modcfg.items():
pname, _, prop = key.partition('.')
if not pname:
pname, prop = prop, ''
elif pname == 'uri' and value == 'none':
continue
if prop:
pobj = modobj.parameters[pname] if modobj else None
if pobj:
try:
propvalue = rep(getattr(pobj, prop))
except AttributeError:
propvalue = rep(getattr(pobj.datatype, prop))
else:
propvalue = guess(value)
else:
prop = 'value'
if modobj:
propvalue = rep(get_value(modobj, pname, value))
else:
propvalue = guess(value)
result.setdefault(pname, {})[prop] = propvalue
undef = object()
for pname, cfg in result.items():
value = cfg.pop('value', undef)
if not cfg:
content.append(' %s=%s,' % (pname, value))
else:
args = ['%s=%s' % kv for kv in cfg.items()]
if value is not undef:
args.insert(0, value)
joined = ' '.join(args)
head = ' %s=Param(' % pname
if len(joined) < 8:
content.append('%s%s),' % (head, ', '.join(args)))
else:
content.append('%s\n %s,\n ),' % (head, ',\n '.join(args)))
content.append(')\n')
with open('%s' % name.replace('.cfg', '_cfg.py'), 'w') as f:
f.write('\n'.join(content))
stats[name] = '*' if name in stats else ''
except KeyboardInterrupt:
break
except BaseException as e:
stats[name] = repr(e)
if len(cfgs) == 1:
raise
if len(cfgs) > 1:
with open('convert.log', 'w') as f:
f.write('\n'.join('%s: %s' % kv for kv in stats.items())+'\n')
if __name__ == '__main__':
main(sys.argv[1:])

71
bin/secop-gui Executable file
View File

@ -0,0 +1,71 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# -*- coding: utf-8 -*-
# *****************************************************************************
# Copyright (c) 2015-2016 by the authors, see LICENSE
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Alexander Lenz <alexander.lenz@frm2.tum.de>
#
# *****************************************************************************
from __future__ import print_function
import sys
from os import path
# Add import path for inplace usage
sys.path.insert(0, path.abspath(path.join(path.dirname(__file__), '..')))
import mlzlog
from secop.gui.qt import QApplication
from secop.gui.mainwindow import MainWindow
def main(argv=None):
if argv is None:
argv = sys.argv
if '-h' in argv or '--help' in argv:
print("Usage: secop-gui [-d] [-h] [host:[port]]")
print()
print("Option GNU long option Meaning")
print("-h --help Show this message")
print("-d --debug Enable debug output")
print()
print("if not given, host defaults to 'localhost' and port to 10767")
sys.exit(0)
if '-d' in argv or '--debug' in argv:
mlzlog.initLogging('gui', 'debug')
else:
mlzlog.initLogging('gui', 'info')
app = QApplication(argv)
hosts = [host for host in argv[1:] if not host.startswith('-')]
if not hosts:
hosts = ['localhost:10767']
win = MainWindow(hosts)
win.show()
return app.exec_()
if __name__ == '__main__':
sys.exit(main(sys.argv))

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# -*- coding: utf-8 -*-
# *****************************************************************************
#
# This program is free software; you can redistribute it and/or modify it under
@ -22,28 +23,21 @@
#
# *****************************************************************************
import argparse
import sys
from pathlib import Path
import argparse
from os import path
import mlzlog
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
sys.path.insert(0, path.abspath(path.join(path.dirname(__file__), '..')))
from frappy.lib import generalConfig
from frappy.logging import logger
from frappy.server import Server
from secop.lib import getGeneralConfig
from secop.server import Server
def parseArgv(argv):
parser = argparse.ArgumentParser(
description="Manage a SECoP server",
epilog="""The server needs some configuration, by default from the
generalConfig.cfg file. the keys confdir, logdir and piddir have to
be set.
Alternatively, one can set the environment variables FRAPPY_CONFDIR
FRAPPY_LOGDIR and FRAPPY_PIDDIR to set the required values.
"""
)
parser = argparse.ArgumentParser(description="Manage a SECoP server")
loggroup = parser.add_mutually_exclusive_group()
loggroup.add_argument("-v", "--verbose",
help="Output lots of diagnostic information",
@ -66,27 +60,15 @@ def parseArgv(argv):
parser.add_argument('-c',
'--cfgfiles',
action='store',
help="comma separated list of cfg files,\n"
"defaults to <name_of_the_instance>.\n"
"If a config file contains a slash, it is treated as a"
"path, otherwise the file is searched for in the "
"configuration directory.",
default=None)
parser.add_argument('-g',
'--gencfg',
action='store',
help="full path of general config file,\n"
"defaults to env. variable FRAPPY_CONFIG_FILE\n",
help="comma separated list of cfg files\n"
"defaults to <name_of_the_instance>\n"
"cfgfiles given without '.cfg' extension are searched in the configuration directory,"
"else they are treated as path names",
default=None)
parser.add_argument('-t',
'--test',
action='store_true',
help='check cfg files only',
default=False)
parser.add_argument('-r',
'--relaxed',
action='store_true',
help='no checking of problematic behaviour',
help='Check cfg files only',
default=False)
return parser.parse_args(argv)
@ -98,21 +80,17 @@ def main(argv=None):
args = parseArgv(argv[1:])
loglevel = 'debug' if args.verbose else ('error' if args.quiet else 'info')
generalConfig.set_default('lazy_number_validation', args.relaxed)
generalConfig.set_default('legacy_hasiodev', args.relaxed)
generalConfig.set_default('tolerate_poll_property', args.relaxed)
generalConfig.init(args.gencfg)
logger.init(loglevel)
mlzlog.initLogging('secop', loglevel, getGeneralConfig()['logdir'])
cfgfiles = [s.strip() for s in args.cfgfiles.split(',')] if args.cfgfiles else None
srv = Server(args.name, logger.log, cfgfiles=cfgfiles,
interface=args.port, testonly=args.test)
srv = Server(args.name, mlzlog.log, cfgfiles=args.cfgfiles, interface=args.port, testonly=args.test)
if args.daemonize:
srv.start()
else:
srv.run()
try:
srv.run()
except KeyboardInterrupt:
pass
if __name__ == '__main__':

View File

@ -1,197 +0,0 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# *****************************************************************************
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Markus Zolliker <markus.zolliker@psi.ch>
# *****************************************************************************
"""server for a string communicator
Usage:
bin/sim-server <communicator class> -p <server port> [-o <option1>=<value> <option2>=<value>]
open a server on <server port> to communicate with the string based <communicator> over TCP/IP.
Use cases, mainly for test purposes:
- relay to a hardware simulation written as a communicator
> bin/sim-server frappy_psi.ls370sim.Ls370Sim
- relay to a communicator not using TCP/IP, if Frappy should run on an other host
> bin/sim-server frappy.io.StringIO -o uri=serial:///dev/tty...
- as a T, if the hardware allows only one connection, and more than one is needed:
> bin/sim-server frappy.io.StringIO -o uri=tcp://<host>:<port>
typically using communicator class frappy.io.StringIO
"""
import sys
import argparse
from pathlib import Path
import socket
import time
import os
from ast import literal_eval
from socketserver import BaseRequestHandler, ThreadingTCPServer
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.lib import get_class, formatException, mkthread
class Logger:
def debug(self, *args):
pass
def log(self, level, *args):
pass
def info(self, *args):
print(*args)
exception = error = warn = info
class TcpRequestHandler(BaseRequestHandler):
def setup(self):
print(f'connection opened from {self.client_address}')
self.running = True
self.request.settimeout(1)
self.data = b''
def finish(self):
"""called when handle() terminates, i.e. the socket closed"""
# close socket
try:
self.request.shutdown(socket.SHUT_RDWR)
except Exception:
pass
finally:
print(f'connection closed from {self.client_address}')
self.request.close()
def poller(self):
while True:
time.sleep(1.0)
self.module.doPoll()
def handle(self):
"""handle a new connection"""
# do a copy of the options, as they are consumed
self.module = self.server.modulecls(
'mod', Logger(), dict(self.server.options), self.server)
self.module.earlyInit()
mkthread(self.poller)
while self.running:
try:
newdata = self.request.recv(1024)
if not newdata:
return
except socket.timeout:
# no new data during read, continue
continue
self.data += newdata
while self.running:
message, sep, self.data = self.data.partition(b'\n')
if not sep:
break
cmd = message.decode('latin-1')
try:
reply = self.module.communicate(cmd.strip())
if self.server.verbose:
print('%-40s | %s' % (cmd, reply))
except Exception:
print(formatException(verbose=True))
return
outdata = reply.encode('latin-1') + b'\n'
try:
self.request.sendall(outdata)
except Exception as e:
print(repr(e))
self.running = False
class Server(ThreadingTCPServer):
allow_reuse_address = os.name != 'nt' # False on Windows systems
class Dispatcher:
def announce_update(self, *_):
pass
def announce_update_error(self, *_):
pass
def __init__(self, port, modulecls, options, verbose=False):
super().__init__(('', port), TcpRequestHandler,
bind_and_activate=True)
self.secnode = None
self.dispatcher = self.Dispatcher()
self.verbose = verbose
self.modulecls = get_class(modulecls)
self.options = options
print(f'started sim-server listening on port {port}')
def parse_argv(argv):
parser = argparse.ArgumentParser(description="Relay to a communicator (simulated HW or other)")
parser.add_argument("-v", "--verbose",
help="output full communication",
action='store_true', default=False)
parser.add_argument("cls",
type=str,
help="communicator class.\n",)
parser.add_argument('-p',
'--port',
action='store',
help='server port or uri',
default=2089)
parser.add_argument('-o',
'--options',
action='store',
nargs='*',
help='options in the form key=value',
default=None)
return parser.parse_args(argv)
def main(argv=None):
if argv is None:
argv = sys.argv
args = parse_argv(argv[1:])
options = {'description': ''}
for item in args.options or ():
key, eq, value = item.partition('=')
if not eq:
raise ValueError(f"missing '=' in {item}")
try:
value = literal_eval(value)
except Exception:
pass
options[key] = value
srv = Server(int(args.port), args.cls, options, args.verbose)
srv.serve_forever()
if __name__ == '__main__':
sys.exit(main(sys.argv))

154
bin/stringio-server Executable file
View File

@ -0,0 +1,154 @@
#!/usr/bin/env python3
# pylint: disable=invalid-name
# -*- coding: utf-8 -*-
# *****************************************************************************
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Module authors:
# Markus Zolliker <markus.zolliker@psi.ch>
# *****************************************************************************
"""server for a string communicator
Usage:
bin/stringio-server <communciator> <server port>
open a server on <server port> to communicate with the string based <communicator> over TCP/IP.
Use cases, mainly for test purposes:
- as a T, if the hardware allows only one connection, and more than one is needed
- relay to a communicator not using TCP/IP, if Frappy should run on an other host
- relay to a hardware simulation written as a communicator
"""
import sys
from os import path
import asyncore
import socket
import ast
# Add import path for inplace usage
sys.path.insert(0, path.abspath(path.join(path.dirname(__file__), '..')))
from secop.lib import get_class, formatException
class LineHandler(asyncore.dispatcher_with_send):
def __init__(self, sock):
self.buffer = b""
asyncore.dispatcher_with_send.__init__(self, sock)
self.crlf = 0
def handle_read(self):
data = self.recv(8192)
if data:
parts = data.split(b"\n")
if len(parts) == 1:
self.buffer += data
else:
self.handle_line((self.buffer + parts[0]).decode('latin_1'))
for part in parts[1:-1]:
if part[-1] == b"\r":
self.crlf = True
part = part[:-1]
else:
self.crlf = False
self.handle_line(part.decode('latin_1'))
self.buffer = parts[-1]
def send_line(self, line):
self.send((line + ("\r\n" if self.crlf else "\n")).encode('latin_1'))
class LineServer(asyncore.dispatcher):
def __init__(self, host, port, lineHandlerClass):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
self.lineHandlerClass = lineHandlerClass
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print("Incoming connection from %s" % repr(addr))
self.lineHandlerClass(sock)
def loop(self):
asyncore.loop()
class Server(LineServer):
class Dispatcher:
def announce_update(self, *_):
pass
def announce_update_error(self, *_):
pass
def __init__(self, *args, **kwds):
super().__init__(*args, **kwds)
self.dispatcher = self.Dispatcher()
class Handler(LineHandler):
def handle_line(self, line):
try:
reply = module.do_communicate(line.strip())
if verbose:
print('%-40s | %s' % (line, reply))
except Exception:
print(formatException(verbose=True))
self.send_line(reply)
class Logger:
def debug(self, *args):
print(*args)
info = exception = debug
opts = {'description': 'simulator'}
args = []
for arg in sys.argv[1:]:
k, sep, v = arg.partition('=')
if not k:
args.append(v)
try:
v = ast.literal_eval(v)
except Exception:
pass
opts[k] = v
verbose = opts.pop('verbose', False)
opts['cls'] = 'secop_psi.ls370sim.Ls370Sim'
opts['port'] = 4567
if len(args) > 2:
raise ValueError('do not know about: %s' % ' '.join(args[2:]))
if len(args) == 2:
opts['port'] = int(args[1])
if len(args) > 0:
opts['cls'] = args[0]
args.append(opts)
cls = opts.pop('cls')
port = opts.pop('port')
srv = Server('localhost', int(port), Handler)
module = get_class(cls)(cls, Logger(), opts, srv)
module.earlyInit()
srv.loop()

View File

@ -1,65 +0,0 @@
#!/usr/bin/env python3
import sys
from pathlib import Path
# Add import path for inplace usage
sys.path.insert(0, str(Path(__file__).absolute().parents[1]))
from frappy.client.interactive import Client
import numpy as np
import matplotlib.pyplot as plt
from frappy_psi.iqplot import Pause
if len(sys.argv) < 2:
print("""
Usage:
us-plot <end> [<start> [<npoints>]]
end: end of window [ns]
start: start of window [n2], default: 0
npoints: number fo points (default 1000)
""")
sys.exit(0)
Client('pc13252:5000')
def plot(array, ax, style, xs):
xaxis = np.arange(len(array)) * xs
return ax.plot(xaxis, array, style)[0]
def update(array, line, xs):
xaxis = np.arange(len(array)) * xs
line.set_data(np.array([xaxis, array]))
def on_close(event):
sys.exit(0)
start = 0
end = float(sys.argv[1])
npoints = 1000
if len(sys.argv) > 2:
start = float(sys.argv[2])
if len(sys.argv) > 3:
npoints = float(sys.argv[3])
fig, ax = plt.subplots(figsize=(15,3))
pause = Pause(fig)
try:
get_signal = iq.get_signal
print('plotting RUS signal')
except NameError:
get_signal = u.get_signal
print('plotting PE signal')
xs, signal = get_signal(start, end, npoints)
lines = [plot(s, ax, '-', xs) for s in signal]
while pause(0.5):
plt.draw()
xs, signal = get_signal(start, end, npoints)
for line, sig in zip(lines, signal):
update(sig, line, xs)

View File

@ -1,22 +0,0 @@
import sys
import os
from glob import glob
from frappy_psi.calcurve import CalCurve
os.chdir('/Users/zolliker/gitpsi/calcurves')
if len(sys.argv) > 1:
calib = sys.argv[1]
c = CalCurve(calib)
else:
for file in sorted(glob('*.*')):
if file.endswith('.md') or file.endswith('.std'):
continue
try:
c = CalCurve(file)
xy = c.export()
print('%9.4g %12.7g %9.4g %9.4g %s' % (tuple(c.extx) + tuple(c.exty) + (file,)))
except Exception as e:
print(file, e)
calib = file

View File

@ -1,87 +0,0 @@
Node('PEUS.psi.ch',
'ultrasound, pulse_echo configuration',
interface='5000',
)
Mod('u',
'frappy_psi.ultrasound.PulseEcho',
'ultrasound acquisition loop',
freq='f',
# pollinterval=0.1,
time=900.0,
size=5000.0,
nr=500,
sr=32768,
bw=1e7,
)
Mod('fio',
'frappy_psi.ultrasound.FreqStringIO', '',
uri='serial:///dev/ttyS1?baudrate=57600',
)
Mod('f',
'frappy_psi.ultrasound.Frequency',
'writable for frequency',
output='R', # L for LF (bnc), R for RF (type N)
io='fio',
amp=0.5, # VPP
)
Mod('fdif',
'frappy_psi.ultrasound.FrequencyDif',
'writable for frequency minus base frequency',
freq='f',
base=41490200.0,
)
# Mod('curves',
# 'frappy_psi.ultrasound.Curves',
# 't, I, Q and pulse arrays for plot',
# )
def roi(name, time, size, components='iqpa', enable=True, control=False, freq=None, **kwds):
description = 'I/Q of region {name}'
if freq:
kwds.update(cls='frappy_psi.ultrasound.ControlRoi',
description=f'{description} as control loop',
freq=freq, **kwds)
else:
kwds.update(cls='frappy_psi.ultrasound.Roi',
description=description, **kwds)
kwds.update({c: name + c for c in components})
Mod(name,
main='u',
time=time,
size=size,
enable=enable,
**kwds,
)
for c in components:
Mod(name + c,
'frappy.modules.Readable',
f'{name}{c} component',
)
# control loop
roi('roi0', 2450, 300, freq='f', maxstep=100000, minstep=4000)
# other rois
roi('roi1', 5950, 300)
roi('roi2', 9475, 300)
roi('roi3', 12900, 300)
#roi('roi4', 400, 30, False)
#roi('roi5', 400, 30, False)
#roi('roi6', 400, 30, False)
#roi('roi7', 400, 30, False)
#roi('roi8', 400, 30, False)
#roi('roi9', 400, 30, False)
Mod('delay',
'frappy_psi.dg645.Delay',
'delay line with 2 channels',
uri='serial:///dev/ttyS2',
on1=1e-09,
on2=1e-09,
off1=4e-07,
off2=6e-07,
)

View File

@ -1,24 +0,0 @@
Node('QnwTC1test.psi.ch',
'QnwTC1 test',
'tcp://5000',
)
Mod('io',
'frappy_psi.qnw.QnwIO',
'connection for Quantum northwest',
uri='tcp://ldm-fi-ts:3001',
)
Mod('T',
'frappy_psi.qnw.TemperatureLoopTC1',
'holder temperature',
channel='CT',
io='io',
)
Mod('Th',
'frappy_psi.qnw.SensorTC1',
'heat exch. temperature',
channel='HT',
io='io',
)

View File

@ -1,39 +0,0 @@
Node(equipment_id = 'r_ultrasound.psi.ch',
description = 'resonant ultra sound setup',
interface = 'tcp://5000',
)
Mod('iq',
cls = 'frappy_psi.ultrasound.RUS',
description = 'ultrasound iq mesurement',
imod = 'i',
qmod = 'q',
freq='f',
input_range=10, # VPP
input_delay = 0,
periods = 163,
)
Mod('freqio',
'frappy_psi.ultrasound.FreqStringIO',
' ',
uri = 'serial:///dev/ttyS1?baudrate=57600',
)
Mod('f',
cls = 'frappy_psi.ultrasound.Frequency',
description = 'ultrasound frequency',
io='freqio',
output='L', # L for LF (bnc), R for RF (type N)
target=10000,
)
Mod('i',
cls='frappy.modules.Readable',
description='I component',
)
Mod('q',
cls='frappy.modules.Readable',
description='Q component',
)

View File

@ -1,19 +0,0 @@
Node('TFA10.psi.ch',
'TFA10 test',
'tcp://5000',
)
Mod('io',
'frappy_psi.thermofisher.ThermFishIO',
'connection for ThermoFisher A10',
uri='tcp://ldm-fi-ts:3002',
)
Mod('T',
'frappy_psi.thermofisher.TemperatureLoopA10',
'holder temperature',
io='io',
target=Param(max=100),
tolerance=0.5,
settling_time=20,
)

View File

@ -1,4 +0,0 @@
[FRAPPY]
confdir = ~/frappy/cfg/addons:~/frappy/cfg/develop
logdir = ~/frappylog
piddir = ~/frappylog/pid

View File

@ -1,37 +0,0 @@
Node('ah2550.addon.sea.psi.ch',
'Andeen Hagerlin 2550 Capacitance Bridge using SEA',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'SEA connection to mbe_ah2550',
config='ah2550.addon',
export=False,
service='addons',
)
Mod('ah',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='cap',
extra_modules = ['cap', 'loss']
)
Mod('cap',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='ah.cap',
value=Param(fmtstr='%.12g'),
)
Mod('loss',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='ah.loss',
)
Mod('capslope',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='capslope',
)

13
cfg/addons/ah2700.cfg Normal file
View File

@ -0,0 +1,13 @@
[NODE]
description = Andeen Hagerlin 2700 Capacitance Bridge
id = ah2700.frappy.psi.ch
[module cap]
class = secop_psi.ah2700.Capacitance
description = capacitance
uri=lollypop-ts:3002
#[module ahcom]
#class = secop_psi.ah2700.StringIO
#uri=ldmse3-ts:3015
#description = serial communicator to an AH2700

View File

@ -1,22 +0,0 @@
Node('ah2700.frappy.psi.ch',
'Andeen Hagerlin 2700 Capacitance Bridge',
)
Mod('cap_io',
'frappy_psi.ah2700.Ah2700IO',
'',
uri='linse-976d-ts:3006',
)
Mod('cap',
'frappy_psi.ah2700.Capacitance',
'capacitance',
io = 'cap_io',
)
Mod('loss',
'frappy_psi.parmod.Par',
'loss parameter',
read='cap.loss',
unit='deg',
)

20
cfg/addons/ah2700sea.cfg Normal file
View File

@ -0,0 +1,20 @@
[NODE]
description = Andeen Hagerlin 2700 Capacitance Bridge using SEA
id = ah2700.addon.sea.psi.ch
[sea_addons]
class = secop_psi.sea.SeaClient
description = SEA connection to mbe_ah2700
config = ah2700.addon
export = False
service = addons
[cap]
class = secop_psi.sea.SeaReadable
iodev = sea_addons
sea_object = cap
[capslope]
class = secop_psi.sea.SeaReadable
iodev = sea_addons
sea_object = capslope

View File

@ -1,39 +0,0 @@
Node('ah2700.addon.sea.psi.ch',
'Andeen Hagerlin 2700 Capacitance Bridge using SEA',
)
sea_cfg='ah2700.addon'
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'SEA connection to mbe_ah2700',
config='ah2700.addon',
export=False,
service='addons',
)
Mod('ah',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='cap',
extra_modules = ['cap', 'loss']
)
Mod('cap',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='ah.cap',
value=Param(fmtstr='%.12g'),
)
Mod('loss',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='ah.loss',
)
Mod('capslope',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='capslope',
)

View File

@ -1,16 +0,0 @@
Node('be-filter-boa.addon.sea.psi.ch',
'CryoTel be-filter BOA',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'addons sea connection for be-filter-boa.addon',
config='be-filter-boa.addon',
service='addons',
)
Mod('befilter',
'frappy_psi.sea.SeaReadable', '',
sea_object='befilter',
io='sea_addons',
)

View File

@ -1,49 +0,0 @@
Node('cfg/sea/camea-be-filter.cfg',
'Camea Be-Filter',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'addons sea connection for camea-be-filter.addon',
config='camea-be-filter.addon',
service='addons',
)
Mod('t_be_filter',
'frappy_psi.sea.SeaReadable',
'Be filter T',
io='sea_addons',
sea_object='t_be_filter',
extra_modules=['a', 'b', 'c', 'd', 'det'],
)
Mod('t_be_fil_top_m',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='t_be_filter.a',
)
Mod('t_be_fil_top_r',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='t_be_filter.b',
)
Mod('t_be_fil_bot_l',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='t_be_filter.c',
)
Mod('t_be_fil_bot_r',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='t_be_filter.d',
)
Mod('t_detector',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
single_module='t_be_filter.det',
)

View File

@ -1,56 +0,0 @@
Node('flamesample.psi.ch',
'flame sample thermometers and heater',
interface = 'tcp://5000',
)
Mod('lscio',
'frappy_psi.ls372.StringIO',
'sample channels LS372 io',
uri = 'flamedil-ls.psi.ch:7777',
)
Mod('lsc_channel',
'frappy_psi.ls372.Switcher',
'channel switcher sample ls372',
io='lscio',
value = 3,
)
Mod('ts_low',
'frappy_psi.ls372.TemperatureLoop',
'sample RuOX',
channel = 3,
switcher = 'lsc_channel',
minrange=13,
range=22,
tolerance = 0.1,
vexc = 3,
htrrng=4,
)
Mod('ts_high',
'frappy_psi.ls372.TemperatureLoop',
'sample Cernox',
channel = 1,
switcher = 'lsc_channel',
minrange=11,
vexc = 5,
range=22,
tolerance = 0.1,
htrrng=5,
minheater=5e-4,
)
Mod('ts',
'frappy_psi.parmod.SwitchDriv',
'automatically switching between ts_low and ts_high',
meaning=['temperature', 40],
value=Param(unit='K'),
low='ts_low',
high='ts_high',
#min_high=0.6035,
#max_low=1.6965,
min_high=0.6,
max_low=1.7,
tolerance=0.1,
)

View File

@ -0,0 +1,14 @@
[NODE]
description = FOCUS Beryllium filter with cryotel closed cycle
id = focus-be-filter.addon.sea.psi.ch
[sea_addons]
class = secop_psi.sea.SeaClient
description = SEA connection to addons
config = focus-be-filter.addon
service = addons
[befilter]
class = secop_psi.sea.SeaReadable
iodev = sea_addons
sea_object = cryo

View File

@ -1,16 +0,0 @@
Node('focus-be-filter.addon.sea.psi.ch',
'FOCUS Beryllium filter with cryotel closed cycle',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'SEA connection to addons',
config='focus-be-filter.addon',
service='addons',
)
Mod('befilter',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='cryo',
)

View File

@ -1,26 +0,0 @@
Mod('lsc',
'frappy.io.StringIO',
'',
wait_before=0.05,
uri='flamedil-ls:7777',
)
Mod('r1',
'frappy_psi.ls372.ResChannel',
'resistivity from LS 372',
switcher='channel',
channel=1,
)
Mod('r3',
'frappy_psi.ls372.ResChannel',
'resistivity from LS 372',
switcher='channel',
channel=3,
)
Mod('channel',
'frappy_psi.ls372.Switcher',
'LS 372 channel switcher',
io='lsc',
)

View File

@ -1,34 +0,0 @@
Node('cfg/addons/razorbill.cfg',
'razorbill forwarder',
)
Mod('sea_addons',
'frappy_psi.sea.SeaClient',
'SEA stick connection',
config='razorbill.addon',
service='addons',
)
Mod('ts',
'frappy_psi.sea.SeaReadable', '',
io='sea_addons',
sea_object='tt',
json_file='ori6.config.json',
rel_paths=['ts'],
)
Mod('T_remote',
'frappy.proxy.Proxy',
'dummy (remote) T',
remote_class = 'frappy_psi.dummy.Temp',
uri='razorbill:3000',
module='T',
# export=False,
)
Mod('forwarder',
'frappy_psi.dummy.Forwarder',
'forwarder',
src='ts',
dst='T_remote')

View File

@ -1,28 +0,0 @@
Node('srs830.ppms.psi.ch',
'',
interface='tcp://5000',
)
Mod('b',
'frappy_psi.SR830.XY',
'signal from Stanford Rasearch lockin',
uri='linse-976d-ts:3002',
)
Mod('bx',
'frappy_psi.parmod.Comp',
'x-comp',
read='b.value[0]',
unit='V',
)
Mod('by',
'frappy_psi.parmod.Comp',
'y-comp',
read='b.value[1]',
unit='V',
)
Mod('bf',
'frappy_psi.parmod.Par',
'lockin frequency',
read='b.freq',
unit='Hz',
)

View File

@ -1,17 +0,0 @@
Node('stickmotor.linse.psi.ch',
'mobile rotation stage (from MA02)',
)
Mod('stick_io',
'frappy_psi.phytron.PhytronIO',
'dom motor IO',
uri='ldmcc08-ts:3006',
)
Mod('stickrot',
'frappy_psi.phytron.Motor',
'stick rotation, typically not used as omega',
io='stick_io',
encoder_mode='CHECK',
backlash=-1,
)

View File

@ -1,44 +0,0 @@
Node('k2601b.psi.ch',
'source meter keithley 2601b',
interface='tcp://5000',
)
Mod('vsource_io',
'frappy_psi.k2601b.K2601bIO',
'source meter',
# uri = '129.129.156.90:5025',
uri = "sans-sample-ts:3011"
)
Mod('source',
'frappy_psi.k2601b.SourceMeter'
'',
description = "keithley sourcemeter",
mode = 1,
vlimit = 6.0,
ilimit = 2.,
io = 'vsource_io',
)
Mod('volt',
'frappy_psi.k2601b.Voltage'
'',
description = "Voltage Source",
active = True,
limit = 5.0,
target = 0.0,
sourcemeter = 'source',
io = 'vsource_io',
)
Mod('cur',
'frappy_psi.k2601b.Current'
'',
description = "Current Source",
active = False,
limit = 0.10,
target = 0.0,
sourcemeter = 'source',
io = 'vsource_io',
)

17
cfg/ah2700test.cfg Normal file
View File

@ -0,0 +1,17 @@
[node AH2700Test.psi.ch]
description = AH2700 capacitance bridge test
[interface tcp]
type = tcp
bindto = 0.0.0.0
bindport = 5000
[module cap]
class = secop_psi.ah2700.Capacitance
description = capacitance
uri=ldmse3-ts:3015
#[module ahcom]
#class = secop_psi.ah2700.StringIO
#uri=ldmse3-ts:3015
#description = serial communicator to an AH2700

View File

@ -1,10 +0,0 @@
Node('AH2700Test.psi.ch',
'AH2700 capacitance bridge test',
'tcp://5000',
)
Mod('cap',
'frappy_psi.ah2700.Capacitance',
'capacitance',
uri='ldmse3-ts:3015',
)

111
cfg/amagnet.cfg Normal file
View File

@ -0,0 +1,111 @@
[node MLZ_amagnet(Garfield)]
description=MLZ-Amagnet
.
Water cooled magnet from ANTARES@MLZ.
.
Use module to control the magnetic field.
Don't forget to select symmetry first (can be moved only at zero field!).
.
Monitor T1..T4 (Coil temps), if they get to hot, field will ramp down!
.
In case of Problems, contact the ANTARES people at MLZ.
visibility=expert
foo=bar
[interface tcp]
type=tcp
bindto=0.0.0.0
bindport=10767
[module enable]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice='tango://localhost:10000/box/plc/_enable'
value.datatype=["enum", {'On':1,'Off':0}]
target.datatype=["enum", {'On':1,'Off':0}]
.description='Enables to Output of the Powersupply'
.visibility='advanced'
[module polarity]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_polarity
value.datatype=["enum", {'+1':1,'0':0,'-1':-1}]
target.datatype=["enum", {'+1':1,'0':0,'-1':-1}]
.description=polarity (+/-) switch
.
there is an interlock in the plc:
if there is current, switching polarity is forbidden
if polarity is short, powersupply is disabled
.visibility=advanced
comtries=50
[module symmetry]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_symmetric
value.datatype=["enum",{'symmetric':1,'short':0, 'asymmetric':-1}]
target.datatype=["enum",{'symmetric':1,'short':0, 'asymmetric':-1}]
.description=par/ser switch selecting (a)symmetric mode
.
symmetric is ser, asymmetric is par
.visibility=advanced
[module T1]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_t1
.description=Temperature1 of the coils system
#warnlimits=(0, 50)
value.unit='degC'
[module T2]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_t2
.description=Temperature2 of the coils system
#warnlimits=(0, 50)
value.unit='degC'
[module T3]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_t3
.description=Temperature3 of the coils system
#warnlimits=(0, 50)
value.unit='degC'
[module T4]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_t4
.description=Temperature4 of the coils system
#warnlimits=(0, 50)
value.unit='degC'
[module currentsource]
class=secop_mlz.entangle.PowerSupply
tangodevice=tango://localhost:10000/box/lambda/curr
.description=Device for the magnet power supply (current mode)
abslimits=(0,200)
speed=1
ramp=60
precision=0.02
current=0
voltage=10
#unit=A
.visibility=advanced
[module mf]
class=secop_mlz.amagnet.GarfieldMagnet
.description=magnetic field module, handling polarity switching and stuff
subdev_currentsource=currentsource
subdev_enable=enable
subdev_polswitch=polarity
subdev_symmetry=symmetry
target.unit='T'
value.unit='T'
userlimits=(-0.35, 0.35)
calibrationtable={'symmetric':[0.00186517, 0.0431937, -0.185956, 0.0599757, 0.194042],
'short': [0.0, 0.0, 0.0, 0.0, 0.0],
'asymmetric':[0.00136154, 0.027454, -0.120951, 0.0495289, 0.110689]}
.meaning=The magnetic field
.priority=100
.visibility=user
abslimits.default=-0.4,0.4

View File

@ -1,91 +0,0 @@
Node('MLZ_amagnet(Garfield)',
'MLZ-Amagnet\n'
'\n'
'Water cooled magnet from ANTARES@MLZ.\n'
'\n'
'Use module to control the magnetic field.\n'
'Don\'t forget to select symmetry first (can be moved only at zero field!).\n'
'\n'
'Monitor T1..T4 (Coil temps), if they get to hot, field will ramp down!\n'
'\n'
'In case of Problems, contact the ANTARES people at MLZ.',
'tcp://10767',
visibility = 'expert',
foo = 'bar',
)
Mod('enable',
'frappy_mlz.entangle.NamedDigitalOutput',
'Enables to Output of the Powersupply',
tangodevice = 'tango://localhost:10000/box/plc/_enable',
value = Param(datatype=["enum", {'On':1,'Off':0}]),
target = Param(datatype=["enum", {'On':1,'Off':0}]),
visibility = 'advanced',
)
Mod('polarity',
'frappy_mlz.entangle.NamedDigitalOutput',
'polarity (+/-) switch\n'
'\n'
'there is an interlock in the plc:\n'
'if there is current, switching polarity is forbidden\n'
'if polarity is short, powersupply is disabled',
tangodevice = 'tango://localhost:10000/box/plc/_polarity',
value = Param(datatype=["enum", {'+1':1,'0':0,'-1':-1}]),
target = Param(datatype=["enum", {'+1':1,'0':0,'-1':-1}]),
visibility = 'advanced',
comtries = 50,
)
Mod('symmetry',
'frappy_mlz.entangle.NamedDigitalOutput',
'par/ser switch selecting (a)symmetric mode\n'
'\n'
'symmetric is ser, asymmetric is par',
tangodevice = 'tango://localhost:10000/box/plc/_symmetric',
value = Param(datatype=["enum",{'symmetric':1,'short':0, 'asymmetric':-1}]),
target = Param(datatype=["enum",{'symmetric':1,'short':0, 'asymmetric':-1}]),
visibility = 'advanced',
)
for i in range(1,5):
Mod('T%d' % i,
'frappy_mlz.entangle.AnalogInput',
'Temperature %d of the coils system' % i,
tangodevice = 'tango://localhost:10000/box/plc/_t%d' % i,
#warnlimits=(0, 50),
value = Param(unit='degC'),
)
Mod('currentsource',
'frappy_mlz.entangle.PowerSupply',
'Device for the magnet power supply (current mode)',
tangodevice = 'tango://localhost:10000/box/lambda/curr',
abslimits = (0,200),
speed = 1,
ramp = 60,
precision = 0.02,
current = 0,
voltage = 10,
#value=Param(unit='A')
visibility = 'advanced',
)
Mod('mf',
'frappy_mlz.amagnet.GarfieldMagnet',
'magnetic field module, handling polarity switching and stuff',
currentsource = 'currentsource',
enable = 'enable',
polswitch = 'polarity',
symmetry = 'symmetry',
target = Param(unit='T'),
value = Param(unit='T'),
userlimits = (-0.35, 0.35),
calibrationtable = {'symmetric':[0.00186517, 0.0431937, -0.185956, 0.0599757, 0.194042],
'short': [0.0, 0.0, 0.0, 0.0, 0.0],
'asymmetric':[0.00136154, 0.027454, -0.120951, 0.0495289, 0.110689]},
meaning = ['The magnetic field', 1],
#priority=100,
visibility = 'user',
abslimits = (-0.4,0.4,),
)

View File

@ -1,19 +0,0 @@
Node('attocube_test.psi.ch',
'a single attocube axis',
interface='tcp://5000',
)
Mod('r',
'frappy_psi.attocube.Axis',
'ANRv220-F3-02882',
axis = 1,
value = Param(unit='deg'),
tolerance = 0.1,
target_min = 0,
target_max = 360,
steps_fwd = 45,
steps_bwd = 85,
step_mode = True,
# gear = 1.2,
)

150
cfg/ccr.cfg Normal file
View File

@ -0,0 +1,150 @@
[node MLZ_ccr12]
description = CCR box of MLZ Sample environment group
.
Contains a Lakeshore 336 and an PLC controlling the compressor
and some valves.
[interface tcp]
type=tcp
bindto=0.0.0.0
bindport=10767
[module automatik]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_automatik
mapping=dict(Off=0,p1=1,p2=2)
description="controls the (simple) pressure regulation
.
selects between off, regulate on p1 or regulate on p2 sensor"
[module compressor]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_cooler_onoff
mapping=dict(Off=0,On=1)
description=control the compressor (on/off)
[module gas]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_gas_onoff
mapping=dict(Off=0,On=1)
description=control the gas inlet into the ccr (on/off)
.
note: this switches off automatically after 15 min.
note: activation de-activates the vacuum inlet
note: if the pressure regulation is active, it enslave this device
[module vacuum]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/plc/_vacuum_Onoff
mapping=dict(Off=0,On=1)
description=control the vacuum inlet into the ccr (on/off)
.
note: activation de-activates the gas inlet
note: if the pressure regulation is active, it enslave this device
[module p1]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_p1
value.unit='mbar'
description=pressure sensor 1 (linear scale)
[module p2]
class=secop_mlz.entangle.AnalogInput
tangodevice=tango://localhost:10000/box/plc/_p2
value.unit='mbar'
description=pressure sensor 2 (selectable curve)
[module curve_p2]
class=secop_mlz.entangle.NamedDigitalInput
tangodevice=tango://localhost:10000/box/plc/_curve
value.default=0
description=calibration curve for pressure sensor 2
mapping="{'0-10V':0, '0-1000mbar':1, '1-9V to 0-1 mbar':2,
'DI200':3, 'DI2000':4, 'TTR100':7, 'PTR90':8,
'PTR225/237':9, 'ITR90':10, 'ITR100-D':11,
'ITR100-2':12, 'ITR100-3':13, 'ITR100-4':14,
'ITR100-5':15, 'ITR100-6':16, 'ITR100-7':17,
'ITR100-8':18, 'ITR100-9':19, 'ITR100-A':20,
'CMR361':21, 'CMR362':22, 'CMR363':23,
'CMR364':24, 'CMR365':25}"
# sensors
[module T_sample]
class=secop_mlz.entangle.Sensor
tangodevice=tango://localhost:10000/box/sample/sensora
value.unit='K'
description=sample temperature
[module T_stick]
class=secop_mlz.entangle.Sensor
tangodevice=tango://localhost:10000/box/stick/sensorb
value.unit='K'
description=temperature at bottom of sample stick
[module T_coldhead]
class=secop_mlz.entangle.Sensor
tangodevice=tango://localhost:10000/box/coldhead/sensorc
value.unit='K'
description=temperature at coldhead
[module T_tube]
class=secop_mlz.entangle.Sensor
tangodevice=tango://localhost:10000/box/tube/sensord
value.unit='K'
description=temperature at thermal coupling tube <-> stick
# regulations
[module T_stick_regulation]
class=secop_mlz.entangle.TemperatureController
tangodevice=tango://localhost:10000/box/stick/control2
heateroutput.default=0
description=regulation of stick temperature
ramp.default=6
speed.default=0.1
setpoint.default=0
pid.default=(40,10,1)
p.default=40
i.default=10
d.default=1
abslimits=(0,500)
value.unit='K'
# OMG! a NamedDigitalOutput, but with float'ints' 0..3
[module T_stick_regulation_heaterrange]
class=secop_mlz.entangle.AnalogOutput
tangodevice=tango://localhost:10000/box/stick/range2
precision.default=1
abslimits=(0,3)
description=heaterrange for stick regulation
[module T_tube_regulation]
class=secop_mlz.entangle.TemperatureController
tangodevice=tango://localhost:10000/box/tube/control1
description=regulation of tube temperature
heateroutput.default=0
ramp.default=6
speed.default=0.1
setpoint.default=0
pid.default=(40,10,1)
p.default=40
i.default=10
d.default=1
abslimits=(0,500)
value.unit='K'
# OMG! a NamedDigitalOutput, but with float'ints' 0..3
#[module T_tube_regulation_heaterrange]
#class=secop_mlz.entangle.AnalogOutput
#tangodevice=tango://localhost:10000/box/tube/range1
#precision.default=1
#abslimits=(0,3)
[module T_tube_regulation_heaterrange]
class=secop_mlz.entangle.NamedDigitalOutput
tangodevice=tango://localhost:10000/box/tube/range1
mapping=dict(Off=0, Low=1, Medium=2, High=3)
description=heaterrange for tube regulation

View File

@ -1,148 +0,0 @@
desc = '''CCR box of MLZ Sample environment group
Contains a Lakeshore 336 and an PLC controlling the compressor
and some valves.'''
Node('MLZ_ccr',
desc,
'tcp://10767',
)
Mod('automatik',
'frappy_mlz.entangle.NamedDigitalOutput',
'controls the (simple) pressure regulation\n'
'\n'
'selects between off, regulate on p1 or regulate on p2 sensor',
tangodevice = 'tango://localhost:10000/box/plc/_automatik',
mapping={'Off':0,'p1':1,'p2':2},
)
Mod('compressor',
'frappy_mlz.entangle.NamedDigitalOutput',
'control the compressor (on/off)',
tangodevice = 'tango://localhost:10000/box/plc/_cooler_onoff',
mapping={'Off':0,'On':1},
)
Mod('gas',
'frappy_mlz.entangle.NamedDigitalOutput',
'control the gas inlet into the ccr (on/off)\n'
'\n'
'note: this switches off automatically after 15 min.\n'
'note: activation de-activates the vacuum inlet\n'
'note: if the pressure regulation is active, it enslave this device',
tangodevice = 'tango://localhost:10000/box/plc/_gas_onoff',
mapping={'Off':0,'On':1},
)
Mod('vacuum',
'frappy_mlz.entangle.NamedDigitalOutput',
'control the vacuum inlet into the ccr (on/off)\n'
'\n'
'note: activation de-activates the gas inlet\n'
'note: if the pressure regulation is active, it enslave this device',
tangodevice = 'tango://localhost:10000/box/plc/_vacuum_onoff',
mapping={'Off':0,'On':1},
)
Mod('p1',
'frappy_mlz.entangle.AnalogInput',
'pressure sensor 1 (linear scale)',
tangodevice = 'tango://localhost:10000/box/plc/_p1',
value = Param(unit='mbar')
)
Mod('p2',
'frappy_mlz.entangle.AnalogInput',
'pressure sensor 2 (selectable curve)',
tangodevice = 'tango://localhost:10000/box/plc/_p2',
value = Param(unit='mbar'),
)
Mod('curve_p2',
'frappy_mlz.entangle.NamedDigitalInput',
'calibration curve for pressure sensor 2',
tangodevice = 'tango://localhost:10000/box/plc/_curve',
value = 0,
mapping = {'0-10V':0, '0-1000mbar':1, '1-9V to 0-1 mbar':2,
'DI200':3, 'DI2000':4, 'TTR100':7, 'PTR90':8,
'PTR225/237':9, 'ITR90':10, 'ITR100-D':11,
'ITR100-2':12, 'ITR100-3':13, 'ITR100-4':14,
'ITR100-5':15, 'ITR100-6':16, 'ITR100-7':17,
'ITR100-8':18, 'ITR100-9':19, 'ITR100-A':20,
'CMR361':21, 'CMR362':22, 'CMR363':23,
'CMR364':24, 'CMR365':25},
)
Mod('T_tube_regulation',
'frappy_mlz.entangle.TemperatureController',
'regulation of tube temperature',
tangodevice = 'tango://localhost:10000/box/tube/control1',
value = Param(unit = 'K'),
heateroutput = 0,
ramp = 6,
speed = 0.1,
setpoint = 0,
pid = (40, 10, 1),
p = 40,
i = 10,
d = 1,
abslimits = (0, 500),
)
Mod('T_stick_regulation',
'frappy_mlz.entangle.TemperatureController',
'regualtion of stick temperature',
tangodevice = 'tango://localhost:10000/box/stick/control2',
value = Param(unit = 'K'),
heateroutput = 0,
ramp = 6,
speed = 0.1,
setpoint = 0,
pid = (40, 10, 1),
p = 40,
i = 10,
d = 1,
abslimits = (0, 500),
)
Mod('T_sample',
'frappy_mlz.entangle.Sensor',
'sample temperature',
tangodevice = 'tango://localhost:10000/box/sample/sensora',
value = Param(unit = 'K'),
)
Mod('T_stick',
'frappy_mlz.entangle.Sensor',
'temperature at bottom of sample stick',
tangodevice = 'tango://localhost:10000/box/stick/sensorb',
value = Param(unit = 'K'),
)
Mod('T_coldhead',
'frappy_mlz.entangle.Sensor',
'temperature at coldhead',
tangodevice = 'tango://localhost:10000/box/coldhead/sensorc',
value = Param(unit = 'K'),
)
Mod('T_tube',
'frappy_mlz.entangle.Sensor',
'temperature at thermal coupling tube <-> stick',
tangodevice = 'tango://localhost:10000/box/tube/sensord',
value = Param(unit = 'K'),
)
# THIS IS A HACK: due to entangle (in controller)
Mod('T_tube_regulation_heaterrange',
'frappy_mlz.entangle.NamedDigitalOutput',
'heaterrange for tube regulation',
tangodevice = 'tango://localhost:10000/box/tube/range1',
mapping={'Off':0,'Low':1,'Medium':2, 'High':3},
)
Mod('T_stick_regulation_heaterrange',
'frappy_mlz.entangle.NamedDigitalOutput',
'heaterrange for stick regulation',
tangodevice = 'tango://localhost:10000/box/stick/range2',
mapping={'Off':0,'Low':1,'Medium':2, 'High':3},
)

50
cfg/cryo.cfg Normal file
View File

@ -0,0 +1,50 @@
[node cryo_7]
# set SEC-node properties
description = short description
.
This is a very long description providing all the glory details in all the glory details about the stuff we are describing
[interface tcp]
type=tcp
bindto=0.0.0.0
bindport=10769
[module cryo]
# some (non-defaut) module properties
.group=very important/stuff
.description=A simulated cc cryostat with heat-load, specific heat for the sample
and a temperature dependend heat-link between sample and regulation.
# class of module:
class=secop_demo.cryo.Cryostat
# some parameters
jitter=0.1
T_start=10.0
target=10.0
looptime=1
ramp=6
maxpower=20.0
heater=4.1
p=40
i=10
d=2
mode=pid
tolerance=0.1
window=30
timeout=900
# some (non-default) parameter properties
pollinterval.export=False
# some parameter grouping
p.group=pid
i.group=pid
d.group=pid
value.unit=K
# test custom properties
value.test=customized value

View File

@ -1,35 +0,0 @@
#####################################################################
# Python version of frappy config
#####################################################################
Node('cryo_7.frappy.demo',
'short description\n\n'
'This is a very long description providing all the gory details '
'about the stuff we are describing.',
'tcp://10769',
more="blub",
)
Mod('cryo',
'frappy_demo.cryo.Cryostat',
'A simulated cc cryostat with heat-load, specific heat for the sample and a '
'temperature dependent heat-link between sample and regulation.',
group='very important/stuff',
jitter=0.1,
T_start=10.0,
target=10.0,
looptime=1,
ramp=6,
maxpower=20.0,
heater=4.1,
mode='pid',
tolerance=0.1,
window=30,
timeout=900,
p = Param(40, unit='%/K'), # in case 'default' is the first arg, we can omit 'default='
i = 10,
d = 2,
pid = Group('p', 'i', 'd'),
pollinterval = Param(export=False),
value = Param(unit = 'K', test = 'customized value'),
)

43
cfg/demo.cfg Normal file
View File

@ -0,0 +1,43 @@
[node Equipment_ID_for_demonstration]
description = virtual modules to play around with
[interface tcp]
bindto=0.0.0.0
bindport=10767
[module heatswitch]
class=secop_demo.modules.Switch
switch_on_time=5
switch_off_time=10
.description="Heatswitch for `mf` device"
[module mf]
class=secop_demo.modules.MagneticField
heatswitch = heatswitch
.description="simulates some cryomagnet with persistent/non-persistent switching"
[module ts]
class=secop_demo.modules.SampleTemp
sensor = 'Q1329V7R3'
ramp = 4
target = 10
value = 10
.description = "some temperature"
[module tc1]
class=secop_demo.modules.CoilTemp
sensor="X34598T7"
.description = "some temperature"
[module tc2]
class=secop_demo.modules.CoilTemp
sensor="X39284Q8'
.description = "some temperature"
[module label]
class=secop_demo.modules.Label
system=Cryomagnet MX15
subdev_mf=mf
subdev_ts=ts
.description = "some label indicating the state of the magnet `mf`."

View File

@ -1,46 +0,0 @@
Node('demo.frappy.demo',
'Basic demo server for frappy',
'tcp://10767',
)
Mod('heatswitch',
'frappy_demo.modules.Switch',
'Heatswitch for `mf` device',
switch_on_time = 5,
switch_off_time = 10,
)
Mod('mf',
'frappy_demo.modules.MagneticField',
'simulates some cryomagnet with persistent/non-persistent switching',
heatswitch = 'heatswitch',
)
Mod('ts',
'frappy_demo.modules.SampleTemp',
'some temperature',
sensor = 'Q1329V7R3',
ramp = 4,
target = 10,
value = 10,
)
Mod('tc1',
'frappy_demo.modules.CoilTemp',
'some temperature',
sensor = 'X34598T7',
)
Mod('tc2',
'frappy_demo.modules.CoilTemp',
'some temperature',
sensor = 'X39284Q8',
)
Mod('label',
'frappy_demo.modules.Label',
'some label indicating the state of the magnet `mf`.',
system = 'Cryomagnet MX15',
mf = 'mf',
ts = 'ts',
)

8
cfg/develop/sea.cfg Normal file
View File

@ -0,0 +1,8 @@
[NODE]
description = sea client (communication only)
id = comm.sea.psi.ch
[seaconn]
class = secop_psi.sea.SeaClient
description = a SEA connection
visibility = 1

View File

@ -1,9 +0,0 @@
Node('comm.sea.psi.ch',
'sea client (communication only)',
)
Mod('seaconn',
'frappy_psi.sea.SeaClient',
'a SEA connection',
visibility='expert',
)

8
cfg/develop/seadesc.cfg Normal file
View File

@ -0,0 +1,8 @@
[NODE]
description = sea client (communication only)
id = comm.sea.psi.ch
[seaconn]
class = secop_psi.sea.SeaConfigCreator
description = a SEA connection. will shut down after getting the description
visibility = 1

View File

@ -1,11 +0,0 @@
# error creating module seaconn:
# missing sea port for seadesc
Node('comm.sea.psi.ch',
'sea client (tool for creating cfg)',
)
Mod('seaconn',
'frappy_psi.sea.SeaConfigCreator',
'a SEA connection. will shut down after getting the description',
visibility=1,
)

View File

@ -1,317 +0,0 @@
Node('LOGO.psi.ch',
'LOGO',
interface='tcp://5010',
secondary = ['ws://8010']
)
Mod('io',
'frappy_psi.logo.IO',
'',
ip_address = "192.168.0.3",
tcap_client = 0x3000,
tsap_server = 0x2000
)
Mod('V1',
'frappy_psi.logo.Valve',
'Valves',
io = 'io',
vm_address_input ="V1025.0",
vm_address_output ="V1064.3"
)
Mod('V2',
'frappy_psi.logo.Valve',
'Valves',
io = 'io',
vm_address_input ="V1024.2",
vm_address_output ="V1064.5"
)
Mod('V4',
'frappy_psi.logo.Valve',
'Valves',
io = 'io',
vm_address_input ="V1024.5",
vm_address_output ="V1064.5"
)
Mod('V5',
'frappy_psi.logo.Valve',
'Valves',
io = 'io',
vm_address_input ="V1024.4",
vm_address_output ="V1064.2"
)
Mod('V9',
'frappy_psi.logo.Valve',
'Valves',
io = 'io',
vm_address_input ="V1024.3",
vm_address_output ="V404.1"
)
Mod('pump',
'frappy_psi.logo.FluidMachines',
'Pump',
io = 'io',
vm_address_output ="V414.1"
)
Mod('compressor',
'frappy_psi.logo.FluidMachines',
'Compressor',
io = 'io',
vm_address_output ="V400.1"
)
Mod('p2',
'frappy_psi.logo.Pressure',
'Pressure in mBar',
io = 'io',
vm_address ="VW0",
)
Mod('p1',
'frappy_psi.logo.Pressure',
'Pressure in mBar',
io = 'io',
vm_address ="VW2",
)
Mod('p5',
'frappy_psi.logo.Pressure',
'Pressure in mBar',
io = 'io',
vm_address ="VW4",
)
Mod('Druckluft',
'frappy_psi.logo.Airpressure',
'Airpressure state',
io = 'io',
vm_address ="VW6",
)
Mod('SF1',
'frappy_psi.logo.safetyfeatureState',
'Safety Feature',
io = 'io',
vm_address ="V410.1",
)
Mod('SF2',
'frappy_psi.logo.safetyfeatureState',
'Safety Feature',
io = 'io',
vm_address ="V406.1",
)
Mod('SF3',
'frappy_psi.logo.safetyfeatureState',
'Safety Feature',
io = 'io',
vm_address ="V408.1",
)
Mod('SF4',
'frappy_psi.logo.safetyfeatureState',
'Safety Feature',
io = 'io',
vm_address ="V412.1",
)
Mod('p2max',
'frappy_psi.logo.safetyfeatureParam',
'Safety Feature Param',
io = 'io',
vm_address ="VW8",
)
Mod('pcond',
'frappy_psi.logo.safetyfeatureParam',
'Safety Feature Param',
io = 'io',
vm_address ="VW10",
)
Mod('p5min',
'frappy_psi.logo.safetyfeatureParam',
'Safety Feature Param',
io = 'io',
vm_address ="VW12",
)
Mod('p5max',
'frappy_psi.logo.safetyfeatureParam',
'Safety Feature Param',
io = 'io',
vm_address ="VW14",
)
"""
Mod('io_ls273',
'frappy_psi.ls372.StringIO',
'io for Ls372',
uri = 'localhost:2089',
)
Mod('sw',
'frappy_psi.ls372.Switcher',
'channel switcher',
io = 'io_ls273',
)
Mod('res1',
'frappy_psi.ls372.ResChannel',
'resistivity chan 1',
vexc = '2mV',
channel = 1,
switcher = 'sw',
)
"""
Mod('io_pfeiffer',
'frappy_psi.pfeiffer_new.PfeifferProtocol',
'',
uri='serial:///dev/ttyUSB0?baudrate=9600+parity=none+bytesize=8+stopbits=1',
)
Mod('io_turbo',
'frappy_psi.pfeiffer_new.PfeifferProtocol',
'',
uri='serial:///dev/ttyUSB1?baudrate=9600+parity=none+bytesize=8+stopbits=1',
)
Mod('p3',
'frappy_psi.pfeiffer_new.RPT200',
'Pressure in HPa',
io = 'io_pfeiffer',
address= 2,
)
Mod('p4',
'frappy_psi.pfeiffer_new.RPT200',
'Pressure in HPa',
io = 'io_pfeiffer',
address= 4
)
Mod('turbopump',
'frappy_psi.pfeiffer_new.TCP400',
'Pfeiffer Turbopump',
io = 'io_turbo',
address= 1
)
Mod('MV10',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV10'
)
Mod('MV13',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV13'
)
Mod('MV8',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV8'
)
Mod('MVB',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MVB'
)
Mod('MV2',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV2'
)
Mod('MV1',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV1'
)
Mod('MV3a',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV3a'
)
Mod('MV3b',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV3b'
)
Mod('GV1',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve GV1'
)
Mod('GV2',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve GV2'
)
Mod('MV14',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV14'
)
Mod('MV12',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV12'
)
Mod('MV11',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV11'
)
Mod('MV9',
'frappy_psi.manual_valves.ManualValve',
'Manual Valve MV9'
)
Mod('stateMachine',
'frappy_psi.dilution_statemachine.DIL5',
'Statemachine',
condenseline_pressure = "p2",
condense_valve = "V9",
dump_valve = "V4",
circulate_pump = "pump",
compressor = "compressor",
turbopump = "turbopump",
condenseline_valve = "V1",
circuitshort_valve = "V2",
still_pressure = "p3",
#ls372 = "res1",
V5 = "V5",
p1 = "p1",
MV10 = 'MV10',
MV13 ='MV13',
MV8 = 'MV8',
MVB = 'MVB',
MV2 = 'MV2',
MV1 = 'MV1',
MV3a = 'MV3a',
MV3b = 'MV3b',
GV1 = 'GV1',
MV14 = 'MV14',
MV12 = 'MV12',
MV11 = 'MV11',
MV9 = 'MV9',
GV2 = 'GV2',
condensing_p_low = 150,
condensing_p_high = 250
)

View File

@ -1,231 +0,0 @@
Node('cfg/dilsc1.cfg',
'triton test',
interface='5000',
name='dilsc1',
)
Mod('triton',
'frappy_psi.mercury.IO',
'connection to triton software',
uri='tcp://192.168.2.33:33576',
)
Mod('T_mix',
'frappy_psi.triton.TemperatureSensor',
'mix. chamber temperature',
slot='T8',
io='triton',
)
Mod('T_pt2head',
'frappy_psi.triton.TemperatureSensor',
'PTR2 head temperature',
slot='T1',
io='triton',
)
Mod('T_pt2plate',
'frappy_psi.triton.TemperatureSensor',
'PTR2 plate temperature',
slot='T2',
io='triton',
)
Mod('T_still',
'frappy_psi.triton.TemperatureSensor',
'still temperature',
slot='T3',
io='triton',
)
Mod('htr_still',
'frappy_psi.triton.HeaterOutput',
'still heater',
slot='H2',
io='triton',
)
Mod('T_coldpl',
'frappy_psi.triton.TemperatureSensor',
'cold plate temperature',
slot='T4',
io='triton',
)
Mod('T_mixcx',
'frappy_psi.triton.TemperatureSensor',
'mix. chamber cernox',
slot='T5',
io='triton',
)
Mod('T_pt1head',
'frappy_psi.triton.TemperatureSensor',
'PTR1 head temperature',
slot='T6',
io='triton',
)
Mod('T_pt1plate',
'frappy_psi.triton.TemperatureSensor',
'PTR1 plate temperature',
slot='T7',
io='triton',
)
Mod('T_pucksensor',
'frappy_psi.triton.TemperatureLoop',
'puck sensor temperature',
output_module='htr_pucksensor',
slot='TA',
io='triton',
)
Mod('htr_pucksensor',
'frappy_psi.triton.HeaterOutputWithRange',
'mix. chamber heater',
slot='H1,TA',
io='triton',
)
Mod('T_magnet',
'frappy_psi.triton.TemperatureSensor',
'magnet temperature',
slot='T13',
io='triton',
)
Mod('action',
'frappy_psi.triton.Action',
'higher level scripts',
io='triton',
slot='DR',
)
Mod('p_dump',
'frappy_psi.mercury.PressureSensor',
'dump pressure',
slot='P1',
io='triton',
)
Mod('p_cond',
'frappy_psi.mercury.PressureSensor',
'condenser pressure',
slot='P2',
io='triton',
)
Mod('p_still',
'frappy_psi.mercury.PressureSensor',
'still pressure',
slot='P3',
io='triton',
)
Mod('p_fore',
'frappy_psi.mercury.PressureSensor',
'pressure on the pump side',
slot='P5',
io='triton',
)
Mod('p_back',
'frappy_psi.mercury.PressureSensor',
'pressure on the back side of the pump',
slot='P4',
io='triton',
)
Mod('p_ovc',
'frappy_psi.mercury.PressureSensor',
'outer vacuum pressure',
slot='P6',
io='triton',
)
Mod('V1',
'frappy_psi.triton.Valve',
'valve V1',
slot='V1',
io='triton',
)
Mod('V2',
'frappy_psi.triton.Valve',
'valve V2',
slot='V2',
io='triton',
)
Mod('V4',
'frappy_psi.triton.Valve',
'valve V4',
slot='V4',
io='triton',
)
Mod('V5',
'frappy_psi.triton.Valve',
'valve V5',
slot='V5',
io='triton',
)
Mod('V9',
'frappy_psi.triton.Valve',
'valve V9',
slot='V9',
io='triton',
)
Mod('ips',
'frappy_psi.mercury.IO',
'IPS for magnet',
uri='192.168.127.254:3001',
)
Mod('mf',
'frappy_psi.dilsc.VectorField',
'vector field',
x='mfx',
y='mfy',
z='mfz',
sphere_radius=0.6,
cylinders=((0.23, 5.2), (0.45, 0.8)),
)
Mod('mfx',
'frappy_psi.ips_mercury.SimpleField',
'magnetic field, x-axis',
slot='GRPX',
io='ips',
tolerance=0.0001,
wait_stable_field=0.0,
nunits=2,
target=Param(max=0.6),
ramp=0.225,
)
Mod('mfy',
'frappy_psi.ips_mercury.SimpleField',
'magnetic field, y axis',
slot='GRPY',
io='ips',
tolerance=0.0001,
wait_stable_field=0.0,
nunits=2,
target=Param(max=0.6),
ramp=0.225,
)
Mod('mfz',
'frappy_psi.ips_mercury.Field',
'magnetic field, z-axis',
slot='GRPZ',
io='ips',
tolerance=0.0001,
target=Param(max=5.2),
mode='DRIVEN',
ramp=0.52,
)

15
cfg/dpm.cfg Normal file
View File

@ -0,0 +1,15 @@
[NODE]
description = DPM driver for pressure cell
id = dpm.psi.ch
[INTERFACE]
uri = tcp://5000
[force]
description = DPM driver to read out the transducer value, write and read the offset and scale factor
class = secop_psi.dpm.DPM3
# uri = ldmse-d910-ts.psi.ch:3001
uri = serial:///dev/ttyUSB1
digits = 2
scale_factor = 0.0156

View File

@ -1,12 +0,0 @@
Node('dpm.psi.ch',
'DPM driver for pressure cell',
interface='tcp://5000',
)
Mod('force',
'frappy_psi.dpm.DPM3',
'DPM driver to read out the transducer value, write and read the offset and scale factor',
uri='serial:///dev/ttyUSB1',
digits=2,
scale_factor=0.0156,
)

View File

@ -1,27 +0,0 @@
Node('relais.psi.ch',
'relais test',
'tcp://5000',
)
Mod('rl',
'frappy_psi.ionopimax.DigitalOutput',
'left relais',
addr = 'o1',
value = 0, # start with relais off
)
Mod('rr',
'frappy_psi.ionopimax.DigitalOutput',
'right relais',
addr = 'o2',
value = 0, # start with relais off
)
Mod('drummer',
'frappy_psi.drums.Drums',
'drummer',
target = 150,
pattern='l2L2rl1R1L2',
left='rl',
right='rr',
)

View File

@ -1,136 +0,0 @@
Node('test.config.frappy.demo',
'''short description of the testing sec-node
This description for the node can be as long as you need if you use a multiline string.
Very long!
The needed fields are Equipment id (1st argument), description (this)
and the main interface of the node (3rd arg)
''',
'tcp://5000',
)
Mod('attachtest',
'frappy_demo.test.WithAtt',
'test attached',
att = 'LN2',
)
Mod('pinata',
'frappy_demo.test.Pin',
'scan test',
)
Mod('recursive',
'frappy_demo.test.RecPin',
'scan test',
)
Mod('LN2',
'frappy_demo.test.LN2',
'random value between 0..100%',
value = Param(default = 0, unit = '%'),
)
Mod('heater',
'frappy_demo.test.Heater',
'some heater',
maxheaterpower = 10,
)
Mod('T1',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T7',
)
Mod('T2',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T8',
)
Mod('T3',
'frappy_demo.test.Temp',
'some temperature',
sensor = 'X34598T9',
)
Mod('Lower',
'frappy_demo.test.Lower',
'something else',
)
Mod('Decision',
'frappy_demo.test.Mapped',
'Random value from configured property choices. Config accepts anything ' \
'that can be converted to a list',
choices = ['Yes', 'Maybe', 'No'],
)
Mod('c',
'frappy_demo.test.Commands',
'a command test',
)
Mod('cryo',
'frappy_demo.cryo.Cryostat',
'A simulated cc cryostat with heat-load, specific heat for the sample and a '
'temperature dependent heat-link between sample and regulation.',
group='very important/stuff',
jitter=0.1,
T_start=10.0,
target=10.0,
looptime=1,
ramp=6,
maxpower=20.0,
heater=4.1,
mode='pid',
tolerance=0.1,
window=30,
timeout=900,
p = Param(40, unit='%/K'), # in case 'default' is the first arg, we can omit 'default='
i = 10,
d = 2,
pid = Group('p', 'i', 'd'),
pollinterval = Param(export=False),
value = Param(unit = 'K', test = 'customized value'),
)
Mod('heatswitch',
'frappy_demo.modules.Switch',
'Heatswitch for `mf` device',
switch_on_time = 5,
switch_off_time = 10,
)
Mod('bool',
'frappy_demo.modules.BoolWritable',
'boolean writable test',
)
Mod('lscom',
'frappy_psi.ls370sim.Ls370Sim',
'simulated serial communicator to a LS 370',
visibility = 3
)
Mod('sw',
'frappy_psi.ls370res.Switcher',
'channel switcher for Lsc controller',
io = 'lscom',
)
Mod('a',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 1,
switcher = 'sw',
)
Mod('b',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 3,
switcher = 'sw',
)

50
cfg/epics.cfg Normal file
View File

@ -0,0 +1,50 @@
[node see_demo_equipment]
description=Do not use, it needs to be rewritten....
[interface testing]
type=tcp
bindto=0.0.0.0
bindport=10767
[module tc1]
class=secop_demo.modules.CoilTemp
sensor="X34598T7"
[module tc2]
class=secop_demo.modules.CoilTemp
sensor="X39284Q8'
[module sensor1]
class=secop_ess.epics.EpicsReadable
epics_version="v4"
.group="Lakeshore336"
value_pv="DEV:KRDG1"
[module loop1]
class=secop_ess.epics.EpicsTempCtrl
epics_version="v4"
.group="Lakeshore336"
value_pv="DEV:KRDG1"
target_pv="DEV:SETP_S1"
heaterrange_pv="DEV:RANGE_S1"
[module sensor2]
class=secop_ess.epics.EpicsReadable
epics_version="v4"
.group="Lakeshore336"
value_pv="DEV:KRDG2"
[module loop2]
class=secop_ess.epics.EpicsTempCtrl
epics_version="v4"
.group="Lakeshore336"
value_pv="DEV:KRDG2"
target_pv="DEV:SETP_S2"
heaterrange_pv="DEV:RANGE_S2"

View File

@ -1,36 +0,0 @@
Node('see_demo_equipment',
'Do not use, it needs to be rewritten....',
'tcp://10767',
)
Mod('tc1',
'frappy_demo.modules.CoilTemp',
'',
sensor="X34598T7",
)
Mod('tc2',
'frappy_demo.modules.CoilTemp',
'',
sensor="X39284Q8",
)
for i in [1,2]:
Mod('sensor%d' % i,
'frappy_ess.epics.EpicsReadable',
'',
epics_version="v4",
value_pv="DEV:KRDG%d" % i,
group="Lakeshore336",
)
Mod('loop%d' % i,
'frappy_ess.epics.EpicsTempCtrl',
'',
epics_version="v4",
group="Lakeshore336",
value_pv="DEV:KRDG%d" % i,
target_pv="DEV:SETP_S%d" % i,
heaterrange_pv="DEV:RANGE_S%d" % i,
)

View File

@ -1,100 +0,0 @@
Node('fi2.psi.ch',
'vacuum furnace ILL Type',
'tcp://5000',
)
Mod('htr_io',
'frappy_psi.tdkpower.IO',
'powersupply communicator',
uri = 'serial:///dev/ttyUSB0',
)
Mod('htr',
'frappy_psi.tdkpower.Power',
'heater power',
io= 'htr_io',
)
Mod('out',
'frappy_psi.tdkpower.Output',
'heater output',
io = 'htr_io',
maxvolt = 5,
maxcurrent = 25,
)
Mod('relais',
'frappy_psi.ionopimax.DigitalOutput',
'relais for power output',
addr = 'o2',
)
Mod('T_main',
'frappy_psi.ionopimax.CurrentInput',
'sample temperature',
addr = 'ai4',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.ionopimax.CurrentInput',
'extra temperature',
addr = 'ai3',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_htr',
'frappy_psi.ionopimax.CurrentInput',
'heater temperature',
addr = 'ai2',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr = 'av2',
rawrange = (0, 1.5),
valuerange = (0, 150),
value = Param(unit='degC'),
)
Mod('T',
'frappy_psi.picontrol.PI',
'controlled Temperature',
input = 'T_htr',
output = 'out',
relais = 'relais',
p = 2,
i = 0.01,
)
Mod('interlocks',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
input = 'T_htr',
wall_T = 'T_wall',
vacuum = 'p',
relais = 'relais',
control = 'T',
wall_limit = 50,
vacuum_limit = 0.1,
)
Mod('p_io',
'frappy_psi.pfeiffer.IO',
'pressure io',
uri='serial:///dev/ttyUSBlower',
)
Mod('p',
'frappy_psi.pfeiffer.Pressure',
'pressure reading',
io = 'p_io',
)

View File

@ -1,117 +0,0 @@
Node('fi.psi.ch',
'ILL furnace',
'tcp://5000',
)
Mod('T_main',
'frappy_psi.furnace.PRtransmitter',
'sample temperature',
addr='ai2',
valuerange=(0, 2300),
value=Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai1',
valuerange=(0, 2300),
value=Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr='av2',
rawrange=(0, 1.5),
valuerange=(0, 150),
value=Param(unit='degC'),
)
Mod('T3',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai3',
valuerange=(0, 1372),
value=Param(unit='degC'),
)
Mod('T4',
'frappy_psi.furnace.PRtransmitter',
'extra temperature',
addr='ai4',
valuerange=(0, 1372),
value=Param(unit='degC'),
)
Mod('T',
'frappy_psi.picontrol.PI',
'controlled Temperature',
input_module='T_main',
output_module='htr',
value = Param(unit='degC'),
output_min = 0,
output_max = 100,
# relais='relais',
p=0.1,
i=0.01,
)
Mod('htr_io',
'frappy_psi.tdkpower.IO',
'powersupply communicator',
uri='serial:///dev/ttyUSB0?baudrate=9600',
)
Mod('htr_power',
'frappy_psi.tdkpower.Power',
'heater power',
io='htr_io',
)
Mod('htr',
'frappy_psi.furnace.TdkOutput',
'heater output',
io='htr_io',
maxvolt=8,
maxcurrent=200,
)
Mod('flowswitch',
'frappy_psi.ionopimax.DigitalInput',
'flow switch',
addr='dt2',
true_level='low',
)
Mod('interlocks',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
main_T='T_main',
extra_T='T_extra',
wall_T='T_wall',
vacuum='p',
control='T',
htr='htr',
flowswitch='flowswitch',
wall_limit=50,
main_T_limit = 1400,
extra_T_limit = 1400,
vacuum_limit=0.01,
)
Mod('p',
'frappy_psi.furnace.PKRgauge',
'pressure reading',
addr = 'av1',
rawrange = (1.82, 8.6),
valuerange = (5e-9, 1000),
value = Param(unit='mbar'),
)
Mod('vso',
'frappy_psi.ionopimax.VoltagePower',
'voltage power output',
target = 24,
export = False,
)

View File

@ -1,52 +0,0 @@
Node('flowsas.psi.ch',
'flowsas test motors',
'tcp://5000',
)
#Mod('mot_io',
# 'frappy_psi.phytron.PhytronIO',
# 'io for motor control',
# uri = 'serial:///dev/ttyUSB0',
# )
#Mod('hmot',
# 'frappy_psi.phytron.Motor',
# 'horizontal axis',
# axis = 'X',
# io = 'mot_io',
# encoder_mode= 'NO',
# )
#Mod('vmot',
# 'frappy_psi.phytron.Motor',
# 'vertical axis',
# axis = 'Y',
# io = 'mot_io',
# encoder_mode= 'NO',
# )
Mod('syr_io',
'frappy_psi.cetoni_pump.LabCannBus',
'Module for bus',
deviceconfig = "/home/l_samenv/frappy/cetoniSDK/CETONI_SDK_Raspi_64bit_v20220627/config/dual_pumps",
)
Mod('syr1',
'frappy_psi.cetoni_pump.SyringePump',
'First syringe pump',
io='syr_io',
pump_name = "Nemesys_S_1_Pump",
valve_name = "Nemesys_S_1_Valve",
inner_diameter_set = 10,
piston_stroke_set = 60,
)
Mod('syr2',
'frappy_psi.cetoni_pump.SyringePump',
'Second syringe pump',
io='syr_io',
pump_name = "Nemesys_S_2_Pump",
valve_name = "Nemesys_S_2_Valve",
inner_diameter_set = 1,
piston_stroke_set = 60,
)

View File

@ -1,130 +0,0 @@
Node('fs.psi.ch',
'small vacuum furnace',
'tcp://5000',
)
Mod('T',
'frappy_psi.picontrol.PI2',
'controlled Temperature on sample (2nd loop)',
input = 'T_sample',
output = 'T_reg',
relais = 'relais',
p = 1.2,
i = 0.005,
)
Mod('T_reg',
'frappy_psi.picontrol.PI',
'controlled Temperature on heater',
input = 'T_htr',
output = 't_out',
relais = 'relais',
p = 1,
i = 0.003,
)
Mod('p_reg',
'frappy_psi.picontrol.PI',
'controlled pressure',
input = 'p',
output = 'p_out',
relais = 'relais',
p = 1,
i = 0.005,
)
Mod('T_htr',
'frappy_psi.ionopimax.CurrentInput',
'heater temperature',
addr = 'ai4',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_sample',
'frappy_psi.ionopimax.CurrentInput',
'sample temperature',
addr = 'ai3',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_extra',
'frappy_psi.ionopimax.CurrentInput',
'extra temperature',
addr = 'ai2',
valuerange = (0, 1372),
value = Param(unit='degC'),
)
Mod('T_wall',
'frappy_psi.ionopimax.VoltageInput',
'furnace wall temperature',
addr = 'av2',
rawrange = (0, 1.5),
valuerange = (0, 150),
value = Param(unit='degC'),
)
Mod('htr_io',
'frappy_psi.bkpower.IO',
'powersupply communicator',
uri = 'serial:///dev/ttyUSBupper',
)
Mod('htr',
'frappy_psi.bkpower.Power',
'heater power',
io= 'htr_io',
)
Mod('t_out',
'frappy_psi.bkpower.Output',
'heater output',
p_value = 'p_out',
io = 'htr_io',
maxvolt = 50,
maxcurrent = 2,
)
Mod('relais',
'frappy_psi.ionopimax.DigitalOutput',
'relais for power output',
addr = 'o2',
)
Mod('interlocks',
'frappy_psi.furnace.Interlocks',
'interlock parameters',
input = 'T_htr',
wall_T = 'T_wall',
htr_T = 'T_htr',
main_T = 'T_sample',
extra_T = 'T_extra',
vacuum = 'p',
relais = 'relais',
control = 'T',
wall_limit = 100,
vacuum_limit = 0.1,
)
Mod('p',
'frappy_psi.ionopimax.LogVoltageInput',
'pressure reading',
addr = 'av1',
rawrange = (1.82, 8.6),
valuerange = (5e-9, 1000),
value = Param(unit='mbar'),
)
Mod('vso',
'frappy_psi.ionopimax.VoltagePower',
'voltage power output',
target = 24,
export = False,
)

View File

@ -1,7 +0,0 @@
[FRAPPY]
# general config for running in git repo
logdir = ./log
piddir = ./pid
confdir = ./cfg
comlog = True

View File

@ -1,16 +0,0 @@
Node('lockin70test.psi.ch',
'lockin70 test',
'tcp://5000',
)
Mod('io',
'frappy_psi.SR.SR_IO',
'lockin communication',
uri='10105266.psi.ch:50000',
)
Mod('XY',
'frappy_psi.SR.XY70',
'XY channels',
io='io',
)

View File

@ -1,16 +0,0 @@
Node('lockin830test.psi.ch',
'lockin830 test',
'tcp://5000',
)
Mod('io',
'frappy_psi.SR830.SR830_IO',
'lockin communication',
uri='tcp://linse-976d-ts:3002',
)
Mod('XY',
'frappy_psi.SR830.XY',
'XY channels',
io='io',
)

View File

@ -1,16 +0,0 @@
Node('lockintest.psi.ch',
'lockin test',
'tcp://5000',
)
Mod('io',
'frappy_psi.SR.SR_IO',
'lockin communication',
uri='10105266.psi.ch:50000',
)
Mod('XY',
'frappy_psi.SR.XY',
'XY channels',
io='io',
)

17
cfg/ls240.cfg Normal file
View File

@ -0,0 +1,17 @@
[NODE]
id = ls240.psi.ch
description = ls240 test
[INTERFACE]
uri = tcp://5000
[T]
description = temperature on uniax stick
class = secop_psi.ls240.Ls240
iodev = T_iodev
[T_iodev]
class = secop.bytesio.BytesIO
description = IO device for LS240
uri = serial:///dev/ttyUSB0?baudrate=9600+parity=EVEN
timeout = 0.2

View File

@ -1,20 +0,0 @@
# error importing secop.bytesio.BytesIO
# module T, attached io: Module 'T_io' does not exist on this SEC-Node!
# error initializing T: AttributeError("'NoneType' object has no attribute 'polledModules'")
Node('ls240.psi.ch',
'ls240 test',
interface='tcp://5000',
)
Mod('T',
'frappy_psi.ls240.Ls240',
'temperature on uniax stick',
io='T_io',
)
Mod('T_io',
'frappy.bytesio.BytesIO',
'IO device for LS240',
uri='serial:///dev/ttyUSB0?baudrate=9600+parity=EVEN',
timeout=0.2,
)

View File

@ -1,23 +0,0 @@
from os import environ
# either change the uri or set the environment variable 'LS_URI'
lakeshore_uri = environ.get('LS_URI', 'tcp://<host>:7777')
Node('example_cryo.psi.ch', # a globally unique identification
'this is an example cryostat for the Frappy tutorial', # describes the node
interface='tcp://10767') # you might choose any port number > 1024
Mod('io', # the name of the module
'frappy_demo.lakeshore.LakeshoreIO', # the class used for communication
'communication to main controller', # a description
uri=lakeshore_uri, # the serial connection
)
Mod('T',
'frappy_demo.lakeshore.TemperatureLoop',
'Sample Temperature',
io='io',
channel='A', # the channel on the LakeShore for this module
loop=1, # the loop to be used
value=Param(max=470), # set the maximum expected T
target=Param(max=420), # set the maximum allowed target T
heater_range=3, # 5 for model 350
)

View File

@ -1,25 +0,0 @@
Node('ls340test.psi.ch',
'ls340 test',
'tcp://5000'
)
Mod('io',
'frappy_psi.lakeshore.IO340',
'communication to ls340',
uri='tcp://localhost:7777'
)
Mod('dev',
'frappy_psi.lakeshore.Device340',
'device for calcurve',
io='io',
curve_handling=True,
)
Mod('T',
'frappy_psi.lakeshore.Sensor340',
'sample temperature',
# output_module='Heater',
device='dev',
channel='A',
calcurve='x29746',
)

25
cfg/ls370res.cfg Normal file
View File

@ -0,0 +1,25 @@
[NODE]
id = ls370res.psi.ch
description = Lsc370 Test
[INTERFACE]
uri = tcp://5000
[lsmain_iodev]
description = the communication device
class = secop_psi.ls370res.StringIO
uri = lollypop-ts:3001
[lsmain]
class = secop_psi.ls370res.Main
description = main control of Lsc controller
uri = lollypop-ts:3001
[res]
class = secop_psi.ls370res.ResChannel
iexc = '1mA'
channel = 5
description = resistivity
main = lsmain
# the auto created iodev from lsmain:
iodev = lsmain_iodev

View File

@ -1,25 +0,0 @@
Node('ls370res.psi.ch',
'Lsc370 Test',
interface='tcp://5000',
)
Mod('lsmain_io',
'frappy_psi.ls370res.StringIO',
'the communication device',
uri='lollypop-ts:3001',
)
Mod('lsmain',
'frappy_psi.ls370res.Main',
'main control of Lsc controller',
uri='lollypop-ts:3001',
)
Mod('res',
'frappy_psi.ls370res.ResChannel',
'resistivity',
iexc='1mA',
channel=5,
main='lsmain',
io='lsmain_io',
)

24
cfg/ls370sim.cfg Normal file
View File

@ -0,0 +1,24 @@
[node LscSIM.psi.ch]
description = Lsc Simulation at PSI
[interface tcp]
type = tcp
bindto = 0.0.0.0
bindport = 5000
[module res]
class = secop_psi.ls370res.ResChannel
.channel = 3
.description = resistivity
.main = lsmain
.iodev = lscom
[module lsmain]
class = secop_psi.ls370res.Main
.description = main control of Lsc controller
.iodev = lscom
[module lscom]
class = secop_psi.ls370sim.Ls370Sim
.description = simulated serial communicator to a LS 370
.visibility = 3

View File

@ -1,30 +0,0 @@
Node('LscSIM.psi.ch',
'Lsc Simulation at PSI',
'tcp://5000',
)
Mod('lscom',
'frappy_psi.ls370sim.Ls370Sim',
'simulated serial communicator to a LS 370',
visibility = 3
)
Mod('sw',
'frappy_psi.ls370res.Switcher',
'channel switcher for Lsc controller',
io = 'lscom',
)
Mod('a',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 1,
switcher = 'sw',
)
Mod('b',
'frappy_psi.ls370res.ResChannel',
'resistivity',
channel = 3,
switcher = 'sw',
)

25
cfg/ls370test.cfg Normal file
View File

@ -0,0 +1,25 @@
[NODE]
id = ls370res.psi.ch
description = Lsc370 Test
[INTERFACE]
uri = tcp://5000
[lsmain_iodev]
description = the communication device
class = secop_psi.ls370res.StringIO
uri = localhost:4567
[lsmain]
class = secop_psi.ls370res.Main
description = main control of Lsc controller
iodev = lsmain_iodev
[res]
class = secop_psi.ls370res.ResChannel
iexc = '1mA'
channel = 5
description = resistivity
main = lsmain
# the auto created iodev from lsmain:
iodev = lsmain_iodev

View File

@ -1,30 +0,0 @@
Node('LscSIM.psi.ch',
'Lsc370 Test',
'tcp://5000',
)
Mod('io',
'frappy_psi.ls370res.StringIO',
'io for Ls370',
# uri = 'localhost:2089',
uri = 'linse-976d-ts:3007',
)
Mod('sw',
'frappy_psi.ls370res.Switcher',
'channel switcher',
io = 'io',
)
Mod('res1',
'frappy_psi.ls370res.ResChannel',
'resistivity chan 1',
vexc = '2mV',
channel = 2,
switcher = 'sw',
)
Mod('res2',
'frappy_psi.ls370res.ResChannel',
'resistivity chn 3',
vexc = '2mV',
channel = 3,
switcher = 'sw',
)

View File

@ -1,4 +0,0 @@
[FRAPPY]
confdir = ~/frappy/cfg/main:~/frappy/cfg/develop
logdir = ~/frappylog
piddir = ~/frappylog/pid

20
cfg/main/ccr2.cfg Normal file
View File

@ -0,0 +1,20 @@
[NODE]
description = sumitomo 4 K closed cycle refrigerator (FOCUS)
id = ccr2.config.sea.psi.ch
[sea_main]
class = secop_psi.sea.SeaClient
description = SEA connection to main
config = ccr2.config
service = main
[tt]
class = secop_psi.sea.SeaDrivable
iodev = sea_main
sea_object = tt
#[tscreen]
#class = secop_psi.sea.SeaReadable
#iodev = sea_main
#sea_object = tt
#rel_paths = te

View File

@ -1,17 +0,0 @@
Node('ccr2.config.sea.psi.ch',
'sumitomo 4 K closed cycle refrigerator (FOCUS)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'SEA connection to main',
config='ccr2.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
meaning=['temperature', 20],
io='sea_main',
sea_object='tt',
)

27
cfg/main/ccr2ht.cfg Normal file
View File

@ -0,0 +1,27 @@
[NODE]
description = sumitomo 4 K closed cycle refrigerator with hot stage (FOCUS)
id = ccr2ht.config.sea.psi.ch
[sea_main]
class = secop_psi.sea.SeaClient
description = main SEA connection
config = ccr2ht.config
service = main
[tt]
class = secop_psi.sea.SeaDrivable
iodev = sea_main
sea_object = tt
#[tscreen]
#class = secop_psi.sea.SeaReadable
#iodev = sea_main
#sea_object = tt
#rel_paths = te
[tcoldfinger]
class = secop_psi.sea.SeaReadable
iodev = sea_main
sea_object = tt
rel_paths = tk

View File

@ -1,24 +0,0 @@
Node('ccr2ht.config.sea.psi.ch',
'sumitomo 4 K closed cycle refrigerator with hot stage (FOCUS)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main SEA connection',
config='ccr2ht.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
)
Mod('tcoldfinger',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['tk'],
)

View File

@ -1,17 +0,0 @@
Node('ccr3.config.sea.psi.ch',
'4 K closed cycle cryostat (ZEBRA)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for ccr3.config',
config='ccr3.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
)

View File

@ -1,40 +0,0 @@
Node('ccrpe.config.sea.psi.ch',
'''4 K closed cycle cryostat (PE cell)''',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for ccrpe.config',
config = 'ccrpe.config',
service = 'main',
)
Mod('ts',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
rel_paths=['ts', 'set'],
)
Mod('tm',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['ts'],
)
Mod('te',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['te'],
)
Mod('warmup',
'frappy_psi.sea.SeaDrivable', '',
io = 'sea_main',
sea_object = 'warmup',
)
Mod('p',
'frappy_psi.sea.SeaReadable', '',
io = 'sea_main',
sea_object = 'p',
)

View File

@ -1,38 +0,0 @@
Node('cfg/main/ccrpe_lowT.cfg',
'4 K closed cycle cryostat (PE cell)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for ccrpe_lowT.config',
config='ccrpe_lowT.config',
service='main',
)
Mod('ts',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
rel_paths=['ts', 'set'],
)
Mod('tm',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['tm'],
)
Mod('te',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['te'],
)
Mod('warmup',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
sea_object='warmup',
)

View File

@ -1,49 +0,0 @@
Node('cyrosim.psi.ch',
'cryo simulation (similar ppms simulation)',
)
Mod('tt',
'frappy_psi.ppms.Temp',
'main temperature',
meaning=('temperature_regulation', 10),
ramp=20.0,
io='ppms',
)
Mod('lev',
'frappy_psi.ppms.Level',
'helium level',
io='ppms',
)
Mod('ts',
'frappy_psi.ppms.UserChannel',
'sample temperature',
enabled=True,
linkenable='tv',
value=Param(
unit='K',
),
meaning=('temperature', 10),
io='ppms',
)
Mod('tv',
'frappy_psi.ppms.UserChannel',
'exchanger temperature',
enabled=True,
linkenable='ts',
value=Param(
unit='K',
),
io='ppms',
)
Mod('ppms',
'frappy_psi.ppms.Main',
'the main and poller module',
class_id='QD.MULTIVU.PPMS.1',
visibility='expert',
pollinterval=2.0,
export=False,
)

View File

@ -1,17 +0,0 @@
Node('cti5.config.sea.psi.ch',
'15 K closed cycle cryostat',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for cti5.config',
config='cti5.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
)

View File

@ -1,17 +0,0 @@
Node('cti7.config.sea.psi.ch',
'30 K - 475 K closed cycle cryostat',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for cti7.config',
config='cti7.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
)

View File

@ -1,24 +0,0 @@
Node('cti7ht.config.sea.psi.ch',
'30 K - 475 K closed cycle cryostat with hot stagge',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for cti7ht.config',
config='cti7ht.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
meaning=['temperature', 20],
io='sea_main',
sea_object='tt',
)
Mod('th',
'frappy_psi.sea.SeaReadable', 'CTI cold finger temperature',
io='sea_main',
sea_object='tt',
rel_paths = ['te'],
)

View File

@ -1,16 +0,0 @@
Node('eurotherm.config.sea.psi.ch',
'Eurotherm controller',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for haakeuro.config',
config = 'eurotherm.config',
service = 'main',
)
Mod('te',
'frappy_psi.sea.SeaDrivable', '',
io = 'sea_main',
meaning=['temperature', 20],
sea_object = 'te',
meaning=('temperature', 11),
)

36
cfg/main/fftf.cfg Normal file
View File

@ -0,0 +1,36 @@
[NODE]
description = thin film oven for AMOR
id = fftf.config.sea.psi.ch
[sea_main]
class = secop_psi.sea.SeaClient
description = main sea connection for fftf.config
config = fftf.config
service = main
[tt]
class = secop_psi.sea.SeaDrivable
iodev = sea_main
sea_object = tt
[p]
class = secop_psi.sea.SeaReadable
iodev = sea_main
sea_object = p
extra_modules = vacuumpump gasflow tlimit tlimit_without_vacuum
[gasflow]
class = secop_psi.sea.SeaWritable
iodev = sea_main
single_module = p.gasflow
[vacuumpump]
class = secop_psi.sea.SeaWritable
iodev = sea_main
sea_object = p
rel_paths = vacuumpump tlimit tlimit_without_vacuum
[table]
class = secop_psi.sea.SeaModule
iodev = sea_main
sea_object = table

View File

@ -1,43 +0,0 @@
Node('fftf.config.sea.psi.ch',
'thin film oven for AMOR',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for fftf.config',
config='fftf.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
)
Mod('p',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='p',
extra_modules=['vacuumpump', 'gasflow', 'tlimit', 'tlimit_without_vacuum'],
)
Mod('gasflow',
'frappy_psi.sea.SeaWritable', '',
io='sea_main',
single_module='p.gasflow',
)
Mod('vacuumpump',
'frappy_psi.sea.SeaWritable', '',
io='sea_main',
sea_object='p',
rel_paths=['vacuumpump', 'tlimit', 'tlimit_without_vacuum'],
)
Mod('table',
'frappy_psi.sea.SeaModule', '',
io='sea_main',
sea_object='table',
)

View File

@ -1,226 +0,0 @@
Node('flamemag.psi.ch',
'flame magnet',
interface='tcp://5000',
)
sea_cfg = 'flamemag.config'
Mod('cio',
'frappy_psi.cryoltd.IO',
'IO to cryo ltd software',
uri='tcp://flamemag:3128',
)
Mod('main',
'frappy_psi.cryoltd.Main',
'master module',
io='cio',
)
Mod('B',
'frappy_psi.cryoltd.MainField',
'magnetic field',
channel='Main',
main='main',
constraint=80000.0,
target=Param(
max=35000.0,
),
mode='PERSISTENT',
hw_units='T',
A_to_G=285.73,
ramp=Param(
max=412.0,
),
overshoot={'o': 1.0, 't': 180.0},
degauss={'s': 500.0, 'd': 30.0, 'f': 5.0, 't': 120.0},
tolerance=5.0,
wait_switch_on = 30,
wait_switch_off = 30,
wait_stable_field=180.0,
)
Mod('Bx',
'frappy_psi.cryoltd.ComponentField',
'magnetic field x component',
channel='VMX',
main='main',
check_against='B',
target=Param(
max=200.0,
),
hw_units='A',
A_to_G=4.134,
ramp=Param(
max=23.0,
),
tolerance=1.0,
)
Mod('By',
'frappy_psi.cryoltd.ComponentField',
'magnetic field y component',
channel='VMY',
main='main',
check_against='B',
target=Param(
max=100.0,
),
hw_units='A',
A_to_G=4.1117,
ramp=Param(
max=22.9,
),
tolerance=1.0,
)
Mod('Bz',
'frappy_psi.cryoltd.ComponentField',
'magnetic field z component',
channel='VMZ',
main='main',
check_against='B',
target=Param(
max=100.0,
),
hw_units='A',
A_to_G=5.74,
ramp=Param(
max=33.6,
),
tolerance=1.0,
)
Mod('compressorA',
'frappy_psi.cryoltd.Compressor',
'compressor A',
channel='A',
main='main',
)
Mod('compressorB',
'frappy_psi.cryoltd.Compressor',
'compressor B',
channel='B',
main='main',
)
Mod('T_stage1_A',
'frappy_psi.cryoltd.Temperature', '',
channel='1st Stage A',
main='main',
)
Mod('T_stage2_A',
'frappy_psi.cryoltd.Temperature', '',
channel='2nd Stage A',
main='main',
)
Mod('T_stage1_B',
'frappy_psi.cryoltd.Temperature', '',
channel='1st Stage B',
main='main',
)
Mod('T_stage2_B',
'frappy_psi.cryoltd.Temperature', '',
channel='2nd Stage B',
main='main',
)
Mod('T_top_A',
'frappy_psi.cryoltd.Temperature', '',
channel='Inner Magnet A (Top)',
main='main',
)
Mod('T_bottom_A',
'frappy_psi.cryoltd.Temperature', '',
channel='Inner Magnet A (Bottom)',
main='main',
)
Mod('T_top_B',
'frappy_psi.cryoltd.Temperature', '',
channel='Inner Magnet B (Top)',
main='main',
)
Mod('T_bottom_B',
'frappy_psi.cryoltd.Temperature', '',
channel='Inner Magnet B (Bottom)',
main='main',
)
Mod('T_Z_shim',
'frappy_psi.cryoltd.Temperature', '',
channel='Z Shim Former',
main='main',
)
Mod('T_XY_shim',
'frappy_psi.cryoltd.Temperature', '',
channel='XY Shim Former',
main='main',
)
Mod('T_XY_vector',
'frappy_psi.cryoltd.Temperature', '',
channel='XY Vector Former',
main='main',
)
Mod('T_radiation_shield',
'frappy_psi.cryoltd.Temperature', '',
channel='Radiation Shield',
main='main',
)
Mod('T_persistent_joints',
'frappy_psi.cryoltd.Temperature', '',
channel='Persistent Joints',
main='main',
)
Mod('T_outer_A',
'frappy_psi.cryoltd.Temperature', '',
channel='Outer Magnet A',
main='main',
)
Mod('T_outer_B',
'frappy_psi.cryoltd.Temperature', '',
channel='Outer Magnet B',
main='main',
)
Mod('T_shim_B',
'frappy_psi.cryoltd.Temperature', '',
channel='Z Shim Former B',
main='main',
)
Mod('T_bore_shield',
'frappy_psi.cryoltd.Temperature', '',
channel='Bore Radiation Shield',
main='main',
)
Mod('T_XYZ_shim',
'frappy_psi.cryoltd.Temperature', '',
channel='XYZ Shim Plate',
main='main',
)
Mod('T_Z_shim_switch',
'frappy_psi.cryoltd.Temperature', '',
channel='Z Shim Switch',
main='main',
)
Mod('T_main_switch',
'frappy_psi.cryoltd.Temperature', '',
channel='Main Coil Switch',
main='main',
)

View File

@ -1,61 +0,0 @@
Node('flamp.config.sea.psi.ch',
'lamp oven control (from manuel knecht)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for flamp.config',
config='flamp.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
sea_object='tt',
rel_paths=['.', 't1'],
)
Mod('t2',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['t2'],
)
Mod('current',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='current',
extra_modules=['i1,', 'i2,', 'i3,', 'i4'],
)
Mod('i1',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='current.i1',
)
Mod('i2',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='current.i2',
)
Mod('i3',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='current.i3',
)
Mod('i4',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
single_module='current.i4',
)
Mod('pv',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='pv',
)

View File

@ -1,24 +0,0 @@
Node('fs.config.sea.psi.ch',
'small furnace',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for fs.config',
config='fs.config',
service='main',
)
Mod('tt',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
sea_object='tt',
rel_paths=['tm'],
)
Mod('ts',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
sea_object='tt',
rel_paths=['ts'],
)

View File

@ -1,25 +0,0 @@
Node('ft.config.sea.psi.ch',
'FT tantalum furnace (1400 K)',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for fw.config',
config='ft.config',
service='main',
)
Mod('ts',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
sea_object='tt',
meaning=['temperature', 20],
rel_paths=['ts', 'set'],
)
Mod('t2',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['tm'],
)

View File

@ -1,25 +0,0 @@
Node('ft.config.sea.psi.ch',
'FW ILL furnace with W5 thermnocouple (1800 K), old power rack',
)
Mod('sea_main',
'frappy_psi.sea.SeaClient',
'main sea connection for fw.config',
config='fw.config',
service='main',
)
Mod('ts',
'frappy_psi.sea.SeaDrivable', '',
io='sea_main',
meaning=['temperature', 20],
sea_object='tt',
rel_paths=['ts', 'set'],
)
Mod('t2',
'frappy_psi.sea.SeaReadable', '',
io='sea_main',
sea_object='tt',
rel_paths=['t2'],
)

Some files were not shown because too many files have changed in this diff Show More