From efa8632b354806a33ee9297c114cc85a2e6052a8 Mon Sep 17 00:00:00 2001 From: Claudio Scafuri <claudio.scafuri@elettra.eu> Date: Wed, 14 Jul 2021 09:20:04 +0200 Subject: [PATCH] imported from CVS release_15 --- .gitignore | 7 + FRTND_E/FRTND_E.py | 25 + FRTND_E/Makefile | 4 + FRTND_E/active_frntd_e.py | 245 ++++++++++ FRTND_E/frntd_e.ui | 163 +++++++ FRTND_E/ui_frntd_e.py | 105 ++++ TCPSserver/README | 20 + TCPSserver/TCPS2tango.coverage | Bin 0 -> 81963 bytes TCPSserver/TCPS2tango.py | 390 +++++++++++++++ TCPSserver/TCPSserver.e4p | 260 ++++++++++ TCPSserver/TCPStwserver.py | 152 ++++++ TCPSserver/TODO | 2 + TCPSserver/elettrabcsbridge.cfg | 329 +++++++++++++ TCPSserver/elettrabcsbridge011.cfg | 49 ++ TCPSserver/elettrabcsbridge011.cfg.old | 48 ++ TCPSserver/elettrabcsbridge012.cfg | 55 +++ TCPSserver/elettrabcsbridge022.cfg | 45 ++ TCPSserver/elettrabcsbridge032.cfg | 45 ++ TCPSserver/elettrabcsbridge042.cfg | 50 ++ TCPSserver/elettrabcsbridge052.cfg | 40 ++ TCPSserver/elettrabcsbridge061.cfg | 31 ++ TCPSserver/elettrabcsbridge062.cfg | 41 ++ TCPSserver/elettrabcsbridge071.cfg | 30 ++ TCPSserver/elettrabcsbridge072.cfg | 39 ++ TCPSserver/elettrabcsbridge081.cfg | 33 ++ TCPSserver/elettrabcsbridge082.cfg | 53 +++ TCPSserver/elettrabcsbridge091.cfg | 30 ++ TCPSserver/elettrabcsbridge092.cfg | 53 +++ TCPSserver/elettrabcsbridge101.cfg | 32 ++ TCPSserver/elettrabcsbridge102.cfg | 48 ++ TCPSserver/elettrabcsbridge111.cfg | 29 ++ TCPSserver/elettrabcsbridge112.cfg | 36 ++ TCPSserver/list-active.txt | 36 ++ TCPSserver/prova.sh | 9 + TCPSserver/tcps.sh | 156 ++++++ TCPSserver/tcps.sh.inst | 156 ++++++ TCPSserver/tcpserver20012.log | 0 TCPSserver/testcmd.cfg | 13 + TCPSserver/testexc.py | 19 + TCPSserver/testphbsh.cfg | 19 + TCPSserver/testsissi.cfg | 30 ++ blfe.py | 209 ++++++++ blfetest.py | 11 + demo.py | 33 ++ fakedevices/HelicalID.py | 632 +++++++++++++++++++++++++ fakedevices/KymaID.py | 323 +++++++++++++ fakedevices/TangoClassID.txt | 11 + lib_pyElettra.py | 143 ++++++ punti_da_comandare.cfg.txt | 84 ++++ punti_di_lettura.cfg.txt | 92 ++++ tabella-bemline-id.ods | Bin 0 -> 27832 bytes testsissi.py | 19 + 52 files changed, 4484 insertions(+) create mode 100644 .gitignore create mode 100755 FRTND_E/FRTND_E.py create mode 100644 FRTND_E/Makefile create mode 100644 FRTND_E/active_frntd_e.py create mode 100644 FRTND_E/frntd_e.ui create mode 100644 FRTND_E/ui_frntd_e.py create mode 100644 TCPSserver/README create mode 100644 TCPSserver/TCPS2tango.coverage create mode 100644 TCPSserver/TCPS2tango.py create mode 100644 TCPSserver/TCPSserver.e4p create mode 100755 TCPSserver/TCPStwserver.py create mode 100644 TCPSserver/TODO create mode 100644 TCPSserver/elettrabcsbridge.cfg create mode 100644 TCPSserver/elettrabcsbridge011.cfg create mode 100644 TCPSserver/elettrabcsbridge011.cfg.old create mode 100644 TCPSserver/elettrabcsbridge012.cfg create mode 100644 TCPSserver/elettrabcsbridge022.cfg create mode 100644 TCPSserver/elettrabcsbridge032.cfg create mode 100644 TCPSserver/elettrabcsbridge042.cfg create mode 100644 TCPSserver/elettrabcsbridge052.cfg create mode 100644 TCPSserver/elettrabcsbridge061.cfg create mode 100644 TCPSserver/elettrabcsbridge062.cfg create mode 100644 TCPSserver/elettrabcsbridge071.cfg create mode 100644 TCPSserver/elettrabcsbridge072.cfg create mode 100644 TCPSserver/elettrabcsbridge081.cfg create mode 100644 TCPSserver/elettrabcsbridge082.cfg create mode 100644 TCPSserver/elettrabcsbridge091.cfg create mode 100644 TCPSserver/elettrabcsbridge092.cfg create mode 100644 TCPSserver/elettrabcsbridge101.cfg create mode 100644 TCPSserver/elettrabcsbridge102.cfg create mode 100644 TCPSserver/elettrabcsbridge111.cfg create mode 100644 TCPSserver/elettrabcsbridge112.cfg create mode 100644 TCPSserver/list-active.txt create mode 100755 TCPSserver/prova.sh create mode 100755 TCPSserver/tcps.sh create mode 100755 TCPSserver/tcps.sh.inst create mode 100644 TCPSserver/tcpserver20012.log create mode 100644 TCPSserver/testcmd.cfg create mode 100644 TCPSserver/testexc.py create mode 100644 TCPSserver/testphbsh.cfg create mode 100644 TCPSserver/testsissi.cfg create mode 100644 blfe.py create mode 100644 blfetest.py create mode 100755 demo.py create mode 100644 fakedevices/HelicalID.py create mode 100755 fakedevices/KymaID.py create mode 100644 fakedevices/TangoClassID.txt create mode 100644 lib_pyElettra.py create mode 100644 punti_da_comandare.cfg.txt create mode 100644 punti_di_lettura.cfg.txt create mode 100644 tabella-bemline-id.ods create mode 100644 testsissi.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43687c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +CVS +*.pyc +core +.project +.pydevproject +.idea + diff --git a/FRTND_E/FRTND_E.py b/FRTND_E/FRTND_E.py new file mode 100755 index 0000000..237b843 --- /dev/null +++ b/FRTND_E/FRTND_E.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# $Author: claudio $ +# +# $Name: $ +# +# $Log: FRTND_E.py,v $ +# Revision 1.3 2017-02-13 09:30:51 claudio +# revision tag +# +# + +import sys +from PyQt4 import QtCore, QtGui +#from ui_frntd_e import Ui_frntd_e +from active_frntd_e import active_frntd_e +app = QtGui.QApplication(sys.argv) +window = QtGui.QDialog() +#ui = Ui_frntd_e() +ui=active_frntd_e() +#ui.setupUi(window) +ui.setup(window) + +window.show() +sys.exit(app.exec_()) diff --git a/FRTND_E/Makefile b/FRTND_E/Makefile new file mode 100644 index 0000000..c2aa3aa --- /dev/null +++ b/FRTND_E/Makefile @@ -0,0 +1,4 @@ +#makefile for PyQt4 panel + +ui_frntd_e.py::frntd_e.ui + pyuic4 frntd_e.ui >ui_frntd_e.py \ No newline at end of file diff --git a/FRTND_E/active_frntd_e.py b/FRTND_E/active_frntd_e.py new file mode 100644 index 0000000..9e260e6 --- /dev/null +++ b/FRTND_E/active_frntd_e.py @@ -0,0 +1,245 @@ +# deirved class to which active beahvoirou is delegated +# the fatehr class is re-generated by the designer + +# $Author: claudio $ +# +# $Name: $ +# +# $Log: active_frntd_e.py,v $ +# Revision 1.5 2019-06-20 08:14:21 claudio +# #8957, #8947: add new stopper syrmep, tango controlled +# +# Revision 1.4 2017-02-13 09:30:51 claudio +# revision tag +# +# + + +from PyQt4 import QtCore, QtGui +from ui_frntd_e import * +import blfe +import tango + + +class Worker(QtCore.QThread): + def __init__(self, parent=None): + QtCore.QThread.__init__(self, parent) + self.BL = blfe.blfe() + self.exiting = False + self.mode = 'update' + # tango device for syrmep - geco device + self.syrmepstopper = 0 + self.syrmepstopperindex = 0 + self.stopper_value = -1 # 0: closed , 1:open, -1 : unknown + try: + self.syrmepstopper = tango.DeviceProxy('syrmep-control-01.blcs.elettra.trieste.it:20000/syrmep/beamline/geco') + except: + self.syrmepstopper = 0 + + def run(self): + if self.mode == 'update': + self.update() + if self.mode == 'execute': + self.execute() + + def update(self): + self.BL.read() + self.emit(QtCore.SIGNAL("UpdateThread(PyQt_PyObject)"), self.BL) + # read tango status + try: + self.stopper_value = self.syrmepstopper.r_bs4_v + except: + self.stopper_value = -1 + + def execute(self): + errtable = self.BL.closeall() + + #close tango controlloed syrme stopper + try: + self.syrmepstopper.r_bs4_v=0 + except: + self.emit(QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.BL, 'geco/r_bs4_v failed') + if errtable is None: + self.emit(QtCore.SIGNAL("ExecuteThread(PyQt_PyObject)"), self.BL) + else: + self.emit(QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.BL, errtable) + + +class active_frntd_e(Ui_frntd_e, QtCore.QObject): + + # ovverride setupUI: create graphics and active object, worker thread , then connects signals and start timer + def setup(self, father): + # create ancesstor graphic objetcs + ui = self.setupUi(father) + self.ui = ui + self.msgbox = None + # connect to slots of this class + self.connect(self.pushClose, QtCore.SIGNAL("clicked()"), self.slot_do_close) + self.connect(self.tableWidget, QtCore.SIGNAL("destroyed()"), self.slot_quit) + + # create worker thread - does all the slow network activities + self.thread = Worker() + + self.connect(self.thread, QtCore.SIGNAL("UpdateThread(PyQt_PyObject)"), self.slot_thread_update) + self.connect(self.thread, QtCore.SIGNAL("ExecuteThread(PyQt_PyObject)"), self.slot_thread_execute) + self.connect(self.thread, QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.slot_thread_execute_error) + self.connect(self.thread, QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.slot_thread_tango_error) + + # get reference of BL object from thread + # since the class only reads form BL object non synch primitives are used + # N.B. python copyes object references + self.BL = self.thread.BL + + # configure table widget and create color brushes + self.yellowbrush = QtGui.QBrush(QtGui.QColor("yellow")) + self.greenbrush = QtGui.QBrush(QtGui.QColor("green")) + self.redbrush = QtGui.QBrush(QtGui.QColor("red")) + self.graybrush = QtGui.QBrush(QtGui.QColor("gray")) + n = self.BL.nentries + self.tableWidget.setRowCount(n + 1) + row = 0 + for entry in self.BL.bltable: + bname = entry[2] + objname = entry[0] + stname = entry[4] + col0 = QtGui.QTableWidgetItem(bname, 0) + col1 = QtGui.QTableWidgetItem(objname, 1) + col2 = QtGui.QTableWidgetItem(stname, 2) + col2.setBackground(self.graybrush) + self.tableWidget.setItem(row, 0, col0) + self.tableWidget.setItem(row, 1, col1) + self.tableWidget.setItem(row, 2, col2) + self.tableWidget.setRowHeight(row, 22) + row = row + 1 + # add Tango managed entries - different + bname = 'Syrmep' + objname = 'geco/r_bs4_v' + stname = 'UNKNOWN' + col0 = QtGui.QTableWidgetItem(bname, 0) + col1 = QtGui.QTableWidgetItem(objname, 1) + col2 = QtGui.QTableWidgetItem(stname, 2) + col2.setBackground(self.graybrush) + self.tableWidget.setItem(row, 0, col0) + self.tableWidget.setItem(row, 1, col1) + self.tableWidget.setItem(row, 2, col2) + self.tableWidget.setRowHeight(row, 22) + self.thread.syrmepstopperindex = row + self.syrmepstopperindex = row + row = row + 1 + palette = self.label.palette() + palette.setBrush(QtGui.QPalette.Window, self.graybrush) + self.label.setPalette(palette) + self.label.setAutoFillBackground(1) + self.label.setText('UNKNOWN') + + # resize columns + self.tableWidget.setColumnWidth(0, 130) + self.tableWidget.setColumnWidth(1, 310) + + # do first table update + self.update_table() + # start timer + self.timer = QtCore.QTimer(self) + self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.update_table) + self.timer.start(3000) + + return ui + + def update_table(self): + # configure and start thread + self.thread.mode = 'update' + self.thread.start() + + def redraw_table(self, myBL): + # redraw informations + row = 0 + for entry in myBL.bltable: + stname = entry[4] + item = self.tableWidget.item(row, 2) + item.setText(stname) + if stname == 'OPEN': + item.setBackground(self.redbrush) + if stname == 'CLOSED': + item.setBackground(self.greenbrush) + if stname == 'ERROR': + item.setBackground(self.yellowbrush) + if stname == 'UNKNOWN': + item.setBackground(self.graybrush) + # self.tableWidget.setItem(row,2,item) + row = row + 1 + # check syrmep tango reading + idx = self.thread.syrmepstopperindex + item = self.tableWidget.item(idx, 2) + if self.thread.stopper_value == 1: + item.setBackground(self.redbrush) + item.setText('OPEN') + if self.thread.stopper_value == 0: + item.setBackground(self.greenbrush) + item.setText('CLOSED') + if self.thread.stopper_value == -1: + item.setBackground(self.graybrush) + item.setText('UNKNOWN') + palette = self.label.palette() + if (myBL.allclosed() == 1 and self.thread.stopper_value == 0): + palette.setBrush(QtGui.QPalette.Window, self.greenbrush) + self.label.setText('ALL CLOSED') + else: + palette.setBrush(QtGui.QPalette.Window, self.redbrush) + self.label.setText('OPEN/CLOSED') + self.label.setPalette(palette) + self.label.setAutoFillBackground(1) + + def slot_do_close(self): + # first stop aqcusition thread + self.timer.stop() + self.thread.wait() + + # start execution thread + self.thread.mode = 'execute' + self.thread.start() + + # post dialog box since there is some time to wait + if self.msgbox is None: + self.msgbox = QtGui.QProgressDialog('Closing front-ends...', '', 0, 0) + self.msgbox.setLabelText('Closing front-ends...') + self.msgbox.setCancelButtonText('') + self.msgbox.setWindowTitle('BEAMLINE FRONT END') + self.msgbox.setModal(True) + # How do you remove a button in a dialog???? + # butt=self.msgbox.button(QtGui.QMessageBox.Close) + # as a work-aroud, remove cancel functionality + QtCore.QObject.disconnect(self.msgbox, QtCore.SIGNAL('canceled()'), self.msgbox, QtCore.SLOT('cancel()')) + self.msgbox.show() + QtCore.SIGNAL + else: + self.msgbox.show() + + def slot_thread_update(self, myBL): + # slot called when read is terminated + self.redraw_table(myBL) + + def slot_thread_execute(self, myBL): + # called when execution thread is terminated normally + self.msgbox.close() + self.redraw_table(myBL) + self.timer.start(3000) + + def slot_thread_execute_error(self, myBL, myerrtable): + # called when execution thread is terminated with error + self.msgbox.close() + self.redraw_table(myBL) + self.timer.start(3000) + # shuold improve formatting of beamline errors... + QtGui.QMessageBox.critical(self.ui, 'front-end close', repr(myerrtable)) + + def slot_thread_tango_error(self, myBL, msg): + # called when execution thread is terminated with error + self.msgbox.close() + self.redraw_table(myBL) + self.timer.start(3000) + # shuold improve formatting of beamline errors... + QtGui.QMessageBox.critical(self.ui, 'syrmep front-end close', msg) + + def slot_quit(self): + self.timer.stop() + self.thread.wait() diff --git a/FRTND_E/frntd_e.ui b/FRTND_E/frntd_e.ui new file mode 100644 index 0000000..2d9b84c --- /dev/null +++ b/FRTND_E/frntd_e.ui @@ -0,0 +1,163 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>frntd_e</class> + <widget class="QDialog" name="frntd_e"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>702</width> + <height>1021</height> + </rect> + </property> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="windowTitle"> + <string>BEAMLINE FRONT END</string> + </property> + <property name="sizeGripEnabled"> + <bool>true</bool> + </property> + <layout class="QGridLayout"> + <item row="0" column="0"> + <layout class="QHBoxLayout"> + <item> + <layout class="QVBoxLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="font"> + <font> + <pointsize>10</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="frameShape"> + <enum>QFrame::Panel</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="text"> + <string>ALL CLOSED</string> + </property> + <property name="textFormat"> + <enum>Qt::PlainText</enum> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="margin"> + <number>1</number> + </property> + <property name="textInteractionFlags"> + <set>Qt::NoTextInteraction</set> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pushClose"> + <property name="font"> + <font> + <pointsize>10</pointsize> + </font> + </property> + <property name="text"> + <string>CLOSE ALL</string> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QTableWidget" name="tableWidget"> + <property name="font"> + <font> + <pointsize>9</pointsize> + </font> + </property> + <property name="autoFillBackground"> + <bool>true</bool> + </property> + <property name="lineWidth"> + <number>1</number> + </property> + <property name="autoScroll"> + <bool>false</bool> + </property> + <property name="editTriggers"> + <set>QAbstractItemView::NoEditTriggers</set> + </property> + <property name="tabKeyNavigation"> + <bool>false</bool> + </property> + <property name="showDropIndicator" stdset="0"> + <bool>false</bool> + </property> + <property name="dragDropOverwriteMode"> + <bool>false</bool> + </property> + <property name="alternatingRowColors"> + <bool>true</bool> + </property> + <property name="selectionMode"> + <enum>QAbstractItemView::MultiSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <property name="textElideMode"> + <enum>Qt::ElideNone</enum> + </property> + <property name="sortingEnabled"> + <bool>false</bool> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + <property name="cornerButtonEnabled"> + <bool>false</bool> + </property> + <column> + <property name="text"> + <string>Beamline</string> + </property> + </column> + <column> + <property name="text"> + <string>Point Name</string> + </property> + </column> + <column> + <property name="text"> + <string>Status</string> + </property> + </column> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/FRTND_E/ui_frntd_e.py b/FRTND_E/ui_frntd_e.py new file mode 100644 index 0000000..3602c35 --- /dev/null +++ b/FRTND_E/ui_frntd_e.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'frntd_e.ui' +# +# Created by: PyQt4 UI code generator 4.12.1 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_frntd_e(object): + def setupUi(self, frntd_e): + frntd_e.setObjectName(_fromUtf8("frntd_e")) + frntd_e.resize(702, 1021) + font = QtGui.QFont() + font.setPointSize(10) + frntd_e.setFont(font) + frntd_e.setSizeGripEnabled(True) + self.gridlayout = QtGui.QGridLayout(frntd_e) + self.gridlayout.setObjectName(_fromUtf8("gridlayout")) + self.hboxlayout = QtGui.QHBoxLayout() + self.hboxlayout.setObjectName(_fromUtf8("hboxlayout")) + self.vboxlayout = QtGui.QVBoxLayout() + self.vboxlayout.setObjectName(_fromUtf8("vboxlayout")) + self.label = QtGui.QLabel(frntd_e) + font = QtGui.QFont() + font.setPointSize(10) + font.setBold(True) + font.setWeight(75) + self.label.setFont(font) + self.label.setFrameShape(QtGui.QFrame.Panel) + self.label.setFrameShadow(QtGui.QFrame.Sunken) + self.label.setLineWidth(1) + self.label.setTextFormat(QtCore.Qt.PlainText) + self.label.setAlignment(QtCore.Qt.AlignCenter) + self.label.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) + self.label.setObjectName(_fromUtf8("label")) + self.vboxlayout.addWidget(self.label) + self.pushClose = QtGui.QPushButton(frntd_e) + font = QtGui.QFont() + font.setPointSize(10) + self.pushClose.setFont(font) + self.pushClose.setObjectName(_fromUtf8("pushClose")) + self.vboxlayout.addWidget(self.pushClose) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.vboxlayout.addItem(spacerItem) + self.hboxlayout.addLayout(self.vboxlayout) + self.tableWidget = QtGui.QTableWidget(frntd_e) + font = QtGui.QFont() + font.setPointSize(9) + self.tableWidget.setFont(font) + self.tableWidget.setAutoFillBackground(True) + self.tableWidget.setLineWidth(1) + self.tableWidget.setAutoScroll(False) + self.tableWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + self.tableWidget.setTabKeyNavigation(False) + self.tableWidget.setProperty("showDropIndicator", False) + self.tableWidget.setDragDropOverwriteMode(False) + self.tableWidget.setAlternatingRowColors(True) + self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection) + self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.tableWidget.setTextElideMode(QtCore.Qt.ElideNone) + self.tableWidget.setWordWrap(False) + self.tableWidget.setCornerButtonEnabled(False) + self.tableWidget.setObjectName(_fromUtf8("tableWidget")) + self.tableWidget.setColumnCount(3) + self.tableWidget.setRowCount(0) + item = QtGui.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtGui.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtGui.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + self.hboxlayout.addWidget(self.tableWidget) + self.gridlayout.addLayout(self.hboxlayout, 0, 0, 1, 1) + + self.retranslateUi(frntd_e) + QtCore.QMetaObject.connectSlotsByName(frntd_e) + + def retranslateUi(self, frntd_e): + frntd_e.setWindowTitle(_translate("frntd_e", "BEAMLINE FRONT END", None)) + self.label.setText(_translate("frntd_e", "ALL CLOSED", None)) + self.pushClose.setText(_translate("frntd_e", "CLOSE ALL", None)) + self.tableWidget.setSortingEnabled(False) + item = self.tableWidget.horizontalHeaderItem(0) + item.setText(_translate("frntd_e", "Beamline", None)) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("frntd_e", "Point Name", None)) + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("frntd_e", "Status", None)) + diff --git a/TCPSserver/README b/TCPSserver/README new file mode 100644 index 0000000..f111021 --- /dev/null +++ b/TCPSserver/README @@ -0,0 +1,20 @@ +Il servzio TCPS viene gestito da un certo numero di istanze differenti con port number assegnato in modo da ripartire il carico, +le uscite da bending - per ora - leggono tutte dalla stessa istanza. + +Le porte vanno assegnate per corrispondere al range di bcs da 1.1 (11) A 11.2 (112) +011 TWIN mIC : 20011 +012 FEL - Nanospectroscopy : 20012 +022 SuperESCA - Escamicroscopy : 20022 +032 VUV photoemission - Spectromicroscopy : 20032 +042 Circularly Polarized : 20042 +052 X-ray diffraction - SAXS : 20052 +061 SYRMEP - MSB : 20061 +062 Gas Phase : 20062 +072 ALOISA : 20072 +081 Lilit - BEAR : 20081 +082 Bach : 20082 +092 APE : 20092 +101 Microfabrication : 20101 +102 Iuvs BaDElph : 20102 +111 Exsafs : 20111 +112 Xrd2 : 20112 (previsto ma non attivato, ci sara' un srver tango diretto) \ No newline at end of file diff --git a/TCPSserver/TCPS2tango.coverage b/TCPSserver/TCPS2tango.coverage new file mode 100644 index 0000000000000000000000000000000000000000..6be62e646ae741c1f75f2a69a24eb48b40ea61f7 GIT binary patch literal 81963 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 D^9#f7 literal 0 HcmV?d00001 diff --git a/TCPSserver/TCPS2tango.py b/TCPSserver/TCPS2tango.py new file mode 100644 index 0000000..4d3ad64 --- /dev/null +++ b/TCPSserver/TCPS2tango.py @@ -0,0 +1,390 @@ +# parse,check,translate TCPS to tango +# and exec tabled actions + + +import string +import sys +import PyTango + +#module wide constants +okmsg = 'Command execution OK' +errmsg_header = '*** ERROR' +term = "\r\n" + + +################################################################################################# +#utilities - taken from tangoclient.py to prpperly convert/assign types to command and attributes +#from strings + +def convertToAttributeValue(pars, info, logger): + logger.debug( 'ConvertToAttribute() entering...') + #val = PyTango.AttributeValue() + #val.name = info.name + logger.debug( 'ConvertToAttribute() entered...') + if info.data_format == PyTango.SCALAR: + if info.data_type == PyTango.DevBoolean: + if pars[0] == '0' or pars[0].lower() == 'false': + value = False + else: + value = True + elif info.data_type == PyTango.DevFloat or info.data_type == PyTango.DevDouble: + value = float(pars[0]) + elif info.data_type == PyTango.ConstDevString or info.data_type == PyTango.DevString or info.data_type == PyTango.DevUChar: + value = pars[0] + elif info.data_type == PyTango.DevLong or info.data_type == PyTango.DevShort or info.data_type == PyTango.DevULong or info.data_type == PyTango.DevUShort: + value = int(pars[0]) + elif info.data_format == PyTango.SPECTRUM: + temp = list() + if info.data_type == PyTango.DevBoolean: + for p in pars: + if p == '0' or p.lower() == 'false': + temp.append(False) + else: + temp.append(True) + elif info.data_type == PyTango.DevFloat or info.data_type == PyTango.DevDouble: + for p in pars: + temp.append(float(p)) + elif info.data_type == PyTango.ConstDevString or info.data_type == PyTango.DevString or info.data_type == PyTango.DevUChar: + temp = pars + elif info.data_type == PyTango.DevLong or info.data_type == PyTango.DevShort or info.data_type == PyTango.DevULong or info.data_type == PyTango.DevUShort: + temp.append(int(p)) + value = temp + return value + +####--------------------------------------------------------------------------------------------- + +def convertToCommandInput(pars, mtype): + if mtype == PyTango.DevBoolean: + if pars[0] == '0' or pars[0].lower() == 'false': + return False + else: + return True + elif mtype == PyTango.DevFloat or mtype == PyTango.DevDouble: + return float(pars[0]) + elif mtype == PyTango.ConstDevString or mtype == PyTango.DevString or mtype == PyTango.DevUChar: + return pars[0] + elif mtype == PyTango.DevLong or mtype == PyTango.DevShort or mtype == PyTango.DevULong or mtype == PyTango.DevUShort: + return int(pars[0]) + + if mtype == PyTango.DevVarBooleanArray: + temp = list() + for p in pars: + if p == '0' or p.lower() == 'false': + temp.append(False) + else: + temp.append(True) + return temp + elif mtype == PyTango.DevVarFloatArray or mtype == PyTango.DevVarDoubleArray: + temp = list() + for p in pars: + temp.append(float(p)) + return temp + elif mtype == PyTango.DevVarStringArray: + return pars + elif mtype == PyTango.DevVarLongArray or mtype == PyTango.DevVarShortArray or mtype == PyTango.DevVarULongArray or mtype == PyTango.DevVarUShortArray: + temp = list() + for p in pars: + temp.append(int(p)) + return temp + else: + return None + + +################################################################################################# + +class ProxyContainer(object): + + """ + This class parses the configuration files, + build the approriate TCPSproxyes and inserts the in a map. + + :version: + :author: + """ + def __init__(self): + #init to empty dictionaries the two main dispatch tables + self.get_dict = {} + self.set_dict = {} + def add_logger(self, addedlogger): + self.logger = addedlogger + def parse_conf_file(self, fname): + """ + + @param string fname : + @return : + @author + """ + self.logger.debug('ProxyContainer.parse_conf_file() parsing: '+fname) + try: + conf_file = open(fname,'r') + except: + self.logger.fatal( 'ProxyContainer.parse_conf_file() fatal error opening conf_file: '+fname) + raise #impossible to continue.... + count = 0 + result = True + for rawline in conf_file.readlines(): + if not rawline.strip(): + continue #discard empty lines + count = count+1 + line=' '.join(rawline.split()) # collapse multiple white spaces into single white space + if(line[0]=='#' or line[0]=='*' or not line.strip()) : #discard comment and empyt lines + continue + datum=string.split(line,' ') + if (datum[0]!='GET' and datum[0] !='SET'): + result = False + self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count) +' '+ datum[0]) + return result + if(datum[0]=='GET'): + if datum[1] not in self.get_dict: + tangostring = datum[-1] + if tangostring.count('->') ==1: + px = ProxyCommand(tangostring.strip(),self.logger) + elif tangostring.count('/') >=3: + px = ProxyAttribute(tangostring.strip(),self.logger) + self.get_dict[datum[1]] = px + else: + result=False + self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count)+' : SET duplicate '+datum[1]) + return result + + if(datum[0]=='SET'): + #create special keys for searching - must include also list of parameter names + skey = datum[1] + for s in datum[2:-1]: + skey = skey+'_'+s + if skey not in self.set_dict: + tangostring = datum[-1] + if tangostring.count('->') ==1: + px = ProxyCommand(tangostring.strip(),self.logger) + elif tangostring.count('/') >=3: + self.logger.debug('Inserting SET attribute '+tangostring.strip()+' with key: '+skey) + px = ProxyAttribute(tangostring.strip(),self.logger) + self.set_dict[skey] = px + else: + result=False + self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count)+' : SET duplicate '+repr(datum)) + return result + + return result + + + def dispatch_call(self, data): + """ + use "data" for finding the appropriate TCPSproxy, then invoches the appropriate + operation to it. + + @param string data : + @return string : + @author + """ + #print 'ProxyContainer: dispacth_call '+data + self.logger.debug('processing '+data) + try: + cleandata=' '.join(data.split()) # collapse multiple white spaces into single white space + selector=string.split(cleandata," ") + self.logger.debug('processing selector ' +selector[0]) + except: + self.logger.error('message not correctly configured:'+data) + return errmsg_header + ' message not correctly configured'+term + try: + if selector[0]=='GET': + if self.get_dict.has_key(selector[1]): + handler=self.get_dict[selector[1]] + resp=handler.get() + if(resp==None): + self.logger.error('not correctly handled: '+data) + return errmsg_header +' not correctly handled'+term + return resp + else: + self.logger.error(selector[1] + ' is not configured as GET point') + return errmsg_header + ' ' +selector[1]+' is not configured as GET point'+term + + elif selector[0]=='SET': + self.logger.debug('processing SET...selector : '+selector[1]) + skey=selector[1] + valuelist=[] + for s in selector[2:]: + arg=s.split(',') + cmd=arg[0] + for v in arg[1:]: + valuelist.append(v) + self.logger.debug('processing SET..adding to valuelist: '+v) + skey=skey+'_'+cmd + self.logger.debug('processing SET...searching for '+skey) + if self.set_dict.has_key(skey): + handler=self.set_dict[skey] + if (handler==None): + self.logger.error('SET: handler not found for: '+skey) + self.logger.debug('processing SET...calling set() for device... ') + resp=handler.set(valuelist) + self.logger.debug('processing SET..set() called or device... ') + if(resp==None): + self.logger.error('not correctly handled: '+data) + return errmsg_header + ' not correctly handled'+term + return resp + else: + self.logger.debug(selector[1] + ' is not configured as SET point') + return errmsg_header +' '+selector[1] +' is not configured as SET point'+term + # first field is neither SET nor GET... error! + self.logger.error('not correctly configured: '+data) + return errmsg_header +' not correctly configured'+term + except: + self.logger.error('exception processing data:' + data) + +########################################################################################## +# 'abstract' class for Proxy Objects +class Proxy(object): + def get(self): + pass + def set(self,data): + pass +########################################################################################## +class ProxyAttribute(Proxy): + def __init__(self, attrname, log): + pos=attrname.rfind('/') + self.__attribute=attrname[(pos+1):].strip() #get read of terminating chrartcers if left + self.__devname=attrname[:pos] + self.__attrinfo=0 + self.logger=log + try: + self.__device=PyTango.DeviceProxy(self.__devname) + #self.__attrinfo=self.__device.get_attribute_config(self.__attribute) + except: + self.logger.error( 'ProxyAttribute.init(): failed to create '+self.__devname+' for: '+attrname) + return None + try: + self.__attrinfo=self.__device.get_attribute_config(self.__attribute) + except: + self.__attrinfo=0 + self.logger.error( 'ProxyAttribute.init(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute) + return None + self.logger.debug('ProxyAttribute init() OK: '+self.__devname+'/'+self.__attribute) + + def get(self): + error=False + if self.__attrinfo==0: + try: + self.logger.debug( 'ProxyAttribute.get(): getting attr config for : '+self.__devname+'/'+self.__attribute) + self.__attrinfo=self.__device.get_attribute_config(self.__attribute) + except: + self.logger.error( 'ProxyAttribute.get(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute) + self.__attrinfo=0 + error=True + #rstat='BEN-------' #simplicistic error notification ! + #resp='R'+','+'?'+','+rstat+','+0+term + return 'R,?,BEN------,0'+term + try: + #self.logger.debug( 'ProxyAttribute.get(): reading : '+self.__devname) + attr=self.__device.read_attribute(self.__attribute) #read_attribute_as_string ???? + val=attr.value + #self.logger.debug( 'ProxyAttribute.get(): reading value ok') + except PyTango.DevFailed,myex: + des0=myex[0].desc + self.logger.error ('GET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0) + #print 'ProxyAttribute: get() '+self.__attribute+' ERROR' + val=0 + error=True + + # analyze result and prepare answer + rtype='?' + racq='R' #fixed + if self.__attrinfo.data_format == PyTango.SCALAR: + if self.__attrinfo.data_type == PyTango.DevBoolean: + rtype='D' + if val: + rvalue='1,'+self.__attrinfo.unit + else: + rvalue='0,'+self.__attrinfo.unit + if self.__attrinfo.data_type == PyTango.DevDouble or self.__attrinfo.data_type == PyTango.DevFloat: + self.logger.debug( 'ProxyAttribute.get(): processing float...') + rtype='A' + rvalue=self.__attrinfo.format % val + ','+self.__attrinfo.unit + self.logger.debug( 'ProxyAttribute.get(): processing float:'+rvalue) + if self.__attrinfo.data_type == PyTango.DevLong or self.__attrinfo.data_type == PyTango.DevShort or self.__attrinfo.data_type == PyTango.DevULong or self.__attrinfo.data_type == PyTango.DevUShort: + rtype='I' + rvalue=self.__attrinfo.format % val + ','+self.__attrinfo.unit + if self.__attrinfo.data_type== 19: #pyTango.DevState + rtype='I' + rvalue= '%d'% int(val) + ','+self.__attrinfo.unit + if(error): + rstat='BEN-------' #simplicistic error notification ! + else: + rstat='----------' + elif self.__attrinfo.data_format == PyTango.SPECTRUM and self.__attrinfo.data_type == PyTango.DevBoolean: + # special handling of bool spectrum - which are turned into bit masks or Bitmap + rtype='B' + longval=0 + mask=0x1 + count = 0 + #if self.__attrinfo.writable==PyTango._PyTango.AttrWriteType.READ_WRITE : + numbits=attr.dim_x #make sure to get ALWAY the Read values, also with READ_WRITE attributes + + if self.__devname.rfind('vlvfe') > 0: #workaround for different bitmaps of new valves. Dirty but... C.S. nov. 2016 + numbits=3 #show only open close local bits - better solution must implelemented + + for p in val: + count = count + 1 + if count >32 or count > numbits: + break + # stuff bits into bitmap - max 64 bits + + if p: + longval= longval | mask + mask = mask << 1 + rvalue= '%d' % longval +','+self.__attrinfo.unit + if(error): + rstat='BEN-------' #simplicistic error notification ! + else: + rstat='----------' + resp=racq+','+rtype+','+rstat+','+rvalue+term + self.logger.debug( 'ProxyAttribute.get(): about to return:'+resp) + return resp + + +#------------------------------------------------------------------ +# set takes value in imput - use python list for arrays + def set(self,data): + self.logger.debug( 'ProxyAttribute.set() entering for '+self.__devname+'/'+self.__attribute) + if self.__attrinfo==0: + try: + self.__attrinfo=self.__device.get_attribute_config(self.__attribute) + except PyTango.DevFailed,e: + des=e[0].desc + errmsg= errmsg_header+ ' in perform command : '+des + self.logger.error( 'ProxyAttribute.set(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute) + self.__attrinfo=0 + return errmsg+des+term + try: + #self.logger.debug( 'ProxyAttribute.set(): converting attribute for '+self.__devname+'/'+self.__attribute) + val=convertToAttributeValue(data,self.__attrinfo,self.logger) + self.logger.debug( 'ProxyAttribute.set(): for '+self.__devname+'/'+self.__devname+'/'+self.__attribute) + self.__device.write_attribute(self.__attrinfo,val) + self.logger.info( 'SET: ACCEPT'+self.__devname+'/'+self.__attribute+' '+data[0]) + return okmsg+term + except PyTango.DevFailed,myex: + des0=myex[0].desc + self.logger.debug ('SET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0) + msg = errmsg_header +' in perform command : ' + self.logger.debug('msg:'+msg) + if des0.find('RESPINTA')>1: + msg = errmsg_header + ' in access violation : ' + self.logger.info( 'SET: REJECT '+self.__devname+'/'+self.__attribute+' '+data[0]) + else: + msg = errmsg_header + ' in perform command : ' + self.logger.info ('SET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0) + return msg+des0+term + + +######################################################################################## +class ProxyCommand(Proxy): + def __init__(self,cmdname,log): + pos=cmdname.rfind('->') + self.__command=cmdname[(pos+2):].strip() + self.__devname=cmdname[:pos] + self.logger=log + try: + self.__device=PyTango.DeviceProxy(self.__devname) + self.type=self.__device.command_query(self.__command) + except: + self.logger.error('ProxyCommand(): failed to create '+self.__devname) +######################################################################################## diff --git a/TCPSserver/TCPSserver.e4p b/TCPSserver/TCPSserver.e4p new file mode 100644 index 0000000..7ec4265 --- /dev/null +++ b/TCPSserver/TCPSserver.e4p @@ -0,0 +1,260 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE Project SYSTEM "Project-4.6.dtd"> +<!-- eric4 project file for project TCPSserver --> +<!-- Saved: 2012-02-24, 14:20:40 --> +<!-- Copyright (C) 2012 , --> +<Project version="4.6"> + <Language></Language> + <ProgLanguage mixed="0">Python</ProgLanguage> + <ProjectType>Console</ProjectType> + <Description></Description> + <Version>0.1</Version> + <Author></Author> + <Email></Email> + <Sources> + <Source>TCPStwserver.py</Source> + <Source>TCPS2tango.py</Source> + </Sources> + <Forms> + </Forms> + <Translations> + </Translations> + <Resources> + </Resources> + <Interfaces> + </Interfaces> + <Others> + </Others> + <MainScript>TCPStwserver.py</MainScript> + <Vcs> + <VcsType>CVS</VcsType> + <VcsOptions> + <dict> + <key> + <string>add</string> + </key> + <value> + <list> + <string></string> + </list> + </value> + <key> + <string>checkout</string> + </key> + <value> + <list> + <string></string> + </list> + </value> + <key> + <string>commit</string> + </key> + <value> + <list> + <string></string> + </list> + </value> + <key> + <string>diff</string> + </key> + <value> + <list> + <string>-u3</string> + <string>-p</string> + </list> + </value> + <key> + <string>export</string> + </key> + <value> + <list> + <string></string> + </list> + </value> + <key> + <string>global</string> + </key> + <value> + <list> + <string>-f</string> + <string>-z3</string> + </list> + </value> + <key> + <string>history</string> + </key> + <value> + <list> + <string>-e</string> + <string>-a</string> + </list> + </value> + <key> + <string>log</string> + </key> + <value> + <list> + <string></string> + </list> + </value> + <key> + <string>remove</string> + </key> + <value> + <list> + <string>-f</string> + </list> + </value> + <key> + <string>status</string> + </key> + <value> + <list> + <string>-v</string> + </list> + </value> + <key> + <string>tag</string> + </key> + <value> + <list> + <string>-c</string> + </list> + </value> + <key> + <string>update</string> + </key> + <value> + <list> + <string>-dP</string> + </list> + </value> + </dict> + </VcsOptions> + <VcsOtherData> + <dict> + </dict> + </VcsOtherData> + </Vcs> + <FiletypeAssociations> + <FiletypeAssociation pattern="*.pyw" type="SOURCES" /> + <FiletypeAssociation pattern="*.idl" type="INTERFACES" /> + <FiletypeAssociation pattern="*.py" type="SOURCES" /> + <FiletypeAssociation pattern="*.ptl" type="SOURCES" /> + </FiletypeAssociations> + <Checkers> + <CheckersParams> + <dict> + <key> + <string>PYLINT</string> + </key> + <value> + <dict> + <key> + <string>dialogReport</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableBasic</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableClasses</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableDesign</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableExceptions</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableFormat</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableImports</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableMetrics</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableMiscellaneous</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableNewstyle</string> + </key> + <value> + <bool>False</bool> + </value> + <key> + <string>enableRPython</string> + </key> + <value> + <bool>False</bool> + </value> + <key> + <string>enableSimilarities</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableTypecheck</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>enableVariables</string> + </key> + <value> + <bool>True</bool> + </value> + <key> + <string>htmlReport</string> + </key> + <value> + <bool>False</bool> + </value> + <key> + <string>reportFile</string> + </key> + <value> + <unicode>pylint.html</unicode> + </value> + <key> + <string>txtReport</string> + </key> + <value> + <bool>False</bool> + </value> + </dict> + </value> + </dict> + </CheckersParams> + </Checkers> +</Project> \ No newline at end of file diff --git a/TCPSserver/TCPStwserver.py b/TCPSserver/TCPStwserver.py new file mode 100755 index 0000000..d9368be --- /dev/null +++ b/TCPSserver/TCPStwserver.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# TCPS server-bridge based on twisted +from twisted.internet.protocol import Protocol, Factory +from twisted.internet import reactor +import time +import sys +import TCPS2tango +import logging +import logging.handlers + +#obsolete! must be switched to argparse +import optparse + +global_logging=logging.getLogger('TCPS') +# there should be a cleaner way ... but now I use a GLOBAL..... +#-------------------------------------------------------------- + +class twistedTCPS(Protocol): + 'adapter of TCPS protocol for twisted package' + def __init__(self): + self.__myname='default TCPS server' + def connectionMade(self): + if(self.factory._timeout): + self.transport.socket.settimeout(self.factory._timeout) # it is possible to set timeouts!! + self.__peer=self.transport.getPeer() + global_logging.info ('new connection: ' + self.__peer.host + ':' + repr(self.__peer.port)) + + def connectionLost(self, reason): + self.transport.loseConnection() + global_logging.info('connection closed/lost: ' + self.__peer.host + ':' + repr(self.__peer.port)) + + def dataReceived(self, data): + try: + resp=self.factory.handler.dispatch_call(data.strip()) + self.transport.write(resp) + except: + global_logging.error ('exception writing data to ' + self.__peer.host + ':' + repr(self.__peer.port)) + +# method to associate TCPS object and other initialization data +def makeTCPSFactory(fname,logger,timeout=None,): + factory=Factory() + factory.protocol=twistedTCPS + factory._fname=fname + factory._timeout=timeout + factory.handler=TCPS2tango.ProxyContainer() + factory.handler.add_logger(logger) + factory.handler.parse_conf_file(fname) + + return factory + +#----------------------------------------------------------------- +#remeber to switch use argparse for configuring cmd line options with python > 2.7 + +def main(argv=None): + if argv is None: + argv = sys.argv # argv for initializing , etc + + #parse comnd line and prepare optinal arguments + parser = optparse.OptionParser(description='TCPStwserver options') + parser.add_option('-f','--configfile',help='config_file') + parser.add_option('-p', '--port', help='tpc port number [20000]') + parser.add_option('-l','--logfile',help='log_file') + parser.add_option('-v','--loglevel',help='log_level [debug|info|warning|error|critical]') + parser.add_option('-s','--logsize',help='log_file_size') + parser.add_option('-V','--verbose',help='echo debug to console') + (options,argmy) = parser.parse_args() + if options.configfile: + fname=options.configfile + else: + print 'usage: '+sys.argv[0] + ' --configfile= ' + return 1 + + if options.port: + tcpport=int(options.port) + else: + tcpport=20000 + + if options.logfile: + lfile=options.logfile + else: + lfile='/dev/null' + + if options.loglevel: + lev=options.loglevel + level=-1 + if lev=='debug': + level=logging.DEBUG + elif lev=='info': + level=logging.INFO + elif lev=='warning': + level=logging.WARNING + elif lev=='error': + level=logging.ERROR + elif lev=='critical': + level=logging.CRITICAL + elif lev=='notset': + level==logging.NOTSET + else: + lev='notset' + level=logging.NOTSET + + if options.logsize: + mBytes=int(options.logsize) + else: + mBytes=2196608 + + if options.verbose: + verbose=True + else: + verbose=False + + # Set up a specific logger with our desired output level + # use INFO for for tracking all SET operations + # use ERROR and CRITICAL for errors (non-fatal and fatal) + # use INFO and DEBUG for diagnostics + # info is set with -V + #debug is set + logger = logging.getLogger('TCPS') + logger.setLevel(level) #default level is NOTSET + formatter = logging.Formatter("%(asctime)s\t%(levelname)s\t%(message)s") + + # Add the log message handler to the logger + handler = logging.handlers.RotatingFileHandler(lfile, maxBytes=mBytes, backupCount=5) + + # create and add formatter to logger + handler.setFormatter(formatter) + + logger.addHandler(handler) + + if verbose: + ch = logging.StreamHandler() + ch.setLevel(level) + ch.setFormatter(formatter) + logger.addHandler(ch) + logger.info('debug echo to console') + + # use special builder to associate our data to TCPS object + # extra arguments are: + # 'internal name' + # timeout for network calls + logger.info('using config file '+fname) + factory=makeTCPSFactory(fname,logger) + + # 20000 is the port assigned to TPCS - 30 seconds timeount + reactor.listenTCP(tcpport, factory,30.0) + # we can also open on multiple ports, just make another instance another reactor object + #reactor.listenTCP(30000, factory,30.0) + logger.debug('entering loop') + reactor.run() + logger.debug('exit loop') +if __name__ == "__main__": + sys.exit(main()) diff --git a/TCPSserver/TODO b/TCPSserver/TODO new file mode 100644 index 0000000..c727ff6 --- /dev/null +++ b/TCPSserver/TODO @@ -0,0 +1,2 @@ +- analizzare "exception processing data" +- Transient CORBA excpetion:come si alza il timeout? \ No newline at end of file diff --git a/TCPSserver/elettrabcsbridge.cfg b/TCPSserver/elettrabcsbridge.cfg new file mode 100644 index 0000000..e7dd976 --- /dev/null +++ b/TCPSserver/elettrabcsbridge.cfg @@ -0,0 +1,329 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P120S012 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S1.7_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P120S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.03/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P120S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P120S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.03/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P120S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.07/Pressure +GET 022F_MACHINE_MACHINE_1_P120S022 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S2.7_PRES_RR +GET 032F_MACHINE_MACHINE_1_P120S032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s03.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P120S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s04.07/Pressure +GET 052F_MACHINE_MACHINE_1_P120S052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S5.7_PRES_RR +GET 061F_MACHINE_MACHINE_1_P120S061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.3_PRES_RR +GET 062F_MACHINE_MACHINE_1_P120S062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.7_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P120S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.3_PRES_RR +GET 072F_MACHINE_MACHINE_1_P120S072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.7_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P120S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.3_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P120S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.7_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P120S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s09.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.01/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.02/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.01/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.02/Pressure +GET 022F_MACHINE_MACHINE_1_P400S022 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S2.2_PRES_RR +GET 032F_MACHINE_MACHINE_1_P400S032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s03.02/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s04.02/Pressure +GET 052F_MACHINE_MACHINE_1_P400S052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S5.2_PRES_RR +GET 061F_MACHINE_MACHINE_1_P400S061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.1_PRES_RR +GET 062F_MACHINE_MACHINE_1_P400S062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.2_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.1_PRES_RR +GET 072F_MACHINE_MACHINE_1_P400S072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.2_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.1_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.2_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s09.02/Pressure + + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE012 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S1.2_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s11.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s12.2/StatRF +GET 022F_MACHINE_MACHINE_1_VALVE022 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S2.2_STAT_RF +GET 032F_MACHINE_MACHINE_1_VALVE032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s3.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s4.2/StatRF +GET 052F_MACHINE_MACHINE_1_VALVE052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S5.2_STAT_RF +GET 061F_MACHINE_MACHINE_1_VALVE061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.1_STAT_RF +GET 062F_MACHINE_MACHINE_1_VALVE062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.2_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.1_STAT_RF +GET 072F_MACHINE_MACHINE_1_VALVE072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.2_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.1_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.2_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF +GET FRONTEND_MACHINE_MACHINE_1_VALVE092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s9.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVB011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvbe_s1/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.2/StatRF +GET 022F_MACHINE_MACHINE_1_SHUT022 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s2.2/StatRF +GET 032F_MACHINE_MACHINE_1_SHUT032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s3.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s4.2/StatRF +GET 052F_MACHINE_MACHINE_1_SHUT052 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s5.2/StatRF +GET 061F_MACHINE_MACHINE_1_SHUT061 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.1/StatRF +GET 062F_MACHINE_MACHINE_1_SHUT062 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.1/StatRF +GET 072F_MACHINE_MACHINE_1_SHUT072 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.2/StatRF + +#beam positions and angles at centre of straigth sections +GET 012F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S1 +GET 012F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S1 +GET 012F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S1 +GET 012F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S1 + +GET 022F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S2 +GET 022F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S2 +GET 022F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S2 +GET 022F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S2 + + +GET 032F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S3 +GET 032F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S3 +GET 032F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S3 +GET 032F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S3 + + +GET 042F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S4 +GET 042F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S4 +GET 042F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S4 +GET 042F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S4 + +GET 052F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S5 +GET 052F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S5 +GET 052F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S5 +GET 052F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S5 + +GET 062F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S6 +GET 062F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S6 +GET 062F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S6 +GET 062F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S6 + + +GET 072F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S7 +GET 072F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S7 +GET 072F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S7 +GET 072F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S7 + +GET 082F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S8 +GET 082F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S8 +GET 082F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S8 +GET 082F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S8 + +GET 092F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S9 +GET 092F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S9 +GET 092F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S9 +GET 092F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S9 + +GET 102F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S10 +GET 102F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S10 +GET 102F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S10 +GET 102F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S10 + +GET 112F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S11 +GET 112F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S11 +GET 112F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S11 +GET 112F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S11 +#beam positions and angles at exit of bending magnets + +GET 061F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B6 +GET 061F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B6 +GET 061F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B6 +GET 061F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B6 + +GET 071F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B7 +GET 071F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B7 +GET 071F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B7 +GET 071F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B7 + +GET 081F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B8 +GET 081F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B8 +GET 081F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B8 +GET 081F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B8 + +GET 091F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B9 +GET 091F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B9 +GET 091F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B9 +GET 091F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B9 + +GET 101F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B10 +GET 101F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B10 +GET 101F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B10 +GET 101F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B10 + +GET 111F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B11 +GET 111F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B11 +GET 111F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B11 +GET 111F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B11 + +#beam positions and angles at short straight sections + + +GET 011F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_SS1 +GET 011F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_SS1 +GET 011F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_SS1 +GET 011F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_SS1 + +#ID1 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP011 sr/id/id_s1.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP012 sr/id/id_s1.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_PHA011 sr/id/id_s1.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA012 sr/id/id_s1.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS011 sr/id/id_s1.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS012 sr/id/id_s1.2/StatRF + +#ID1 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP011 GAP011 sr/id/id_s1.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP012 GAP012 sr/id/id_s1.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_PHA011 PHA011 sr/id/id_s1.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA012 PHA012 sr/id/id_s1.2/Phase + +#PSMOD1 readings +GET FRONTEND_MACHINE_MACHINE_1_IM012 sr/id/psmod_s1/Current +GET FRONTEND_MACHINE_MACHINE_1_M012 sr/id/psmod_s1/StatRF + +#PSMOD1 settings +SET FRONTEND_MACHINE_MACHINE_1_IM012 IM012 sr/id/psmod_s1/Current + + +#ID2 readings +GET 022F_MACHINE_MACHINE_1_GAP021 blproxy/id/id_s2/Gap +GET 022F_MACHINE_MACHINE_1_TAP021 blproxy/id/id_s2/Tapering +GET 022F_MACHINE_MACHINE_1_GAPS020 blproxy/id/id_s2/StatRF + +#ID2 settings +SET 022F_MACHINE_MACHINE_1_GAP021 VALGAP blproxy/id/id_s2/Gap +SET 022F_MACHINE_MACHINE_1_TAP021 VALGAP blproxy/id/id_s2/Tapering + + +#ID3 readings +GET 032F_MACHINE_MACHINE_1_GAP031 sr/id/id_s3/Gap1 +GET 032F_MACHINE_MACHINE_1_GAP032 sr/id/id_s3/Gap2 +GET 032F_MACHINE_MACHINE_1_GAP033 sr/id/id_s3/Gap3 +GET 032F_MACHINE_MACHINE_1_GAPS030 sr/id/id_s3/StatRF + +#ID3 settings +SET 032F_MACHINE_MACHINE_1_GAP031 GAP031 sr/id/id_s3/Gap1 +SET 032F_MACHINE_MACHINE_1_GAP032 GAP032 sr/id/id_s3/Gap2 +SET 032F_MACHINE_MACHINE_1_GAP033 GAP033 sr/id/id_s3/Gap3 +SET 032F_MACHINE_MACHINE_1_GAP030 VALUE sr/id/id_s3/Gapall + +#ID4 readings +GET FRONTEND_MACHINE_MACHINE_1_IHSET042 sr/id/id_s4/CurrentH +GET FRONTEND_MACHINE_MACHINE_1_IVSET042 sr/id/id_s4/CurrentV +GET FRONTEND_MACHINE_MACHINE_1_IVSTAT042 sr/id/id_s4/StatRF +GET FRONTEND_MACHINE_MACHINE_1_IHSTAT042 sr/id/id_s4/StatRF +GET PSEWH_S4_CURSET_RR sr/id/id_s4/CurrentH +GET PSEWV_S4_CURSET_RR sr/id/id_s4/CurrentV +GET PSEWV_S4_STAT_RF sr/id/id_s4/StatRF +GET PSEWH_S4_STAT_RF sr/id/id_s4/StatRF + +#id4 settings +SET FRONTEND_MACHINE_MACHINE_1_IHSET042 GAP040 sr/id/id_s4/CurrentH +SET FRONTEND_MACHINE_MACHINE_1_IVSET042 GAP041 sr/id/id_s4/CurrentV + +#ID5 readings +GET 052F_MACHINE_MACHINE_1_GAP051 sr/id/id_s5/Gap1 +GET 052F_MACHINE_MACHINE_1_GAP052 sr/id/id_s5/Gap2 +GET 052F_MACHINE_MACHINE_1_GAP053 sr/id/id_s5/Gap3 +GET 052F_MACHINE_MACHINE_1_GAPS050 sr/id/id_s5/StatRF + +#ID6 readings +GET 062F_MACHINE_MACHINE_1_GAP061 sr/id/id_s6/Gap1 +GET 062F_MACHINE_MACHINE_1_GAP062 sr/id/id_s6/Gap2 +GET 062F_MACHINE_MACHINE_1_GAP063 sr/id/id_s6/Gap3 +GET 062F_MACHINE_MACHINE_1_GAPS060 sr/id/id_s6/StatRF + +#ID6 settings +SET 062F_MACHINE_MACHINE_1_GAP061 GAP061 sr/id/id_s6/Gap1 +SET 062F_MACHINE_MACHINE_1_GAP062 GAP062 sr/id/id_s6/Gap2 +SET 062F_MACHINE_MACHINE_1_GAP063 GAP063 sr/id/id_s6/Gap3 +SET 062F_MACHINE_MACHINE_1_GAP060 VALUE sr/id/id_s6/Gapall + +#ID7 readings +GET 072F_MACHINE_MACHINE_1_POS072 blproxy/id/id_s7/UserPosition +GET 072F_MACHINE_MACHINE_1_STAT070 blproxy/id/id_s7/StatRF + +#ID7 settings +SET 072F_MACHINE_MACHINE_1_POS072 VALUE blproxy/id/id_s7/UserPosition + +#ID8 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP081 sr/id/id_s8.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP082 sr/id/id_s8.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_TAP081 sr/id/id_s8.1/Taper +GET FRONTEND_MACHINE_MACHINE_1_TAP082 sr/id/id_s8.2/Taper +GET FRONTEND_MACHINE_MACHINE_1_PHA081 sr/id/id_s8.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA082 sr/id/id_s8.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS081 sr/id/id_s8.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS082 sr/id/id_s8.2/StatRF + +#ID8 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP081 GAP081 sr/id/id_s8.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP082 GAP082 sr/id/id_s8.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_TAP081 TAP081 sr/id/id_s8.1/Taper +SET FRONTEND_MACHINE_MACHINE_1_TAP082 TAP082 sr/id/id_s8.2/Taper +SET FRONTEND_MACHINE_MACHINE_1_PHA081 PHA081 sr/id/id_s8.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA082 PHA082 sr/id/id_s8.2/Phase + + +#ID9 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP091 sr/id/id_s9.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP092 sr/id/id_s9.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_TAP091 sr/id/id_s9.1/Taper +GET FRONTEND_MACHINE_MACHINE_1_TAP092 sr/id/id_s9.2/Taper +GET FRONTEND_MACHINE_MACHINE_1_PHA091 sr/id/id_s9.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA092 sr/id/id_s9.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS091 sr/id/id_s9.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS092 sr/id/id_s9.2/StatRF + +#ID9 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP091 GAP091 sr/id/id_s9.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP092 GAP092 sr/id/id_s9.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_TAP091 TAP091 sr/id/id_s9.1/Taper +SET FRONTEND_MACHINE_MACHINE_1_TAP092 TAP092 sr/id/id_s9.2/Taper +SET FRONTEND_MACHINE_MACHINE_1_PHA091 PHA091 sr/id/id_s9.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA092 PHA092 sr/id/id_s9.2/Phase + +#ID10 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP101 sr/id/id_s10.1/Gap1 +GET FRONTEND_MACHINE_MACHINE_1_GAP102 sr/id/id_s10.2/Gap1 +GET FRONTEND_MACHINE_MACHINE_1_GAPS101 sr/id/id_s10.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS102 sr/id/id_s10.2/StatRF +#ID10 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP101 VALGAP sr/id/id_s10.1/Gap1 +SET FRONTEND_MACHINE_MACHINE_1_GAP102 VALGAP sr/id/id_s10.2/Gap1 + +#ID12 twin apu readings +GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS sr/id/id_s12.01/UserPositionHigh +GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS sr/id/id_s12.01/UserPositionLow +GET FRONTEND_MACHINE_MACHINE_1_LOWEN011 sr/id/id_s12.01/LowEnergy +GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011 sr/id/id_s12.01/HighEnergy +GET FRONTEND_MACHINE_MACHINE_1_GAPS010 sr/id/id_s12.01/StatRF + +#ID12 twin apu settings +SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS LOWENPOS sr/id/id_s12.01/UserPositionLow +SET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS HIGHENPOS sr/id/id_s12.01/UserPositionHigh diff --git a/TCPSserver/elettrabcsbridge011.cfg b/TCPSserver/elettrabcsbridge011.cfg new file mode 100644 index 0000000..4b9694e --- /dev/null +++ b/TCPSserver/elettrabcsbridge011.cfg @@ -0,0 +1,49 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current + +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy + +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits + +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure + +GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF + +GET 011F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_SS1 + +GET 011F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_SS1 + +GET 011F_MACHINE_MACHINE_1_XANGL sr/diagnostics/bpmid/XP_SS1 + +GET 011F_MACHINE_MACHINE_1_YANGL sr/diagnostics/bpmid/YP_SS1 + +#ID12 twin apu readings +GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS sr/id/id_s12.01/UserPositionHigh + +GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS sr/id/id_s12.01/UserPositionLow + +GET FRONTEND_MACHINE_MACHINE_1_LOWEN011 sr/id/id_s12.01/LowEnergy + +GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011 sr/id/id_s12.01/HighEnergy + +GET FRONTEND_MACHINE_MACHINE_1_GAPS010 sr/id/id_s12.01/StatRF + +#ID12 twin apu settings +SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS LOWENPOS sr/id/id_s12.01/UserPositionLow +SET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS HIGHENPOS sr/id/id_s12.01/UserPositionHigh diff --git a/TCPSserver/elettrabcsbridge011.cfg.old b/TCPSserver/elettrabcsbridge011.cfg.old new file mode 100644 index 0000000..b4b4de6 --- /dev/null +++ b/TCPSserver/elettrabcsbridge011.cfg.old @@ -0,0 +1,48 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current + +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy + +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits + +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_USERBEAM tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure + +GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF + +GET 011F_MACHINE_MACHINE_1_XPOS011 sr/diagnostics/bpmid/X_S1 + +GET 011F_MACHINE_MACHINE_1_YPOS011 sr/diagnostics/bpmid/Y_S1 + +GET 011F_MACHINE_MACHINE_1_XANGL011 sr/diagnostics/bpmid/XP_S1 + +GET 011F_MACHINE_MACHINE_1_YANGL011 sr/diagnostics/bpmid/YP_S1 + +#ID12 twin apu readings +GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS sr/id/id_s12.01/UserPositionHigh + +GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS sr/id/id_s12.01/UserPositionLow + +GET FRONTEND_MACHINE_MACHINE_1_LOWEN011 sr/id/id_s12.01/LowEnergy + +GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011 sr/id/id_s12.01/HighEnergy + +GET FRONTEND_MACHINE_MACHINE_1_GAPS010 sr/id/id_s12.01/StatRF + +#ID12 twin apu settings +SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS LOWENPOS sr/id/id_s12.01/UserPositionLow diff --git a/TCPSserver/elettrabcsbridge012.cfg b/TCPSserver/elettrabcsbridge012.cfg new file mode 100644 index 0000000..0adf607 --- /dev/null +++ b/TCPSserver/elettrabcsbridge012.cfg @@ -0,0 +1,55 @@ +#configuration file for elettra-Tango to BCS bridge - FEL - Nanospectroscopy : 20012 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure +#questo puo' essere diffente dal vecchio SIP400_S1.2_PRES_RR che non esiet piu' + + +#front-end VLVFE readings +#GET FRONTEND_MACHINE_MACHINE_1_VALVE01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF +GET FRONTEND_MACHINE_MACHINE_1_VALVE012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.2/StatRF + +#front-end PHOTON SHUTTER readings +#GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.2/StatRF + + +#beam positions and angles at centre of straigth sections +GET 012F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S1 +GET 012F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S1 +GET 012F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S1 +GET 012F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S1 + +#ID1 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP011 sr/id/id_s1.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP012 sr/id/id_s1.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_PHA011 sr/id/id_s1.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA012 sr/id/id_s1.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS011 sr/id/id_s1.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS012 sr/id/id_s1.2/StatRF + +#ID1 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP011 GAP011 sr/id/id_s1.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP012 GAP012 sr/id/id_s1.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_PHA011 PHA011 sr/id/id_s1.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA012 PHA012 sr/id/id_s1.2/Phase + +#PSMOD1 readings +GET FRONTEND_MACHINE_MACHINE_1_IM012 sr/id/psmod_s1/Current +GET FRONTEND_MACHINE_MACHINE_1_M012 sr/id/psmod_s1/StatRF + +#PSMOD1 settings +SET FRONTEND_MACHINE_MACHINE_1_IM012 IM012 sr/id/psmod_s1/Current diff --git a/TCPSserver/elettrabcsbridge022.cfg b/TCPSserver/elettrabcsbridge022.cfg new file mode 100644 index 0000000..c46fa11 --- /dev/null +++ b/TCPSserver/elettrabcsbridge022.cfg @@ -0,0 +1,45 @@ +#configuration file for elettra-Tango to BCS bridge 022 SuperESCA - Escamicroscopy : 20022 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET 022F_MACHINE_MACHINE_1_P120S022 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s02.07/Pressure +GET 022F_MACHINE_MACHINE_1_P400S022 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s02.02/Pressure + +#front-end VLVFE readings +GET 022F_MACHINE_MACHINE_1_VALVE022 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s2.2/StatRF + +#front-end PHOTON SHUTTER readings +GET 022F_MACHINE_MACHINE_1_SHUT022 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s2.2/StatRF + + +#beam positions and angles at centre of straigth sections + +GET 022F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S2 +GET 022F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S2 +GET 022F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S2 +GET 022F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S2 + + + +#beam positions and angles at short straight sections + + +#ID2 readings +GET 022F_MACHINE_MACHINE_1_GAP021 blproxy/id/id_s2/Gap +GET 022F_MACHINE_MACHINE_1_TAP021 blproxy/id/id_s2/Tapering +GET 022F_MACHINE_MACHINE_1_GAPS020 blproxy/id/id_s2/StatRF + +#ID2 settings +SET 022F_MACHINE_MACHINE_1_GAP021 VALGAP blproxy/id/id_s2/Gap +SET 022F_MACHINE_MACHINE_1_TAP021 VALGAP blproxy/id/id_s2/Tapering diff --git a/TCPSserver/elettrabcsbridge032.cfg b/TCPSserver/elettrabcsbridge032.cfg new file mode 100644 index 0000000..1bd2551 --- /dev/null +++ b/TCPSserver/elettrabcsbridge032.cfg @@ -0,0 +1,45 @@ +#configuration file for elettra-Tango to BCS bridge 032 VUV photoemission - Spectromicroscopy : 20032 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET 032F_MACHINE_MACHINE_1_P120S032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s03.07/Pressure +GET 032F_MACHINE_MACHINE_1_P400S032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s03.02/Pressure + +#front-end VLVFE readings + +GET 032F_MACHINE_MACHINE_1_VALVE032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s3.2/StatRF + +#front-end PHOTON SHUTTER readings + +GET 032F_MACHINE_MACHINE_1_SHUT032 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s3.2/StatRF + + +#beam positions and angles at centre of straigth sections + +GET 032F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S3 +GET 032F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S3 +GET 032F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S3 +GET 032F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S3 + +#ID3 readings +GET 032F_MACHINE_MACHINE_1_GAP031 sr/id/id_s3/Gap1 +GET 032F_MACHINE_MACHINE_1_GAP032 sr/id/id_s3/Gap2 +GET 032F_MACHINE_MACHINE_1_GAP033 sr/id/id_s3/Gap3 +GET 032F_MACHINE_MACHINE_1_GAPS030 sr/id/id_s3/StatRF + +#ID3 settings +SET 032F_MACHINE_MACHINE_1_GAP031 GAP031 sr/id/id_s3/Gap1 +SET 032F_MACHINE_MACHINE_1_GAP032 GAP032 sr/id/id_s3/Gap2 +SET 032F_MACHINE_MACHINE_1_GAP033 GAP033 sr/id/id_s3/Gap3 +SET 032F_MACHINE_MACHINE_1_GAP030 VALUE sr/id/id_s3/Gapall diff --git a/TCPSserver/elettrabcsbridge042.cfg b/TCPSserver/elettrabcsbridge042.cfg new file mode 100644 index 0000000..745fcce --- /dev/null +++ b/TCPSserver/elettrabcsbridge042.cfg @@ -0,0 +1,50 @@ +#configuration file for elettra-Tango to BCS bridge 042 Circularly Polarized : 20042 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s04.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s04.02/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s4.2/StatRF + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s4.2/StatRF + +#beam positions and angles at centre of straigth sections + +GET 042F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S4 +GET 042F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S4 +GET 042F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S4 +GET 042F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S4 + + +#ID4 readings +GET FRONTEND_MACHINE_MACHINE_1_IH042 sr/id/id_s4/CurrentH +GET FRONTEND_MACHINE_MACHINE_1_IV042 sr/id/id_s4/CurrentV +GET FRONTEND_MACHINE_MACHINE_1_IHSET042 sr/id/id_s4/CurrentH +GET FRONTEND_MACHINE_MACHINE_1_IVSET042 sr/id/id_s4/CurrentV +GET FRONTEND_MACHINE_MACHINE_1_IVST042 sr/id/id_s4/FlagV +GET FRONTEND_MACHINE_MACHINE_1_IHST042 sr/id/id_s4/FlagH +GET PSEWH_S4_CURSET_RR sr/id/id_s4/CurrentH +GET PSEWV_S4_CURSET_RR sr/id/id_s4/CurrentV +GET PSEWV_S4_STAT_RF sr/id/id_s4/FlagV +GET PSEWH_S4_STAT_RF sr/id/id_s4/FlagH + +#id4 settings +SET FRONTEND_MACHINE_MACHINE_1_IH042 GAP040 sr/id/id_s4/CurrentH +SET FRONTEND_MACHINE_MACHINE_1_IV042 GAP041 sr/id/id_s4/CurrentV +SET FRONTEND_MACHINE_MACHINE_1_IHSET042 GAP040 sr/id/id_s4/CurrentH +SET FRONTEND_MACHINE_MACHINE_1_IVSET042 GAP041 sr/id/id_s4/CurrentV diff --git a/TCPSserver/elettrabcsbridge052.cfg b/TCPSserver/elettrabcsbridge052.cfg new file mode 100644 index 0000000..eba374a --- /dev/null +++ b/TCPSserver/elettrabcsbridge052.cfg @@ -0,0 +1,40 @@ +#configuration file for elettra-Tango to BCS bridge 052 X-ray diffraction - SAXS : 20052 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + + +GET 052F_MACHINE_MACHINE_1_P120S052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S5.7_PRES_RR +GET 052F_MACHINE_MACHINE_1_P400S052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S5.2_PRES_RR + + + +#front-end VLVFE readings +GET 052F_MACHINE_MACHINE_1_VALVE052 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S5.2_STAT_RF + +#front-end PHOTON SHUTTER readings +GET 052F_MACHINE_MACHINE_1_SHUT052 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s5.2/StatRF + +#beam positions and angles at centre of straigth sections + +GET 052F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S5 +GET 052F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S5 +GET 052F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S5 +GET 052F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S5 + + +#ID5 readings +GET 052F_MACHINE_MACHINE_1_GAP051 sr/id/id_s5/Gap1 +GET 052F_MACHINE_MACHINE_1_GAP052 sr/id/id_s5/Gap2 +GET 052F_MACHINE_MACHINE_1_GAP053 sr/id/id_s5/Gap3 +GET 052F_MACHINE_MACHINE_1_GAPS050 sr/id/id_s5/StatRF diff --git a/TCPSserver/elettrabcsbridge061.cfg b/TCPSserver/elettrabcsbridge061.cfg new file mode 100644 index 0000000..ee401ee --- /dev/null +++ b/TCPSserver/elettrabcsbridge061.cfg @@ -0,0 +1,31 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET 061F_MACHINE_MACHINE_1_P120S061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.3_PRES_RR +GET 061F_MACHINE_MACHINE_1_P400S061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.1_PRES_RR + +#front-end VLVFE readings +GET 061F_MACHINE_MACHINE_1_VALVE061 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.1_STAT_RF + +#front-end PHOTON SHUTTER readings + +GET 061F_MACHINE_MACHINE_1_SHUT061 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.1/StatRF + + +#beam positions and angles at exit of bending magnets + +GET 061F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B6 +GET 061F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B6 +GET 061F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B6 +GET 061F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B6 diff --git a/TCPSserver/elettrabcsbridge062.cfg b/TCPSserver/elettrabcsbridge062.cfg new file mode 100644 index 0000000..5e8c3a2 --- /dev/null +++ b/TCPSserver/elettrabcsbridge062.cfg @@ -0,0 +1,41 @@ +#configuration file for elettra-Tango to BCS bridge 062 Gas Phase : 20062 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET 062F_MACHINE_MACHINE_1_P120S062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.7_PRES_RR +GET 062F_MACHINE_MACHINE_1_P400S062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.2_PRES_RR + +#front-end VLVFE readings +GET 062F_MACHINE_MACHINE_1_VALVE062 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.2_STAT_RF + +#front-end PHOTON SHUTTER readings +GET 062F_MACHINE_MACHINE_1_SHUT062 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.2/StatRF + +#beam positions and angles at centre of straigth sections + +GET 062F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S6 +GET 062F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S6 +GET 062F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S6 +GET 062F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S6 + +#ID6 readings +GET 062F_MACHINE_MACHINE_1_GAP061 sr/id/id_s6/Gap1 +GET 062F_MACHINE_MACHINE_1_GAP062 sr/id/id_s6/Gap2 +GET 062F_MACHINE_MACHINE_1_GAP063 sr/id/id_s6/Gap3 +GET 062F_MACHINE_MACHINE_1_GAPS060 sr/id/id_s6/StatRF + +#ID6 settings +SET 062F_MACHINE_MACHINE_1_GAP061 GAP061 sr/id/id_s6/Gap1 +SET 062F_MACHINE_MACHINE_1_GAP062 GAP062 sr/id/id_s6/Gap2 +SET 062F_MACHINE_MACHINE_1_GAP063 GAP063 sr/id/id_s6/Gap3 +SET 062F_MACHINE_MACHINE_1_GAP060 VALUE sr/id/id_s6/Gapall diff --git a/TCPSserver/elettrabcsbridge071.cfg b/TCPSserver/elettrabcsbridge071.cfg new file mode 100644 index 0000000..99fb1be --- /dev/null +++ b/TCPSserver/elettrabcsbridge071.cfg @@ -0,0 +1,30 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.3_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.1_PRES_RR + +#front-end VLVFE readings + +GET FRONTEND_MACHINE_MACHINE_1_VALVE071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.1_STAT_RF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.1/StatRF + +#beam positions and angles at exit of bending magnets + +GET 071F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B7 +GET 071F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B7 +GET 071F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B7 +GET 071F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B7 diff --git a/TCPSserver/elettrabcsbridge072.cfg b/TCPSserver/elettrabcsbridge072.cfg new file mode 100644 index 0000000..3d9d4aa --- /dev/null +++ b/TCPSserver/elettrabcsbridge072.cfg @@ -0,0 +1,39 @@ +#configuration file for elettra-Tango to BCS bridge 072 ALOISA : 20072 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET 072F_MACHINE_MACHINE_1_P120S072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.7_PRES_RR +GET 072F_MACHINE_MACHINE_1_P400S072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.2_PRES_RR + +#front-end VLVFE readings + +GET 072F_MACHINE_MACHINE_1_VALVE072 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.2_STAT_RF + +#front-end PHOTON SHUTTER readings + +GET 072F_MACHINE_MACHINE_1_SHUT072 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.2/StatRF + +#beam positions and angles at centre of straigth sections + +GET 072F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S7 +GET 072F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S7 +GET 072F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S7 +GET 072F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S7 + +#ID7 readings +GET 072F_MACHINE_MACHINE_1_POS072 blproxy/id/id_s7/UserPosition +GET 072F_MACHINE_MACHINE_1_STAT070 blproxy/id/id_s7/StatRF + +#ID7 settings +SET 072F_MACHINE_MACHINE_1_POS072 VALUE blproxy/id/id_s7/UserPosition diff --git a/TCPSserver/elettrabcsbridge081.cfg b/TCPSserver/elettrabcsbridge081.cfg new file mode 100644 index 0000000..a3f01c3 --- /dev/null +++ b/TCPSserver/elettrabcsbridge081.cfg @@ -0,0 +1,33 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.3_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.1_PRES_RR + + +#front-end VLVFE readings + +GET FRONTEND_MACHINE_MACHINE_1_VALVE081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.1_STAT_RF + + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.1/StatRF + +#beam positions and angles at centre bending + +GET 081F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B8 +GET 081F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B8 +GET 081F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B8 +GET 081F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B8 diff --git a/TCPSserver/elettrabcsbridge082.cfg b/TCPSserver/elettrabcsbridge082.cfg new file mode 100644 index 0000000..16e4c03 --- /dev/null +++ b/TCPSserver/elettrabcsbridge082.cfg @@ -0,0 +1,53 @@ +#configuration file for elettra-Tango to BCS bridge 082 Bach : 20082 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.7_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.2_PRES_RR + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.2_STAT_RF + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.2/StatRF + + +#beam positions and angles at centre of straigth sections + + +GET 082F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S8 +GET 082F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S8 +GET 082F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S8 +GET 082F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S8 + +#ID8 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP081 sr/id/id_s8.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP082 sr/id/id_s8.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_TAP081 sr/id/id_s8.1/Taper +GET FRONTEND_MACHINE_MACHINE_1_TAP082 sr/id/id_s8.2/Taper +GET FRONTEND_MACHINE_MACHINE_1_PHA081 sr/id/id_s8.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA082 sr/id/id_s8.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS081 sr/id/id_s8.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS082 sr/id/id_s8.2/StatRF + +#ID8 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP081 GAP081 sr/id/id_s8.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP082 GAP082 sr/id/id_s8.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_TAP081 TAP081 sr/id/id_s8.1/Taper +SET FRONTEND_MACHINE_MACHINE_1_TAP082 TAP082 sr/id/id_s8.2/Taper +SET FRONTEND_MACHINE_MACHINE_1_PHA081 PHA081 sr/id/id_s8.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA082 PHA082 sr/id/id_s8.2/Phase +SET FRONTEND_MACHINE_MACHINE_1_BRK081 BRKON sr/id/id_s8.1/Brake +SET FRONTEND_MACHINE_MACHINE_1_BRK082 BRKON sr/id/id_s8.2/Brake diff --git a/TCPSserver/elettrabcsbridge091.cfg b/TCPSserver/elettrabcsbridge091.cfg new file mode 100644 index 0000000..1dc3c10 --- /dev/null +++ b/TCPSserver/elettrabcsbridge091.cfg @@ -0,0 +1,30 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S9.2_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF + +#beam positions and angles at centre of straigth sections +GET 091F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B9 +GET 091F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B9 +GET 091F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B9 +GET 091F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B9 diff --git a/TCPSserver/elettrabcsbridge092.cfg b/TCPSserver/elettrabcsbridge092.cfg new file mode 100644 index 0000000..775e1b4 --- /dev/null +++ b/TCPSserver/elettrabcsbridge092.cfg @@ -0,0 +1,53 @@ +#configuration file for elettra-Tango to BCS bridge 092 APE : 20092 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s09.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s09.02/Pressure + + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s9.2/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.2/StatRF + + +#beam positions and angles at centre of straigth sections + + +GET 092F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S9 +GET 092F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S9 +GET 092F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S9 +GET 092F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S9 + +#ID9 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP091 sr/id/id_s9.1/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAP092 sr/id/id_s9.2/Gap +GET FRONTEND_MACHINE_MACHINE_1_TAP091 sr/id/id_s9.1/Taper +GET FRONTEND_MACHINE_MACHINE_1_TAP092 sr/id/id_s9.2/Taper +GET FRONTEND_MACHINE_MACHINE_1_PHA091 sr/id/id_s9.1/Phase +GET FRONTEND_MACHINE_MACHINE_1_PHA092 sr/id/id_s9.2/Phase +GET FRONTEND_MACHINE_MACHINE_1_GAPS091 sr/id/id_s9.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS092 sr/id/id_s9.2/StatRF + +#ID9 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP091 GAP091 sr/id/id_s9.1/Gap +SET FRONTEND_MACHINE_MACHINE_1_GAP092 GAP092 sr/id/id_s9.2/Gap +SET FRONTEND_MACHINE_MACHINE_1_TAP091 TAP091 sr/id/id_s9.1/Taper +SET FRONTEND_MACHINE_MACHINE_1_TAP092 TAP092 sr/id/id_s9.2/Taper +SET FRONTEND_MACHINE_MACHINE_1_PHA091 PHA091 sr/id/id_s9.1/Phase +SET FRONTEND_MACHINE_MACHINE_1_PHA092 PHA092 sr/id/id_s9.2/Phase +SET FRONTEND_MACHINE_MACHINE_1_BRK091 BRKON sr/id/id_s9.1/Brake +SET FRONTEND_MACHINE_MACHINE_1_BRK092 BRKON sr/id/id_s9.2/Brake diff --git a/TCPSserver/elettrabcsbridge101.cfg b/TCPSserver/elettrabcsbridge101.cfg new file mode 100644 index 0000000..a309597 --- /dev/null +++ b/TCPSserver/elettrabcsbridge101.cfg @@ -0,0 +1,32 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.03/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.01/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.1/StatRF + + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.1/StatRF + +#beam positions and angles at exit of bending magnets + + +GET 101F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B10 +GET 101F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B10 +GET 101F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B10 +GET 101F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B10 diff --git a/TCPSserver/elettrabcsbridge102.cfg b/TCPSserver/elettrabcsbridge102.cfg new file mode 100644 index 0000000..e25277d --- /dev/null +++ b/TCPSserver/elettrabcsbridge102.cfg @@ -0,0 +1,48 @@ +#configuration file for elettra-Tango to BCS bridge 102 Iuvs BaDElph: 20102 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.02/Pressure + +#front-end VLVFE readings + +GET FRONTEND_MACHINE_MACHINE_1_VALVE102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.2/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.2/StatRF + +#beam positions and angles at centre of straigth sections + + +GET 102F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S10 +GET 102F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S10 +GET 102F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S10 +GET 102F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S10 + + + +#ID10 readings +GET FRONTEND_MACHINE_MACHINE_1_GAP101 sr/id/id_s10.1/Gap1 +GET FRONTEND_MACHINE_MACHINE_1_GAP102 sr/id/id_s10.2/Gap1 +GET FRONTEND_MACHINE_MACHINE_1_GAPS101 sr/id/id_s10.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_GAPS102 sr/id/id_s10.2/StatRF +#ID10 settings +SET FRONTEND_MACHINE_MACHINE_1_GAP101 VALGAP sr/id/id_s10.1/Gap1 +SET FRONTEND_MACHINE_MACHINE_1_GAP102 VALGAP sr/id/id_s10.2/Gap1 + +#ID10 collective readings +GET FRONTEND_MACHINE_MACHINE_1_GAP100 sr/id/id_s10/Gap +GET FRONTEND_MACHINE_MACHINE_1_GAPS100 sr/id/id_s10/StatRF +#ID10 collective settings +SET FRONTEND_MACHINE_MACHINE_1_GAP100 VALGAP sr/id/id_s10/Gap diff --git a/TCPSserver/elettrabcsbridge111.cfg b/TCPSserver/elettrabcsbridge111.cfg new file mode 100644 index 0000000..d2311fd --- /dev/null +++ b/TCPSserver/elettrabcsbridge111.cfg @@ -0,0 +1,29 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +##vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.03/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.01/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s11.2/StatRF + +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.1/StatRF + +#beam positions and angles at exit of bending magnets +GET 111F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B11 +GET 111F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B11 +GET 111F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B11 +GET 111F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B11 diff --git a/TCPSserver/elettrabcsbridge112.cfg b/TCPSserver/elettrabcsbridge112.cfg new file mode 100644 index 0000000..12226d1 --- /dev/null +++ b/TCPSserver/elettrabcsbridge112.cfg @@ -0,0 +1,36 @@ +#configuration file for elettra-Tango to BCS bridge 112 (SCW) : 20112 + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON + +#vacuum redings SIP120-SIP400 +GET FRONTEND_MACHINE_MACHINE_1_P120S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.07/Pressure +GET FRONTEND_MACHINE_MACHINE_1_P400S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.02/Pressure + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s12.2/StatRF + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.2/StatRF + + +#beam positions and angles at centre of straigth sections + + +GET 112F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_S11 +GET 112F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_S11 +GET 112F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_S11 +GET 112F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_S11 + +#SCW reading +GET FRONTEND_MACHINE_MACHINE_1_SCWFIELD sr/scw/scw_a11.1/MagneticField +GET FRONTEND_MACHINE_MACHINE_1_SCWSTATE sr/scw/scw_a11.1/State diff --git a/TCPSserver/list-active.txt b/TCPSserver/list-active.txt new file mode 100644 index 0000000..d985964 --- /dev/null +++ b/TCPSserver/list-active.txt @@ -0,0 +1,36 @@ +1.1: PS120S01_M, PS400S11, VALVE01M SHUT01M XANGL011,XPOS011,YANGL011 YPOS011 + +1.2 (012) P120S012, PS400S012 SHUT012 VALVE012 XANGL012,XPOS012,YANGL012 YPOS012 + +2.2 (022) PS120S022 PS400S022 SHUT022 VALVE022 XANGL022,XPOS022,YANGL022 YPOS022 + +3.2 (032) PS120S032 PS400S032 SHUT032 VALVE032 XANGL032,XPOS032,YANGL032 YPOS032 + +4.2 (042) PS120S042 PS400S042 SHUT042 VALVE042 XANGL042,XPOS042,YANGL032 YPOS042 + +5.2 (052) PS120S042 PS400S052 SHUT052 VALVE052 XANGL052,XPOS052,YANGL032 YPOS052 + +6.1 (061) PS120S061 PS400S061 SHUT061 VALVE061 XANGL061,XPOS061,YANGL061 YPOS061 + +6.2 (062) PS120S062 PS400S062 SHUT062 VALVE062 XANGL062,XPOS062,YANGL062 YPOS062 + +7.1 (071) PS120S071 PS400S071 SHUT071 VALVE071 XANGL071,XPOS071,YANGL071 YPOS071 + +7.2 (072) PS120S072 PS400S072 SHUT072 VALVE072 XANGL072,XPOS072,YANGL072 YPOS072 + +8.1 (081) PS120S081 PS400S081 SHUT081 VALVE081 XANGL081,XPOS081,YANGL081 YPOS081 + +8.2 (082) PS120S082 PS400S082 SHUT082 VALVE082 XANGL082,XPOS082,YANGL082 YPOS082 + +9.1 (091) PS120S091 PS400S091 SHUT091 VALVE091 XANGL091,XPOS091,YANGL091 YPOS091 + +9.2 (092) PS120S092 PS400S092 SHUT092 VALVE092 XANGL092,XPOS092,YANGL092 YPOS092 + +10.1 (101) PS120S101 PS400S101 SHUT101 VALVE101 XANGL101,XPOS101,YANGL101 YPOS101 + +10.2 (102) PS120S102 PS400S102 SHUT102 VALVE102 XANGL102,XPOS102,YANGL102 YPOS102 + +11.1 (111) PS120S111 PS400S111 SHUT111 VALVE111 XANGL111,XPOS111,YANGL111 YPOS111 + +11.2 (112) PS120S112 PS400S112 SHUT112 VALVE112 XANGL112,XPOS112,YANGL112 YPOS112 + diff --git a/TCPSserver/prova.sh b/TCPSserver/prova.sh new file mode 100755 index 0000000..ddadca6 --- /dev/null +++ b/TCPSserver/prova.sh @@ -0,0 +1,9 @@ +INSTANCES="elettrabcsbridge012.cfg elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg" +PORTS=(20012 20022 20032 20042 20052 20062 02072 20082 20092 20102) +index=0 +for inst in $INSTANCES +do +PORT=${PORTS[$index]} +echo "$inst -f $PORT" +index=$((index + 1)) +done \ No newline at end of file diff --git a/TCPSserver/tcps.sh b/TCPSserver/tcps.sh new file mode 100755 index 0000000..27f5494 --- /dev/null +++ b/TCPSserver/tcps.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +################################################################################ +# RP - 17 febbraio 2006 +# CS - 23 gennaio 2009 +# Codici di errore dello script +# - in avvio: +# 2: non c'e` l'eseguibile oppure i permessi non sono impostati correttamente +# 3: il programma e` gia` in esecuzione +# 4: non c'e` il file di configurazione /etc/default/elettra_daemons +# 5: nel file di configurazione /etc/default/elettra_daemons non viene +# richiesto di avviare il programma +# 6: errore nell'avvio del programma come root. +# 7: errore nell'avvio del programma come servuser. +# 8: e` stato utilizzato un utente sbagliato per eseguire lo script +# - in arresto: +# 50: il programma non e` in esecuzione +# 51: si e` verificato un errore arrestando il programma. Viene fornito il +# codice di uscita del kill +################################################################################ +PREFIX="/runtime/elettra/servers" +CONFPREFIX="$PREFIX/etc" +PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PREFIX/bin +LD_LIBRARY_PATH=/usr/local/tango-7.2.6/lib:/usr/local/omniorb-4.1.4/lib +export LD_LIBRARY_PATH PATH +export TANGO_HOST=tom:20000 + +PYTHONPATH=$PREFIX/bin +export PYTHONPATH +SERVER="$PREFIX/bin/TCPStwserver.py" + +INSTANCES="elettrabcsbridge012.cfg elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg elettrabcsbridge011.cfg elettrabcsbridge061.cfg elettrabcsbridge071.cfg elettrabcsbridge081.cfg elettrabcsbridge101.cfg elettrabcsbridge111.cfg elettrabcsbridge091.cfg elettrabcsbridge112.cfg" + +PORTS=(20012 20022 20032 20042 20052 20062 20072 20082 20092 20102 20011 20061 20071 20081 20101 20111 20091 20112) + +LOGNAME="tcpserver" +LOGBASE="/runtime/site/ecsproxy/log" +LOGSIZE=1024k +LOGLEVEL=info + +startserver() +{ +if [ ! -x $SERVER ]; then + echo " FAILED: $SERVER executable not found." + exit 2 +fi +index=0 +for INSTANCE in $INSTANCES +do + PORT=${PORTS[$index]} + LOGFILE="$LOGBASE/$LOGNAME$PORT.log" + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "1" ] + then + echo "$SERVER -f $INSTANCE: already running." + else + echo -n "Starting $SERVER $INSTANCE server ..." + if [ `id -u` -eq "0" ] + then + su - servuser -c "cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE &" + sleep 1 + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: an error occurred starting the program. Exit code: $?" + exit 6 + else + echo " OK." + fi + else + if [ `id -u` -eq "10005" ] + then + cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE & + sleep 1 + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: an error occurred starting the program. Exit code: $?" + exit 6 + else + echo " OK." + fi + else + echo " FAILED: You must be root or servuser to run this script." + exit 8 + fi + fi + fi + index=$((index + 1)) +done +} + +stopserver() +{ +for INST in $INSTANCES +do + PORT=${PORTS[$index]} + LOGFILE="$LOGBASE/$LOGFILE$PORT.log" + INSTANCE=$INST + echo -n "Stopping $SERVER $CONFPREFIX/$INSTANCE server ..." + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: not running." + else + kill `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | awk '{print $2}'` + if [ $? != "0" ] + then + echo " FAILED stopping $SERVER -f $CONFPREFIX/$INSTANCE : an error occurred stopping the program. Exit code: $?" + else + echo " OK." + fi + fi +done +} + +status() +{ +for INSTANCE in $INSTANCES +do + echo -n "checking $SERVER -f $CONFPREFIX/$INSTANCE ..." + + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " NOT running." + fi + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -gt "0" ] + then + echo " running." + fi +done +} + +case "$1" in + start) + startserver + ;; + + stop) + stopserver + ;; + + status) + status + ;; + + restart) + $0 stop + sleep 2 + $0 start + ;; + + *) + echo "Usage: /etc/init.d/$0 {start|stop|status|restart}" + ;; +esac + +exit 0 + +# EOF diff --git a/TCPSserver/tcps.sh.inst b/TCPSserver/tcps.sh.inst new file mode 100755 index 0000000..f909233 --- /dev/null +++ b/TCPSserver/tcps.sh.inst @@ -0,0 +1,156 @@ +#!/bin/bash + +################################################################################ +# RP - 17 febbraio 2006 +# CS - 23 gennaio 2009 +# Codici di errore dello script +# - in avvio: +# 2: non c'e` l'eseguibile oppure i permessi non sono impostati correttamente +# 3: il programma e` gia` in esecuzione +# 4: non c'e` il file di configurazione /etc/default/elettra_daemons +# 5: nel file di configurazione /etc/default/elettra_daemons non viene +# richiesto di avviare il programma +# 6: errore nell'avvio del programma come root. +# 7: errore nell'avvio del programma come servuser. +# 8: e` stato utilizzato un utente sbagliato per eseguire lo script +# - in arresto: +# 50: il programma non e` in esecuzione +# 51: si e` verificato un errore arrestando il programma. Viene fornito il +# codice di uscita del kill +################################################################################ +PREFIX="/runtime/elettra/servers" +CONFPREFIX="$PREFIX/etc" +PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PREFIX/bin +LD_LIBRARY_PATH=/usr/local/tango-7.2.6/lib:/usr/local/omniorb-4.1.4/lib +export LD_LIBRARY_PATH PATH +export TANGO_HOST=tom:20000 + +PYTHONPATH=$PREFIX/bin +export PYTHONPATH +SERVER="$PREFIX/bin/TCPStwserver.py" + +INSTANCES="elettrabcsbridge012.cfg elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg elettrabcsbridge011.cfg elettrabcsbridge061.cfg elettrabcsbridge081.cfg elettrabcsbridge101.cfg elettrabcsbridge111.cfg" + +PORTS=(20012 20022 20032 20042 20052 20062 02072 20082 20092 20102 20011 20061 20081 20101 20111) + +LOGNAME="tcpserver" +LOGBASE="/runtime/site/ecsproxy/log" +LOGSIZE=1024k +LOGLEVEL=info + +startserver() +{ +if [ ! -x $SERVER ]; then + echo " FAILED: $SERVER executable not found." + exit 2 +fi +index=0 +for INSTANCE in $INSTANCES +do + PORT=${PORTS[$index]} + LOGFILE="$LOGBASE/$LOGNAME$PORT.log" + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "1" ] + then + echo "$SERVER -f $INSTANCE: already running." + else + echo -n "Starting $SERVER $INSTANCE server ..." + if [ `id -u` -eq "0" ] + then + su - servuser -c "cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE &" + sleep 1 + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: an error occurred starting the program. Exit code: $?" + exit 6 + else + echo " OK." + fi + else + if [ `id -u` -eq "10005" ] + then + cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE & + sleep 1 + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: an error occurred starting the program. Exit code: $?" + exit 6 + else + echo " OK." + fi + else + echo " FAILED: You must be root or servuser to run this script." + exit 8 + fi + fi + fi + index=$((index + 1)) +done +} + +stopserver() +{ +for INST in $INSTANCES +do + PORT=${PORTS[$index]} + LOGFILE="$LOGBASE/$LOGFILE$PORT.log" + INSTANCE=$INST + echo -n "Stopping $SERVER $CONFPREFIX/$INSTANCE server ..." + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " FAILED: not running." + else + kill `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | awk '{print $2}'` + if [ $? != "0" ] + then + echo " FAILED stopping $SERVER -f $CONFPREFIX/$INSTANCE : an error occurred stopping the program. Exit code: $?" + else + echo " OK." + fi + fi +done +} + +status() +{ +for INSTANCE in $INSTANCES +do + echo -n "checking $SERVER -f $CONFPREFIX/$INSTANCE ..." + + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ] + then + echo " NOT running." + fi + if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -gt "0" ] + then + echo " running." + fi +done +} + +case "$1" in + start) + startserver + ;; + + stop) + stopserver + ;; + + status) + status + ;; + + restart) + $0 stop + sleep 2 + $0 start + ;; + + *) + echo "Usage: /etc/init.d/$0 {start|stop|status|restart}" + ;; +esac + +exit 0 + +# EOF diff --git a/TCPSserver/tcpserver20012.log b/TCPSserver/tcpserver20012.log new file mode 100644 index 0000000..e69de29 diff --git a/TCPSserver/testcmd.cfg b/TCPSserver/testcmd.cfg new file mode 100644 index 0000000..2296e15 --- /dev/null +++ b/TCPSserver/testcmd.cfg @@ -0,0 +1,13 @@ +#configuration file for elettra-Tango to BCS bridge test simple commnds to fake ID + +#ID2 readings +GET 022F_MACHINE_MACHINE_1_GAP021 sr/id/id_s2/Gap +GET 022F_MACHINE_MACHINE_1_TAP021 sr/id/id_s2/Tapering + +#ID2 settings +SET 022F_MACHINE_MACHINE_1_GAP021 VALGAP sr/id/id_s2/Gap +SET 022F_MACHINE_MACHINE_1_TAP021 VALPHA sr/id/id_s2/Tapering + +#ID8 brakes +GET 081F_MACHINE_MACHINE_1_BRK sr/id/id_s8.1/Brake +SET 081F_MACHINE_MACHINE_1_BRK BRKON sr/id/id_s8.1/Brake \ No newline at end of file diff --git a/TCPSserver/testexc.py b/TCPSserver/testexc.py new file mode 100644 index 0000000..75a7c0a --- /dev/null +++ b/TCPSserver/testexc.py @@ -0,0 +1,19 @@ +import sys +import string +import PyTango + +dev=PyTango.DeviceProxy('sr/id/id_s2.2') + +try: + dev.write_attribute('Gap',22.5) +except PyTango.DevFailed, e: + #exctype ,value = sys.exc_info()[:2] + #print 'Exception: ' , e + #for err in e: + #print ' reason', err.reason + #print ' description', err.desc + #print ' origin', err.origin + #print ' severity',err.severity + Err0=e[0].desc + Err1=e[1].desc + print 'ERRR', Err0, Err1.split()[5], \ No newline at end of file diff --git a/TCPSserver/testphbsh.cfg b/TCPSserver/testphbsh.cfg new file mode 100644 index 0000000..39299db --- /dev/null +++ b/TCPSserver/testphbsh.cfg @@ -0,0 +1,19 @@ +#front-end PHOTON SHUTTER readings +GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom:20000/sr/vacuum/phbsh_s1.1m/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom:20000/sr/vacuum/phbsh_s1.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom:20000/sr/vacuum/phbsh_s10.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom:20000/sr/vacuum/phbsh_s10.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom:20000/sr/vacuum/phbsh_s11.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom:20000/sr/vacuum/phbsh_s11.2/StatRF +GET 022F_MACHINE_MACHINE_1_SHUT022 tango://tom:20000/sr/vacuum/phbsh_s2.2/StatRF +GET 032F_MACHINE_MACHINE_1_SHUT032 tango://tom:20000/sr/vacuum/phbsh_s3.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom:20000/sr/vacuum/phbsh_s4.2/StatRF +GET 052F_MACHINE_MACHINE_1_SHUT052 tango://tom:20000/sr/vacuum/phbsh_s5.2/StatRF +GET 061F_MACHINE_MACHINE_1_SHUT061 tango://tom:20000/sr/vacuum/phbsh_s6.1/StatRF +GET 062F_MACHINE_MACHINE_1_SHUT062 tango://tom:20000/sr/vacuum/phbsh_s6.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom:20000/sr/vacuum/phbsh_s7.1/StatRF +GET 072F_MACHINE_MACHINE_1_SHUT072 tango://tom:20000/sr/vacuum/phbsh_s7.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom:20000/sr/vacuum/phbsh_s8.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom:20000/sr/vacuum/phbsh_s8.2/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom:20000/sr/vacuum/phbsh_s9.1/StatRF +GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom:20000/sr/vacuum/phbsh_s9.2/StatRF \ No newline at end of file diff --git a/TCPSserver/testsissi.cfg b/TCPSserver/testsissi.cfg new file mode 100644 index 0000000..0cbe8cc --- /dev/null +++ b/TCPSserver/testsissi.cfg @@ -0,0 +1,30 @@ +#configuration file for elettra-Tango to BCS bridge + + +#main beam parameters +GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current +GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy +GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime + +#topup bits reading reading +GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA info/sr/1/Topupbits +#BeamON reading +GET FRONTEND_MACHINE_MACHINE_1_BEAMON info/sr/1/beamON + +#vacuum redings SIP120-SIP400 + +GET FRONTEND_MACHINE_MACHINE_1_P120S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S9.2_PRES_RR +GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR + +#front-end VLVFE readings +GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF + +#front-end PHOTON SHUTTER readings + +GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF + +#beam positions and angles at centre of straigth sections +GET 091F_MACHINE_MACHINE_1_XPOS sr/diagnostics/bpmid/X_B9 +GET 091F_MACHINE_MACHINE_1_YPOS sr/diagnostics/bpmid/Y_B9 +GET 091F_MACHINE_MACHINE_1_XANGLE sr/diagnostics/bpmid/XP_B9 +GET 091F_MACHINE_MACHINE_1_YANGLE sr/diagnostics/bpmid/YP_B9 diff --git a/blfe.py b/blfe.py new file mode 100644 index 0000000..476e957 --- /dev/null +++ b/blfe.py @@ -0,0 +1,209 @@ +# module for creating beamline front-end config +# class blfe incapsulates the reading and closing of beamline front-ends shuter/stoppers +# stores also the complet configuration +# $Author: claudio $ +# +# $Name: $ +# +# $Log: blfe.py,v $ +# Revision 1.15 2021-01-11 14:46:35 claudio +# removed 061_BSTOPPERAF +# +# Revision 1.14 2018-04-30 08:36:29 claudio +# #5959 errore closing front end +# +# Revision 1.13 2018-04-12 08:46:16 claudio +# mod syrmep- verificate +# +# Revision 1.12 2018-04-03 08:42:34 claudio +# #5643: modifiche syrmep +# +# Revision 1.11 2017-02-13 09:27:36 claudio +# revision tag +# +# Revision 1.10 2016-03-21 08:54:23 claudio +# tested commands for 112f +# +# Revision 1.9 2016-03-10 09:05:23 claudio +# add 112 stopper +# +# Revision 1.8 2015-12-22 10:34:45 claudio +# ticket 1591 +# +# Revision 1.7 2014-09-29 09:08:53 claudio +# correctc CMD and VAR for microfluo shopper +# +# Revision 1.6 2014-09-11 11:15:23 claudio +# corrected label +# +# Revision 1.5 2014-09-10 12:16:13 claudio +# ticket 1406: LEFT_SHUTTER_VACOWAGO_20 +# +# Revision 1.4 2013-04-08 14:19:24 claudio +# force case in string comparison +# +# Revision 1.3 2009/11/13 10:01:36 claudio +# "natural" default rpc timeout +# +# Revision 1.2 2008/09/30 07:53:49 claudio +# commented out shutter/stopper under commissioning (11.2) +# +# Revision 1.1 2008/09/23 09:12:10 claudio +# First import +# +# +import lib_pyElettra +import string +class blfe: + def __init__(self): + self.nread=0 + self.nerror=0 + self.nopen=0 + self.nclosed=0 + self.nunknown=0 + self.nentries=0 + + self.bltable=[] + #here put in the complete table of shopper/shutters/stoppers in beamline jargon + # format of table entry is: + # 'point','host','read-command_name',value,'status',set-command_name,set-parm + # value:0 closed, 1 open, -1 unknown, -2 read error' + # status: UNKNOWN,OPEN,CLOSED,ERROR + # value and status are dynamically changed by read operations + +# self.bltable.append(['BACKEND_SHOPPER_VACOBECK_20_STATUS0','bacs011.blcs.elettra.trieste.it','1.0-backend',-1,'UNKNOWN','BACKEND_SHOPPER_VACOBECK_20_RMTCMD0','RMTCMD0']) + + self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS2','011f-bcs.blcs.elettra.trieste.it','1.1M TwinMic',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD2','VALRMTCMD2']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','012f-bcs.blcs.elettra.trieste.it','1.2 Nanospectr.',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' ]) + self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','012f-bcs.blcs.elettra.trieste.it','1.2 Nanospectr.',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' ]) + + self.bltable.append(['022F_USTOPPER1F_VACO_1_STATUS1','022f-bcs.blcs.elettra.trieste.it','2.2 ESCA',-1,'UNKNOWN','022F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['022F_USHUTTER1F_VACO_1_STATUS0','022f-bcs.blcs.elettra.trieste.it','2.2 ESCA',-1,'UNKNOWN','022F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' ]) + + self.bltable.append(['032F_USTOPPER1F_VACO_1_STATUS1','032f-bcs.blcs.elettra.trieste.it','3.2 VUV/Spectrom.',-1,'UNKNOWN','032F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['032F_USHUTTER1F_VACO_1_STATUS0','032f-bcs.blcs.elettra.trieste.it','3.2 VUV/Spectrom.',-1,'UNKNOWN','032F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','042f-bcs.blcs.elettra.trieste.it','4.2 Circ. pol.',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','042f-bcs.blcs.elettra.trieste.it','4.2 Circ. pol.',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['XRD_STOPPER1_VACO_11_STATUS0','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER1_VACO_11_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['XRD_STOPPER2_VACO_10_STATUS3','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER2_VACO_10_RMTCMD3' , 'VALRMTCMD3']) + self.bltable.append(['XRD_STOPPER3_VACO_10_STATUS2','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER3_VACO_10_RMTCMD2' , 'VALRMTCMD2' ]) + self.bltable.append(['052F_WSHUTTER1F_VACO_1_STATUS5','052f-bcs.blcs.elettra.trieste.it','5.2 SAXS',-1,'UNKNOWN','052F_WSHUTTER1F_VACO_1_RMTCMD5' , 'VALRMTCMD5']) + self.bltable.append(['052F_WSTOPPER1F_VACO_1_STATUS4','052f-bcs.blcs.elettra.trieste.it','5.2 SAXS',-1,'UNKNOWN','052F_WSTOPPER1F_VACO_1_RMTCMD4' , 'VALRMTCMD4']) + + self.bltable.append(['061F_BSTOPPERCF_VACO_1_STATUS2','061f-bcs.blcs.elettra.trieste.it','6.1 Mat. Science',-1,'UNKNOWN','061F_BSTOPPERCF_VACO_1_RMTCMD2' , 'VALRMTCMD2']) + self.bltable.append(['061F_BSHUTTERAF_VACO_2_STATUS0','061f-bcs.blcs.elettra.trieste.it','6.1 Syrmep',-1,'UNKNOWN','061F_BSHUTTERAF_VACO_2_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['061F_BSHUTTERCF_VACO_1_STATUS0','061f-bcs.blcs.elettra.trieste.it','6.1 Mat. Science',-1,'UNKNOWN','061F_BSHUTTERCF_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['062F_USTOPPER1F_VACO_1_STATUS1','062f-bcs.blcs.elettra.trieste.it','6.2 GasPhase',-1,'UNKNOWN','062F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['062F_USHUTTER1F_VACO_1_STATUS0','062f-bcs.blcs.elettra.trieste.it','6.2 GasPhase',-1,'UNKNOWN','062F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_SHOPPER-R_VACO_1_STATUS0','071f-bcs.blcs.elettra.trieste.it','7.1 MCX',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['RIGHT_SHUTTER_VACO_30_STATUS4','071f-bcs.blcs.elettra.trieste.it','7.1 MCX',-1,'UNKNOWN','RIGHT_SHUTTER_VACO_30_RMTCMD4' , 'VALRMTCMD4']) + + self.bltable.append(['072F_USTOPPER1F_VACO_1_STATUS1','072f-bcs.blcs.elettra.trieste.it','7.2 ALOISA',-1,'UNKNOWN','072F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['072F_USHUTTER1F_VACO_1_STATUS0','072f-bcs.blcs.elettra.trieste.it','7.2 ALOISA',-1,'UNKNOWN','072F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_SHOPPER-R_VACO_2_STATUS0','081f-bcs.blcs.elettra.trieste.it','8.1 Lilit',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','081f-bcs.blcs.elettra.trieste.it','8.1 BEAR',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['RIGHT_EXSLIT_VACO_10_STATUS4','081f-bcs.blcs.elettra.trieste.it','8.1 Lilit',-1,'UNKNOWN','RIGHT_EXSLIT_VACO_10_RMTCMD4' , 'VALRMTCMD4']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','082f-bcs.blcs.elettra.trieste.it','8.2 Bach',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','082f-bcs.blcs.elettra.trieste.it','8.2 Bach',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['CENTRAL_STOPPER_VACO_20_STATUS0','091f-bcs.blcs.elettra.trieste.it','9.1 SISSI',-1,'UNKNOWN','CENTRAL_STOPPER_VACO_20_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','092f-bcs.blcs.elettra.trieste.it','9.2 APE',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','092f-bcs.blcs.elettra.trieste.it','9.2 APE',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_SHOPPER-R_VACO_1_STATUS4','101f-bcs.blcs.elettra.trieste.it','10.1 DXRL',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_1_RMTCMD4' , 'VALRMTCMD4']) + self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','101f-bcs.blcs.elettra.trieste.it','10.1 X-Ray Fluo.',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['LEFT_SHUTTER_VACOWAGO_20_STATUS1','101f-bcs.blcs.elettra.trieste.it','10.1L X-Ray Fluo.',-1,'UNKNOWN','LEFT_SHUTTER_VACOWAGO_20_RMTCMD1' , 'RMTCMD1']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','102f-bcs.blcs.elettra.trieste.it','10.2 IUVS/BaDElPh',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','102f-bcs.blcs.elettra.trieste.it','10.2 IUVS/BaDElPh',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_SHOPPER-R_VACO_2_STATUS0','111f-bcs.blcs.elettra.trieste.it','11.1 XAFS',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0']) + self.bltable.append(['RIGHT_STOPPER_VACO_30_STATUS6','111f-bcs.blcs.elettra.trieste.it','11.1 XAFS',-1,'UNKNOWN','RIGHT_STOPPER_VACO_30_RMTCMD6' , 'VALRMTCMD6']) + self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','111f-bcs.blcs.elettra.trieste.it','11.1 WhITE',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0']) + + self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','112f-bcs.blcs.elettra.trieste.it','11.2 XPRESS & XRD2',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1']) + self.bltable.append(['RIGHT_SHOPPER2_VACOWAGO_30_STATUS0','112f-bcs.blcs.elettra.trieste.it','11.2 XPRESS',-1,'UNKNOWN','RIGHT_SHOPPER2_VACOWAGO_30_RMTCMD0' , 'RMTCMD0']) + self.bltable.append(['CENTRAL_STOPPER2_VACOWAGO_20_STATUS1','112f-bcs.blcs.elettra.trieste.it','11.2 XRD2',-1,'UNKNOWN','CENTRAL_STOPPER2_VACOWAGO_20_RMTCMD1' , 'RMTCMD1']) + + #form dictionary of hosts-controlstem objetcs + self.hostdict={} + for entry in self.bltable: + self.nunknown=self.nunknown+1 + self.nentries=self.nentries+1 + if entry[1] not in self.hostdict: + ControlSystem = lib_pyElettra.XCS() + ControlSystem.open(entry[1]) + self.hostdict[entry[1]]=ControlSystem + #print 'add '+entry[1] + def disconnect(self): + for host,contrsys in self.hostdict.iteritems(): + contrsys.close() + def read(self): + self.nread=0 + self.nerror=0 + self.nopen=0 + self.nclosed=0 + self.nunknown=0 + for entry in self.bltable: + ControlSystem=self.hostdict[entry[1]] + resp = ControlSystem.fetch(entry[0]) + self.nread=self.nread+1 +# print entry[0]+" "+resp[0]+" "+resp[1] + if resp[1]=='fetchException': + ntry[3]=-2 + entry[4]='ERROR' + self.nerror=self.nerror+1 +# print entry[0]+' read error' + else: + if resp[0]=='1' and resp[1].lower()=='open': + entry[3]=1 + entry[4]='OPEN' + self.nopen=self.nopen+1 +# print entry[0]+' OPENED' + elif resp[0]=='0' and resp[1].lower()=='closed': + entry[3]=0 + entry[4]='CLOSED' + self.nclosed=self.nclosed+1 +# print entry[0]+' CLOSED' + elif resp[0]=='3' and resp[1].lower()=='closed': + entry[3]=0 + entry[4]='CLOSED' + self.nclosed=self.nclosed+1 + else: + entry[3]=-1 + entry[4]='UNKNOWN' +# print entry[0]+' UNKNOWN '+ resp[0]+ " "+resp[1] + def allclosed(self): +# return 1 ONLY if we are positvely sure that we have successufully read all the shutters and that they are closed + if self.nclosed==self.nread and self.nread==self.nentries: + return 1 + else: + return 0 + + def closeall(self): +# send close command to all known front-ends shuttters,stoppers, etc. + nclosed=0 + nerror=0 + errtable=[] + for entry in self.bltable: + ControlSystem=self.hostdict[entry[1]] + nclosed=nclosed+1 + print nclosed , entry[5],entry[6] + if len(entry[5]) > 0 and len(entry[6]) >0: + resp=ControlSystem.doit(entry[5],entry[6],'0') # 0 per chiudere, 1 per aprire! + else: + resp = 'OK' + if ( string.find(resp,'OK') == -1): + nerror = nerror+1 + errtable.append([entry[1],entry[2],entry[5],entry[6]]) + if(nerror): + return errtable diff --git a/blfetest.py b/blfetest.py new file mode 100644 index 0000000..c50bfdc --- /dev/null +++ b/blfetest.py @@ -0,0 +1,11 @@ +import blfe + +BL=blfe.blfe() + +BL.read() + +print 'BL all closed: '+repr(BL.allclosed()) + +BL.disconnect() + +#print repr(BL.bltable) \ No newline at end of file diff --git a/demo.py b/demo.py new file mode 100755 index 0000000..63feed7 --- /dev/null +++ b/demo.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +from lib_pyElettra import * + + +ControlSystem = XCS() +ControlSystem.open("112f-bcs.blcs.elettra.trieste.it") + +#Let's read a pressure +#resp = ControlSystem.fetch("FRONTEND_SHUTTER_TPG300_1_B2PRESSURE") +#if resp[1]=='fetchException': + #print 'Exception' + resp[0]+","+resp[1]+","+resp[2] +#else: + #value = float(resp[3]) + #print 'response: press ' + repr(value) + +##Let's read a valve status +resp = ControlSystem.fetch("CENTRAL_STOPPER2_VACOWAGO_20_STATUS1") +if resp[1]=='fetchException': + print 'Exception ' + resp[0]+","+resp[1]+","+resp[2] +else: + print resp + value = int(resp[0]) + print 'response: stat ' + repr(value) + + +#Let's change a valve status +resp = ControlSystem.doit('CENTRAL_STOPPER2_VACOWAGO_20_RMTCMD1' , 'RMTCMD1' ,0) +if ( string.find(resp,'OK') == -1): + print 'doit ERROR' + resp[0]+","+resp[1]+","+resp[2] +else: + print 'response: ' + resp + +ControlSystem.close() diff --git a/fakedevices/HelicalID.py b/fakedevices/HelicalID.py new file mode 100644 index 0000000..738c123 --- /dev/null +++ b/fakedevices/HelicalID.py @@ -0,0 +1,632 @@ +#!/usr/bin/python +# "$Name: $"; +# "$Header: /home/cvsadm/cvsroot/elettra/server/bcsbridge/fakedevices/HelicalID.py,v 1.7 2014-05-12 12:14:43 claudio Exp $"; +#============================================================================= +# +# file : HelicalID.py +# +# description : Python source for the HelicalID and its commands. +# The class is derived from Device. It represents the +# CORBA servant object which will be accessed from the +# network. All commands which can be executed on the +# HelicalID are implemented in this file. +# +# project : TANGO Device Server +# +# $Author: claudio $ +# +# $Revision: 1.7 $ +# +# $Log: HelicalID.py,v $ +# Revision 1.7 2014-05-12 12:14:43 claudio +# *** empty log message *** +# +# Revision 1.6 2013-04-19 13:30:45 claudio +# bug correctec in write_attribute +# +# Revision 1.5 2013-04-19 09:55:33 claudio +# PyTango 8.0.2 compliant +# +# Revision 1.4 2012-08-21 14:06:20 claudio +# interfaccia con MoveMaxGap e SetGapTapPha +# +# Revision 1.3 2012-08-20 12:34:06 claudio +# support simulations for FERMI +# +# Revision 1.2 2010/12/24 10:48:08 claudio +# improved simulation of motion +# +# Revision 1.1 2010/08/03 15:46:15 claudio +# for testing TCPS +# +# +# copyleft : Sincrotrone Trieste s.c.p.A. +# +#============================================================================= +# This file is generated by POGO +# (Program Obviously used to Generate tango Object) +# +# (c) - Software Engineering Group - ESRF +#============================================================================= +# + + +import PyTango +import sys + + +#================================================================== +# HelicalID Class Description: +# +# simulator for helical insertion device. +# Use for testing tango - bcs bridge and supervisor +# +#================================================================== +# Device States Description: +# +# DevState.ON : +# DevState.FAULT : +# DevState.UNKNOWN : +# DevState.MOVING : +#================================================================== + + +class HelicalID(PyTango.Device_4Impl): + +#--------- Add you global variables here -------------------------- + +#------------------------------------------------------------------ +# Device constructor +#------------------------------------------------------------------ + def __init__(self,cl, name): + PyTango.Device_4Impl.__init__(self,cl,name) + HelicalID.init_device(self) + +#------------------------------------------------------------------ +# Device destructor +#------------------------------------------------------------------ + def delete_device(self): + print "[Device delete_device method] for device",self.get_name() + + +#------------------------------------------------------------------ +# Device initialization +#------------------------------------------------------------------ + def init_device(self): + print "In ", self.get_name(), "::init_device()" + self.set_state(PyTango.DevState.INIT) + self.get_device_properties(self.get_device_class()) + self.attr_Enabled_read=True + self.attr_StatRF_read = [False,False] + self.attr_Gap_read = 100.0 + self.attr_Phase_read = 0.0 + self.attr_Taper_read = 0.0 + self.gap_write = self.attr_Gap_read + self.phase_write = self.attr_Phase_read + self.taper_write = self.attr_Taper_read + self.ready = True + self.moving = False + self.set_state(PyTango.DevState.ON) + +#------------------------------------------------------------------ +# Always excuted hook method +#------------------------------------------------------------------ + def always_executed_hook(self): + print "In ", self.get_name(), "::always_excuted_hook()" + +#================================================================== +# +# HelicalID read/write attribute methods +# +#================================================================== +#------------------------------------------------------------------ +# Read Attribute Hardware +#------------------------------------------------------------------ + def read_attr_hardware(self,data): + print "In ", self.get_name(), "::read_attr_hardware()" + #do simulated movement + if self.moving: + self.moving=False + if self.gap_write != self.attr_Gap_read: + delta=self.gap_write - self.attr_Gap_read + if delta > -1.0 and delta <1.0: + self.attr_Gap_read = self.gap_write + elif delta <= -1.0: + self.attr_Gap_read -= 1.0 + self.moving=True + elif delta >=0.0: + self.attr_Gap_read += 1.0 + self.moving = True + + if self.phase_write != self.attr_Phase_read: + delta=self.phase_write - self.attr_Phase_read + if delta > -1.0 and delta <1.0: + self.attr_Phase_read = self.phase_write + elif delta <= -1.0: + self.attr_Phase_read -= 1.0 + self.moving=True + elif delta >=0.0: + self.attr_Phase_read += 1.0 + self.moving = True + + if self.taper_write != self.attr_Taper_read: + delta=self.taper_write - self.attr_Taper_read + if delta > -1.0 and delta <1.0: + self.attr_Taper_read = self.taper_write + elif delta <= -1.0: + self.attr_Taper_read -= 1.0 + self.moving=True + elif delta >=0.0: + self.attr_Taper_read += 1.0 + self.moving = True + + + + if self.moving: + self.set_state(PyTango.DevState.MOVING) + self.set_status('moving') + self.ready=False #not ready + else: + self.set_state(PyTango.DevState.ON) + self.ready=True # ready + self.set_status('ON and ready') + + + +#------------------------------------------------------------------ +# Read Enabled attribute +#------------------------------------------------------------------ + def read_Enabled(self, attr): + print "In ", self.get_name(), "::read_Enabled()" + + # Add your own code here + attr.set_value(self.attr_Enabled_read) + + +#------------------------------------------------------------------ +# Read Gap attribute +#------------------------------------------------------------------ + def read_Gap(self, attr): + print "In ", self.get_name(), "::read_Gap()" + + # Add your own code here + attr.set_value(self.attr_Gap_read) + + +#------------------------------------------------------------------ +# Write Gap attribute +#------------------------------------------------------------------ + def write_Gap(self, attr): + print "In ", self.get_name(), "::write_Gap()" + + data = attr.get_write_value() + print "Attribute value = ", data + # Add your own code here + # raise excpetionif operation is not permitted + if not (self.attr_Enabled_read and self.ready): + msg='gap request for '+str(data)+' RESPINTA' + PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Gap()') + self.gap_write=data + self.set_state(PyTango.DevState.MOVING) + self.moving = True + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#---- Gap attribute State Machine ----------------- + def is_Gap_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read Phase attribute +#------------------------------------------------------------------ + def read_Phase(self, attr): + print "In ", self.get_name(), "::read_Phase()" + + # Add your own code here + attr.set_value(self.attr_Phase_read) + + +#------------------------------------------------------------------ +# Write Phase attribute +#------------------------------------------------------------------ + def write_Phase(self, attr): + print "In ", self.get_name(), "::write_Phase()" + data = attr.get_write_value() + print "Attribute value = ", data + + # Add your own code here + if not (self.attr_Enabled_read and self.ready): + msg='phase request for '+str(data)+' RESPINTA' + PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Phase()') + self.phase_write=data + self.set_state(PyTango.DevState.MOVING) + self.moving = True + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#---- Phase attribute State Machine ----------------- + def is_Phase_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read Taper attribute +#------------------------------------------------------------------ + def read_Taper(self, attr): + print "In ", self.get_name(), "::read_Taper()" + + # Add your own code here + + attr.set_value(self.attr_Taper_read) + + +#------------------------------------------------------------------ +# Write Taper attribute +#------------------------------------------------------------------ + def write_Taper(self, attr): + print "In ", self.get_name(), "::write_Taper()" + data= attr.get_write_value() + print "Attribute value = ", data + + # Add your own code here + if not (self.attr_Enabled_read and self.ready): + msg='phase request for '+str(data)+' RESPINTA' + PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Phase()') + self.taper_write=data + self.set_state(PyTango.DevState.MOVING) + self.moving = True + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#---- Taper attribute State Machine ----------------- + def is_Taper_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read GapSetPoint attribute +#------------------------------------------------------------------ + def read_GapSetPoint(self, attr): + print "In ", self.get_name(), "::read_GapSetPoint()" + + # Add your own code here + + attr.set_value(self.gap_write) + + +#---- GapSetPoint attribute State Machine ----------------- + def is_GapSetPoint_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read PhaseSetPoint attribute +#------------------------------------------------------------------ + def read_PhaseSetPoint(self, attr): + print "In ", self.get_name(), "::read_PhaseSetPoint()" + + # Add your own code here + + attr.set_value(self.phase_write) + + +#---- PhaseSetPoint attribute State Machine ----------------- + def is_PhaseSetPoint_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read TaperSetPoint attribute +#------------------------------------------------------------------ + def read_TaperSetPoint(self, attr): + print "In ", self.get_name(), "::read_TaperSetPoint()" + + # Add your own code here + + + attr.set_value(self.taper_write) + + +#---- TaperSetPoint attribute State Machine ----------------- + def is_TaperSetPoint_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read StatRF attribute +#------------------------------------------------------------------ + def read_StatRF(self, attr): + print "In ", self.get_name(), "::read_StatRF()" + + # Add your own code here + + attr_StatRF_read = [self.ready,self.attr_Enabled_read] + attr.set_value(attr_StatRF_read, 2) + + + +#================================================================== +# +# HelicalID command methods +# +#================================================================== + +#------------------------------------------------------------------ +# Remote command: +# +# Description: enable remote operations for beamlines +# +#------------------------------------------------------------------ + def Remote(self): + print "In ", self.get_name(), "::Remote()" + # Add your own code here + self.attr_Enabled_read=True + + +#------------------------------------------------------------------ +# Local command: +# +# Description: inhibit remote operations to beamlines +# +#------------------------------------------------------------------ + def Local(self): + print "In ", self.get_name(), "::Local()" + # Add your own code here + self.attr_Enabled_read=False + + +#------------------------------------------------------------------ +# MoveMaxGap command: +# +# Description: go to max gap , rest position +# +#------------------------------------------------------------------ + def MoveMaxGap(self): + print "In ", self.get_name(), "::MoveMaxGap()" + # Add your own code here + self.gap_write = self.MaxGap + self.phase_write = 0.0 + self.taper_write = 0.0 + self.set_state(PyTango.DevState.MOVING) + self.ready=False # NOT ready + self.moving = True + self.set_status('moving and not ready') + return + + +#------------------------------------------------------------------ +# SetGapTapPha command: +# +# Description: set new working point in one go +# +# argin: DevVarDoubleArray gap, taper, phase +#------------------------------------------------------------------ + def SetGapTapPha(self, argin): + print "In ", self.get_name(), "::SetGapTapPha()" + # Add your own code here + self.gap_write = argin[0] + self.taper_write = argin[1] + self.phase_write = argin[2] + self.set_state(PyTango.DevState.MOVING) + self.moving = True + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#------------------------------------------------------------------ +# Stop command: +# +# Description: Stop movement +# +#------------------------------------------------------------------ + def Stop(self): + print "In ", self.get_name(), "::Stop()" + # Add your own code here + self.moving = False + + +#================================================================== +# +# HelicalIDClass class definition +# +#================================================================== +class HelicalIDClass(PyTango.DeviceClass): + + # Class Properties + class_property_list = { + } + + + # Device Properties + device_property_list = { + 'NumAxes': + [PyTango.DevLong, + "number of mechanical axes , 6, 4, or 2", + [ 6 ] ], + 'MaxGap': + [PyTango.DevDouble, + "gap value for rest position", + [ 190.0 ] ], + } + + + # Command definitions + cmd_list = { + 'Remote': + [[PyTango.DevVoid, ""], + [PyTango.DevVoid, ""]], + 'Local': + [[PyTango.DevVoid, ""], + [PyTango.DevVoid, ""]], + 'MoveMaxGap': + [[PyTango.DevVoid, ""], + [PyTango.DevVoid, ""]], + 'SetGapTapPha': + [[PyTango.DevVarDoubleArray, "gap, taper, phase"], + [PyTango.DevVoid, ""]], + 'Stop': + [[PyTango.DevVoid, ""], + [PyTango.DevVoid, ""]], + } + + + # Attribute definitions + attr_list = { + 'Enabled': + [[PyTango.DevBoolean, + PyTango.SCALAR, + PyTango.READ], + { + 'label':"enabled", + 'description':"true when operator enables remote operation", + } ], + 'Gap': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ_WRITE], + { + 'label':"gap", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':190, + 'min value':10.0, + 'description':"magnetic gap of id", + } ], + 'Phase': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ_WRITE], + { + 'label':"phase", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'description':"carriage magnetic phase", + } ], + 'Taper': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ_WRITE], + { + 'label':"taper", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':10, + 'min value':-10, + 'description':"magnetic tapering of id", + } ], + 'GapSetPoint': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ], + { + 'label':"gap set point", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':190, + 'min value':10.0, + 'description':"set point of magnetic gap of id", + } ], + 'PhaseSetPoint': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ], + { + 'label':"phase set point", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'description':"set point of carriage magnetic phase", + } ], + 'TaperSetPoint': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ], + { + 'label':"taper set point", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':150, + 'min value':19, + 'description':"set point of magnetic tapering of id", + } ], + 'StatRF': + [[PyTango.DevBoolean, + PyTango.SPECTRUM, + PyTango.READ, 2], + { + 'label':"enabled,ready", + } ], + } + + +#------------------------------------------------------------------ +# HelicalIDClass Constructor +#------------------------------------------------------------------ + def __init__(self, name): + PyTango.DeviceClass.__init__(self, name) + self.set_type(name); + print "In HelicalIDClass constructor" + +#================================================================== +# +# HelicalID class main method +# +#================================================================== +if __name__ == '__main__': + try: + py = PyTango.Util(sys.argv) + py.add_TgClass(HelicalIDClass,HelicalID,'HelicalID') + + U = PyTango.Util.instance() + U.server_init() + U.server_run() + + except PyTango.DevFailed,e: + print '-------> Received a DevFailed exception:',e + except Exception,e: + print '-------> An unforeseen exception occured....',e diff --git a/fakedevices/KymaID.py b/fakedevices/KymaID.py new file mode 100755 index 0000000..320f3fd --- /dev/null +++ b/fakedevices/KymaID.py @@ -0,0 +1,323 @@ +#!/usr/bin/python +# "$Name: $"; +# "$Header: /home/cvsadm/cvsroot/elettra/server/bcsbridge/fakedevices/KymaID.py,v 1.1 2010/12/24 10:48:38 claudio Exp $"; +#============================================================================= +# +# file : KymaID.py +# +# description : Python source for the KymaID and its commands. +# The class is derived from Device. It represents the +# CORBA servant object which will be accessed from the +# network. All commands which can be executed on the +# KymaID are implemented in this file. +# +# project : TANGO Device Server +# +# $Author: claudio $ +# +# $Revision: 1.1 $ +# +# $Log: KymaID.py,v $ +# Revision 1.1 2010/12/24 10:48:38 claudio +# crude superesca simulator +# +# Revision 1.1 2010/08/03 15:46:15 claudio +# for testing TCPS +# +# +# copyleft : Sincrotrone Trieste s.c.p.A. +# +#============================================================================= +# This file is generated by POGO +# (Program Obviously used to Generate tango Object) +# +# (c) - Software Engineering Group - ESRF +#============================================================================= +# + + +import PyTango +import sys + + +#================================================================== +# KymaID Class Description: +# +# simulator for helical insertion device. +# Use for testing tango - bcs bridge and supervisor +# +#================================================================== +# Device States Description: +# +# DevState.ON : +# DevState.FAULT : +# DevState.UNKNOWN : +# DevState.MOVING : +#================================================================== + + +class KymaID(PyTango.Device_4Impl): + +#--------- Add you global variables here -------------------------- + +#------------------------------------------------------------------ +# Device constructor +#------------------------------------------------------------------ + def __init__(self,cl, name): + PyTango.Device_4Impl.__init__(self,cl,name) + KymaID.init_device(self) + +#------------------------------------------------------------------ +# Device destructor +#------------------------------------------------------------------ + def delete_device(self): + print "[Device delete_device method] for device",self.get_name() + + +#------------------------------------------------------------------ +# Device initialization +#------------------------------------------------------------------ + def init_device(self): + print "In ", self.get_name(), "::init_device()" + self.set_state(PyTango.DevState.INIT) + self.get_device_properties(self.get_device_class()) + self.attr_StatRF_read = [False,False] + self.attr_Gap_read = 50.0 + self.attr_Tapering_read = 0.0 + self.gap_write=self.attr_Gap_read + self.taper_write=self.attr_Tapering_read + self.ready=True + self.set_state(PyTango.DevState.ON) + +#------------------------------------------------------------------ +# Always excuted hook method +#------------------------------------------------------------------ + def always_executed_hook(self): + print "In ", self.get_name(), "::always_excuted_hook()" + + +#================================================================== +# +# KymaID read/write attribute methods +# +#================================================================== +#------------------------------------------------------------------ +# Read Attribute Hardware +#------------------------------------------------------------------ + def read_attr_hardware(self,data): + print "In ", self.get_name(), "::read_attr_hardware()" + #do simulated movement + moving=False + if self.gap_write != self.attr_Gap_read: + delta=self.gap_write - self.attr_Gap_read + if delta > -1.0 and delta <1.0: + self.attr_Gap_read = self.gap_write + elif delta <= -1.0: + self.attr_Gap_read -= 1.0 + moving=True + elif delta >=0.0: + self.attr_Gap_read += 1.0 + moving = True + + if self.taper_write != self.attr_Tapering_read: + delta=self.taper_write - self.attr_Tapering_read + if delta > -1.0 and delta <1.0: + self.attr_Tapering_read = self.taper_write + elif delta <= -1.0: + self.attr_Tapering_read -= 1.0 + moving=True + elif delta >=0.0: + self.attr_Tapering_read += 1.0 + moving = True + + if moving: + self.set_state(PyTango.DevState.MOVING) + self.set_status('moving') + self.ready=False #not ready + else: + self.set_state(PyTango.DevState.ON) + self.ready=True # ready + self.set_status('ON and ready') + + + +#------------------------------------------------------------------ +# Read Gap attribute +#------------------------------------------------------------------ + def read_Gap(self, attr): + print "In ", self.get_name(), "::read_Gap()" + + # Add your own code here + attr.set_value(self.attr_Gap_read) + + +#------------------------------------------------------------------ +# Write Gap attribute +#------------------------------------------------------------------ + def write_Gap(self, attr): + print "In ", self.get_name(), "::write_Gap()" + data=[] + attr.get_write_value(data) + print "Attribute value = ", data + # Add your own code here + # raise excpetionif operation is not permitted + self.gap_write=data[0] + self.set_state(PyTango.DevState.MOVING) + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#---- Gap attribute State Machine ----------------- + def is_Gap_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read Tapering attribute +#------------------------------------------------------------------ + def read_Tapering(self, attr): + print "In ", self.get_name(), "::read_Tapering()" + + # Add your own code here + attr.set_value(self.attr_Tapering_read) + + +#------------------------------------------------------------------ +# Write Tapering attribute +#------------------------------------------------------------------ + def write_Tapering(self, attr): + print "In ", self.get_name(), "::write_Tapering()" + data=[] + attr.get_write_value(data) + print "Attribute value = ", data + + # Add your own code here + self.taper_write=data[0] + self.set_state(PyTango.DevState.MOVING) + self.ready=False # NOT ready + self.set_status('moving and not ready') + + +#---- Tapering attribute State Machine ----------------- + def is_Tapering_allowed(self, req_type): + if self.get_state() in [PyTango.DevState.FAULT, + PyTango.DevState.UNKNOWN]: + # End of Generated Code + # Re-Start of Generated Code + return False + return True + + +#------------------------------------------------------------------ +# Read StatRF attribute +#------------------------------------------------------------------ + def read_StatRF(self, attr): + print "In ", self.get_name(), "::read_StatRF()" + + # Add your own code here + + attr_StatRF_read = [True,True] + attr.set_value(attr_StatRF_read, 2) + + + +#================================================================== +# +# KymaID command methods +# +#================================================================== + +#================================================================== +# +# KymaIDClass class definition +# +#================================================================== +class KymaIDClass(PyTango.DeviceClass): + + # Class Properties + class_property_list = { + } + + + # Device Properties + device_property_list = { + } + + + # Command definitions + cmd_list = { + } + + + # Attribute definitions + attr_list = { + 'Gap': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ_WRITE], + { + 'label':"gap", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':150, + 'min value':14, + 'description':"magnetic gap of id", + 'Polling period':2000, + } ], + 'Tapering': + [[PyTango.DevDouble, + PyTango.SCALAR, + PyTango.READ_WRITE], + { + 'label':"taper", + 'unit':"mm", + 'standard unit':1, + 'display unit':"mm", + 'format':"%6.3f", + 'max value':3, + 'min value':-3, + 'description':"carriage magnetic taper", + } ], + 'StatRF': + [[PyTango.DevBoolean, + PyTango.SPECTRUM, + PyTango.READ, 2], + { + 'label':"enabled,ready", + } ], + } + + +#------------------------------------------------------------------ +# KymaIDClass Constructor +#------------------------------------------------------------------ + def __init__(self, name): + PyTango.DeviceClass.__init__(self, name) + self.set_type(name); + print "In KymaIDClass constructor" + +#================================================================== +# +# KymaID class main method +# +#================================================================== +if __name__ == '__main__': + try: + py = PyTango.Util(sys.argv) + py.add_TgClass(KymaIDClass,KymaID,'KymaID') + + U = PyTango.Util.instance() + U.server_init() + U.server_run() + + except PyTango.DevFailed,e: + print '-------> Received a DevFailed exception:',e + except Exception,e: + print '-------> An unforeseen exception occured....',e diff --git a/fakedevices/TangoClassID.txt b/fakedevices/TangoClassID.txt new file mode 100644 index 0000000..328b46a --- /dev/null +++ b/fakedevices/TangoClassID.txt @@ -0,0 +1,11 @@ +/** + * Device Class Identification: + * + * Class Name : HelicalID + * Contact : claudio.scafuri@elettra.trieste.it + * Class Family : Simulators + * Platform : All Platforms + * Bus : Not Applicable + * Manufacturer : none + * Reference : + */ diff --git a/lib_pyElettra.py b/lib_pyElettra.py new file mode 100644 index 0000000..5dc7a01 --- /dev/null +++ b/lib_pyElettra.py @@ -0,0 +1,143 @@ +# class for SET/GET client operations with TPCS protocol +# used by Elettra beamlines +# $Author:Roberto Borghes +# +# $Version:$ +# +# $Log: lib_pyElettra.py,v $ +# Revision 1.1 2008/09/23 09:12:10 claudio +# First import +# +# +import string +from socket import * +from threading import Lock +import time +import httplib + +class XCSException(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return `self.value` + +class XCS: + def __init__(self, mode=None): + if mode == None: + self.mode = 'TCP' + self.port = 20000 + elif mode == 'HTTP': + self.mode = mode + self.port = 80 + else: + raise XCSException, 'Unsupported Mode: '+mode + self.host = "" + self.sid = 0 + self.mutex = Lock() + + def open(self, host, port=None): + self.host = host + if port != None: + self.port = port + if self.mode == 'TCP': + self.mutex.acquire() + try: + self.sid = socket(AF_INET, SOCK_STREAM) + self.sid.connect((self.host,self.port)) + finally: + self.mutex.release() + elif self.mode == 'HTTP': + self.sid = 0 + else: + raise XCSException, 'Not Implemented Yet!' + + def close(self): + if self.sid != 0: + self.mutex.acquire() + try: + self.sid.close() + self.sid = 0 + finally: + self.mutex.release() + + def get(self, var): + if self.mode == 'TCP': + if string.find(var,"UES") != -1: + getvar = "GETUES "+var+"\r\n" + else: + getvar = "GET "+var+"\r\n" + self.mutex.acquire() + try: + self.sid.send(getvar) + retvar = self.sid.recv(256) + finally: + self.mutex.release() + line = string.split(retvar,"\r") + if string.find(line[0],"*** ERROR") != -1: + raise XCSException, line[0] + res = string.split(line[0],",") + if string.find(var,"UES") != -1: + return(res[0],'',res[1],time.time()) + else: + return (res[3],res[4],res[2],time.time()) + if self.mode == 'HTTP': + getvar = "/blcs/"+var+"?ACTION=GET&METHOD=TEXT" + conn = httplib.HTTPConnection(self.host,self.port) + conn.request("GET",getvar) + retvar = conn.getresponse() + line = retvar.read() + if string.find(line,"----------") != -1 or retvar.status != 200: + raise XCSException, line + res = string.split(line,",") + conn.close() + return (res[2],res[3],res[1],time.time()) + else: + raise XCSException, 'Not Implemented Yet!' + + def set(self, var, values=None): + if self.mode == 'TCP': + if string.find(var,"UES") != -1: + setvar = "UES "+var + if values != None: + for p,v in values.items(): + setvar = setvar +" "+str(v) + else: + setvar = "SET "+var + if values != None: + for p,v in values.items(): + setvar = setvar +" "+p+","+str(v) + setvar = setvar + "\n" + self.mutex.acquire() + try: + self.sid.send(setvar) + retvar = self.sid.recv(256) + + finally: + self.mutex.release() + line = string.split(retvar,"\r") + if string.find(line[0],"*** ERROR") != -1: + raise XCSException, line[0] + return line[0] + else: + raise XCSException, 'Not Implemented Yet!' + + def fetch(self,variable): + try: + a = self.get(variable) + except: + a = ('0','fetch Exception') + return a + + + def doit(self,target,par1=None,val1=None,par2=None,val2=None): + try: + if (par1 == None): + a = self.set(target) + elif (par2 == None): + a = self.set(target,{par1:val1} ) + else: + a = self.set(target,{par1:val1,par2:val2}) + except: + a = " Exception" +# print a + return a diff --git a/punti_da_comandare.cfg.txt b/punti_da_comandare.cfg.txt new file mode 100644 index 0000000..3569150 --- /dev/null +++ b/punti_da_comandare.cfg.txt @@ -0,0 +1,84 @@ +Valore 0 x chiudere e 1 x aprire + +# 1.1M +'FRONTEND_SHOPPER-L_VACO_1_RMTCMD2','VALRMTCMD2' + +# 1.2 - frontend +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 1.0 - backend +'BACKEND_SHOPPER_VACOBECK_20_RMTCMD0' , 'RMTCMD0' + +# 2.2 +'022F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'022F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 3.2 +'032F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'032F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 4.2 +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 5.2 +'052F_WSTOPPER1F_VACO_1_RMTCMD4' , 'VALRMTCMD4' +'XRD_STOPPER1_VACO_11_RMTCMD0' , 'VALRMTCMD0' +'XRD_STOPPER2_VACO_10_RMTCMD3' , 'VALRMTCMD3' +'XRD_STOPPER3_VACO_10_RMTCMD2' , 'VALRMTCMD2' +'052F_WSHUTTER1F_VACO_1_RMTCMD5' , 'VALRMTCMD5' + +# 6.1 +'061F_BSTOPPERAF_VACO_2_RMTCMD2' , 'VALRMTCMD2' +'061F_BSTOPPERCF_VACO_1_RMTCMD2' , 'VALRMTCMD2' +'061A_BSTOPPER1A_VACO_10_RMTCMD2' , 'VALRMTCMD2' +'061F_BSHUTTERAF_VACO_2_RMTCMD0' , 'VALRMTCMD0' +'061F_BSHUTTERCF_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 6.2 +'062F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'062F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 7.1 +'FRONTEND_SHOPPER-R_VACO_1_RMTCMD0' , 'VALRMTCMD0' +'RIGHT_SHUTTER_VACO_30_RMTCMD4' , 'VALRMTCMD4' + +# 7.2 +'072F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'072F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 8.1 +'FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0' +'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' +'RIGHT_EXSLIT_VACO_10_RMTCMD4' , 'VALRMTCMD4' + +# 8.2 +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 9.1 +'CENTRAL_STOPPER_VACO_20_RMTCMD0' , 'VALRMTCMD0' + +# 9.2 +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 10.1 +'FRONTEND_SHOPPER-R_VACO_1_RMTCMD4' , 'VALRMTCMD4' +'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 10.2 +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 11.1 +'FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0' +'RIGHT_STOPPER_VACO_30_RMTCMD6' , 'VALRMTCMD6' +'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' + +# 11.2 +'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' +'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' + + diff --git a/punti_di_lettura.cfg.txt b/punti_di_lettura.cfg.txt new file mode 100644 index 0000000..697fd0e --- /dev/null +++ b/punti_di_lettura.cfg.txt @@ -0,0 +1,92 @@ +# Syntax: +# ecs_name bcs_name +# FAM_MEM_ACT_MOD BL_SECT_COMP_INSTR_N_NAME + +# 1.1M +'FRONTEND_SHOPPER-L_VACO_1_STATUS2' + +# 1.2 - frontend +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + +# 1.0 - backend +'BACKEND_SHOPPER_VACOBECK_20_STATUS0' + +# 2.2 +'022F_USTOPPER1F_VACO_1_STATUS1' +'022F_USHUTTER1F_VACO_1_STATUS0' + +# 3.2 +'032F_USTOPPER1F_VACO_1_STATUS1' +'032F_USHUTTER1F_VACO_1_STATUS0' + +# 4.2 +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + +# 5.2 +'XRD_STOPPER1_VACO_11_STATUS0' +'XRD_STOPPER2_VACO_10_STATUS3' +'XRD_STOPPER3_VACO_10_STATUS2' +'052F_WSHUTTER1F_VACO_1_STATUS5' + +# 6.1 +'061F_BSTOPPERAF_VACO_2_STATUS2' +'061F_BSTOPPERCF_VACO_1_STATUS2' +'061A_BSTOPPER1A_VACO_10_STATUS2' +'061F_BSHUTTERAF_VACO_2_STATUS0' +'061F_BSHUTTERCF_VACO_1_STATUS0' + +# 6.2 +'062F_USTOPPER1F_VACO_1_STATUS1' +'062F_USHUTTER1F_VACO_1_STATUS0' + +# 7.1 +'FRONTEND_SHOPPER-R_VACO_1_STATUS0' +'RIGHT_SHUTTER_VACO_30_STATUS4' + +# 7.2 +'072F_USTOPPER1F_VACO_1_STATUS1' +'072F_USHUTTER1F_VACO_1_STATUS0' + +# 8.1 +'FRONTEND_SHOPPER-R_VACO_2_STATUS0' +'FRONTEND_SHOPPER-L_VACO_1_STATUS0' +'RIGHT_EXSLIT_VACO_10_STATUS4' + +# 8.2 +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + + +# 9.1 +'CENTRAL_STOPPER_VACO_20_STATUS0' + +# 9.2 +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + +# 10.1 +'FRONTEND_SHOPPER-R_VACO_1_STATUS4' +'FRONTEND_SHOPPER-L_VACO_1_STATUS0' + +# 10.2 +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + +# 11.1 +'FRONTEND_SHOPPER-R_VACO_2_STATUS0' +'RIGHT_STOPPER_VACO_30_STATUS6' +'FRONTEND_SHOPPER-L_VACO_1_STATUS0' + +# 11.2 +'FRONTEND_STOPPER_VACO_1_STATUS1' +'FRONTEND_SHUTTER_VACO_1_STATUS0' + + +Gli host sono: +011f-bcs.blcs.elettra.trieste.it +012f-bcs.blcs.elettra.trieste.it +022f-bcs.blcs.elettra.trieste.it +032f-bcs.blcs.elettra.trieste.it +112f-bcs.blcs.elettra.trieste.it diff --git a/tabella-bemline-id.ods b/tabella-bemline-id.ods new file mode 100644 index 0000000000000000000000000000000000000000..a524ea6be33abd98e7cce73480429817a2a68703 GIT binary patch literal 27832 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 literal 0 HcmV?d00001 diff --git a/testsissi.py b/testsissi.py new file mode 100644 index 0000000..0a51adb --- /dev/null +++ b/testsissi.py @@ -0,0 +1,19 @@ +#!/usr/bin/python +import telnetlib +import time +import sys +tn=telnetlib.Telnet('ecsproxy',20091) + +ans_old='' +while True: + tn.write('GET FRONTEND_MACHINE_MACHINE_1_BEAMON') + ans = tn.read_until('\n') + if ans != ans_old: + print time.ctime(), ans.rstrip(), ' <<<< variazione' + ans_old = ans + else: + pass + #print time.ctime(), ans.rstrip() + sys.stdout.flush() + time.sleep(1) + -- GitLab