Package: xia-pfcu
XIA PFCU libraryThis library is used to control basic features of XIA PFCU equipment.
It is composed of a core library, an optional simulator and an optionaltangodevice server.It has been tested with PF4 model, but should work with
other models too.It can be used with either with a direct serial line (read below
on the recommended way to setup a serial line connection) or remotely
through TCP socket (either raw socket or rfc2217). In the latter case
the master device to which the Julabo serial line is connected must
provide a raw socket or rfc2217 interface.InstallationFrom within your favorite python environment type:$ pip install xia-pfcuLibraryThe core of the library consists of PFCU object.
To create a PFCU object you need to pass a connection object.
A compatible connection object can be created using the companionconniolibrary which
should already be installed as a dependency.Here is how to connect to a PFCU through a local serial line:fromconnioimportconnection_for_urlfromxia_pfcuimportPFCUasyncdefmain():conn=connection_for_url("serial://dev/ttyS0")dev=PFCU(conn)raw_status=awaitdev.raw_status()print(raw_status)status=awaitdev.status()ifstatus['shutter_enabled']:shutter_status=(awaitdev.shutter_status()).nameelse:shutter_status="Disabled"print(f"Shutter status:{shutter_status}")# open shutterawaitdev.open_shutter()asyncio.run(main())Serial lineTo access a serial line based PFCU device it is strongly recommended you spawn
a serial to tcp bridge usingser2net,ser2sockorsocatAssuming your device is connected to/dev/ttyS0and the baudrate is set to 9600,
here is how you could use socat to expose your device on the machine port 5000:socat -v TCP-LISTEN:5000,reuseaddr,fork file:/dev/ttyS0,rawer,b9600,cs8,eol=10,icanon=1It might be worth considering starting socat, ser2net or ser2sock as a service usingsupervisororcircus.SimulatorA PFCU simulator is provided.Before using it, make sure everything is installed with:$ pip install xia-pfcu[simulator]Thesinstrumentsengine is used.To start a simulator you need to write a YAML config file where you define
how many devices you want to simulate and which properties they hold.The following example exports 1 hardware device with a minimal configuration
using default values:# config.ymldevices:-class:PFCUpackage:xia_pfcu.simulatortransports:-type:serialurl:/tmp/pfcu-1To start the simulator type:$ sinstruments-server -c ./config.yml --log-level=DEBUG
2020-09-14 10:42:27,592 INFO  simulator: Bootstraping server
2020-09-14 10:42:27,592 INFO  simulator: no backdoor declared
2020-09-14 10:42:27,592 INFO  simulator: Creating device PFCU ('PFCU')
2020-09-14 10:42:27,609 INFO  simulator: Created symbolic link "/tmp/pfcu-1" to simulator pseudo terminal '/dev/pts/3'
2020-09-14 10:42:27,609 INFO  simulator.PFCU[/tmp/pfcu-1]: listening on /tmp/pfcu-1 (baud=None)(To see the full list of options typesinstruments-server --help)You can access it as you would a real hardware. Here is an example using python
serial library on the same machine as the simulator:$python>>>fromconnioimportconnection_for_url>>>fromxia_pfcuimportPFCU>>>conn=connection_for_url("serial:///tmp/pfcu-cf31",concurrency="syncio")>>>dev=PFCU(conn)>>>conn.open()>>>print(dev.status())%PFCU15OKPFCUv1.0(c)XIA1999AllRightsReservedCHANNELIN/OUT(FPanelTTLRS232)Shorted?Open?1OUTOUTOUTOUTNONO2OUTOUTOUTOUTNONO3INOUTOUTINNONO4OUTOUTOUTOUTNONORS232ControlEnabled:YESRS232ControlOnly:NOShutterModeEnabled:NOExposureDecimation:1Tango serverAtangodevice server is also provided.Make sure everything is installed with:$ pip install xia-pfcu[tango]Register a PFCU tango server in the tango database:$ tangoctl server add -s PFCU/test -d PFCU test/pfcu/1
$ tangoctl device property write -d test/pfcu/1 -p address -v "tcp://controls.lab.org:17890"(the above example usestangoctl. You would need
to install it withpip install tangoctlbefore using it. You are free to use any other
tango tool likefandangoor Jive)Launch the server with:$ PFCU test