diff --git a/README.md b/README.md index 6ebc6c3..8d6daeb 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,20 @@ generation systems. [StreamGenerator](https://gitea.psi.ch/lin-epics-modules/StreamGenerator) module. +## Functional Differences Between Models + +The 2nd Generation DAQ offers some additional features that aren't available on the +older EL737 Counterboxes. Specifically, + +* the possibility to change the channel monitored by the count-based preset (on + the older EL737 boxes, only the 1st channel can be used) +* two gating inputs, that enable counting to be halted via configurable + high/low electrical inputs. +* a test signal generator + +Furthermore, the 2nd Generation DAQ's have 10 input channels, in place of the 8 +or 4 channels on the older EL737 Counterboxes. + ## How to Use Unless a custom database is needed, a device can be configure simply by setting @@ -64,7 +78,7 @@ runScript "$(sinqDAQ_DIR)daq_2nd_gen.cmd" "NAME=DAQ, DAQ_IP=TestInst-DAQ1, DAQ_P ## Generating Test Signals -The 2nd generation systems have two test channels that can be used to output +The 2nd Generation DAQ's have two test channels that can be used to output signals at a variable rate. These can be used to ensure the other channels are working and to check the IOC - Nicos integration. These can be loaded at runtime via the following @@ -82,7 +96,82 @@ A set of Nicos devices have been developed which allow control of the Detector Hardware via this Epics Driver. The corresponding code can be found in [sinqdaq.py](https://gitea.psi.ch/lin-instrument-computers/Nicos/src/branch/release-3.12/nicos_sinq/devices/epics/sinqdaq.py). -## Full Example +## Full Example of 8 Channel EL737 Counterbox + +Include the following snippet in your IOC + +``` +# st.cmd at TASP + +epicsEnvSet("STREAM_PROTOCOL_PATH","./db") +epicsEnvSet("INSTR","SQ:SINQTEST:") + +require sinqDAQ +runScript "$(sinqDAQ_DIR)daq_8ch.cmd" "NAME=counter, DAQ_IP=tasp-ts0, DAQ_PORT=3004" +``` + +What follows is an example Nicos setup file. + +``` +# simplified tasp.py + +countprefix = 'SQ:TASP:counter' + +configured_channels = ['detector', 'protoncount'] + +devices = dict( + elapsedtime = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQTime', + daqpvprefix = countprefix, + ), + detector = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQChannel', + description = 'Actual neutron detector', + daqpvprefix = countprefix, + channel = 1, + type = 'counter', + ), + protoncount = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQChannel', + description = 'Monitor for proton current', + daqpvprefix = countprefix, + channel = 2, + type = 'monitor', + ), + DAQPreset = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQPreset', + description = '8 Channel EL737 Counterbox', + daqpvprefix = countprefix, + channels = configured_channels, + time_channel = ['elapsedtime'], + ), + ThresholdChannel = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQMinThresholdChannel', + daqpvprefix = countprefix, + channels = configured_channels, + ), + Threshold = device( + 'nicos_sinq.devices.epics.sinqdaq.DAQMinThreshold', + daqpvprefix = countprefix, + min_rate_channel = 'ThresholdChannel', + ), + taspdet = device( + 'nicos_sinq.devices.epics.sinqdaq.SinqDetector', + description = 'Detector Interface', + timers = ['elapsedtime'], + monitors = ['DAQPreset'] + configured_channels, + others = [], + liveinterval = 1, + ), +) + +startupcode = ''' +SetDetectors(taspdet) +ThresholdChannel.move('protoncount') +''' +``` + +## Full Example of 2nd Generation DAQ Include the following snippet in your IOC @@ -132,32 +221,35 @@ devices = dict( 'nicos_sinq.devices.epics.sinqdaq.DAQMinThresholdChannel', daqpvprefix = countprefix, channels = [], - visibility = {'metadata', 'namespace'}, ), Threshold = device( 'nicos_sinq.devices.epics.sinqdaq.DAQMinThreshold', daqpvprefix = countprefix, min_rate_channel = 'ThresholdChannel', - visibility = {'metadata', 'namespace'}, ), Gate1 = device( 'nicos_sinq.devices.epics.sinqdaq.DAQGate', daqpvprefix = countprefix, channel = 1, - visibility = {'metadata', 'namespace'}, + visibility = {'metadata', 'namespace'}, ), Gate2 = device( 'nicos_sinq.devices.epics.sinqdaq.DAQGate', daqpvprefix = countprefix, channel = 2, - visibility = {'metadata', 'namespace'}, + visibility = {'metadata', 'namespace'}, ), + # Only necessary if you want to use the signal generator in the + # 2nd Generation DAQ for testing. TestGen = device('nicos_sinq.devices.epics.sinqdaq.DAQTestGen', daqpvprefix = countprefix, - visibility = {'metadata', 'namespace'}, + visibility = {'metadata', 'namespace'}, ), ) +# On an actual instrument, it might be better if instead of just calling +# your channels 'Monitor ', you describe what is actually plugged +# into the DAQ on each channel. for i in range(10): devices[f'monitor{i+1}'] = device( 'nicos_sinq.devices.epics.sinqdaq.DAQChannel',