EPICS V4 areaDetector integration

Report
EPICS V4/areaDetector Integration
Dave Hickin
Diamond Light Source
areaDetector WG Meeting
Diamond 27/10/2014
Overview
•
•
•
•
EPICS V4 basics
ADPvAccess plugin and driver
Embed ADPvAccess driver
V4 areaDetector
EPICS V4 Basics
• V4 adds structured data to EPICS
• V4 modules
•
•
•
•
pvData – structured data
pvAccess – network protocol
pvaSrv – pvAccess server on V3 IOC
pvDatabase – V4 records/database and pvAccess
• pvaSrv and pvDatabase are C++-only
pvData basics
• Basic types
• scalar, structure, tagged union, variant union
• arrays of these
• Scalar types
•
•
•
•
Booleans
Signed and unsigned integers (8-, 16-, 32-, 64-bit)
Floats and doubles
Strings
pvDataCPP basics
• Extensive use of boost shared pointers
• Array types use reference counted shared
vector
• Copy-on-write semantics
• Arrays of complex types use shared vectors of
shared pointers
• Unions have shared pointer to top-level field
pvDataCPP basics
• Data can be shared or shallow or deep-copied
• Shallow-copy easy and avoids copying large
arrays
• Care needs to be taken with unions and arrays
of complex data types
• Const is not implemented – but could be
added
• Sharing currently problematic
• References can be hung onto
pvAccess basics
• Create/destroy pvAccess channel
• Channel services
•
•
•
•
•
•
Introspection
Get, Put, PutGet
Monitor
Process
RPC
Channel array
NTNDArray
• V4 Structure encoding NDArray
•
•
•
•
•
•
•
Array data uses unions of scalar arrays
Attributes use variant unions (anys)
Dimension and attribute use structure arrays
Timestamps
UniqueId
Data sizes
Codec for compression encoding
• Normative type (replaces NTImage)
Issues to think about
• Monitors do shallow copy
• Structures could be shared (const would help)
or shallow-copied
• References can be held onto
• How to do free-lists
• Monitors have overflow bit but no dropped
frame count
ADPvAccess Plugin/Driver
• V4 sever-side plugin and client-side driver
• Plugin puts NDArray data in V4 structure and
publishes it via pvAccess
• Client monitors and converts V4 structures to
NDArrays
• Allows local and remote transfer of NDArrays
• Compression (through Blosc/LZ4)
Performance on 10 Gig Ethernet
• Uncompressed
• 120-122 frames per second (97-99+% bandwidth)
• Compressed
• With compression image reduced to 36% of original size
using lz4 and 38% by Blosc
• Single threaded compression reduces performance
• Blosc-based compression (multithreaded) increases rate
• Blosc + lz4 best. Up to ~230 frames per second (190% of
bandwidth)
Current and near future work
• Complete move to NTNDArray from NTImage
• Move to GitHub Module - ADPvAccess
• Package and release
• Integration with other EPICS developments
especially CS-Studio
• Windows build
• Deploy on beamline (I12 is candidate)
Embed ADPvAccess driver
• Local plugins (in same process) connect to
NDArray driver as usual
• If NDArray driver not present, first plugin
creates V4 monitor client driver monitors “PV”
and plugin connects to this
• Subsequent plugins connect to this local driver
• Avoids having to explicitly create client driver
• Monitor stops when all plugins disabled
V4 areaDetector drivers
•
•
•
•
Put frame data direct into NTNDArray
V4 client plugins consume NTNDArrays
Can publish frame easily as “PV”
Avoids conversion from NDArray and V4
server plugin
• Straight-forward to re-write drivers
• V4 SimDetector prototyped
• Existing NDArray-plugins can be run though
ADPvAccess client
V4 client plugins
• areaDetector plugins can be rewritten to
process NTNDArrays – straight-forward
• New V4 plugins can consume NTNDArray
• V4 client plugins can work with old drivers
through ADPvAccess server plugin
• Various options for passing frames to plugins
Option 1 - Clients use pva monitors
•
•
•
•
Clients create monitor to NTNDArray
Monitor queues can be used to queue frames
Only required fields need be monitored
Local (same process) monitors perform
shallow copy
• Multiple remote monitors transfer data
multiple times
Option 2 - Plugins use single
monitor
• First plugin registers with “PV”. Creates
monitor. S/W layer/object to manage this.
Plugin registers with monitor
• Plugin gets a call-back. Passed an NTNDArray (const) shared or shallow copy
• Subsequent plugins register, but no new
monitor created
• Each plugin can have own queue and
processing thread
Option 3 - Plugins use single
monitor remotely, multiple locally
• For first plugin creates monitor. S/W
layer/object to manage this. Republishes
local-only PV. Client monitors this
• Additional plugins monitor local PV
• Plugins can use monitor queues
Option 4 - PVManager
• Handles queue/buffering/aggregation and
background data processing
• Java only. No C++ implementation yet
• Abstract types (Vtypes). One for NTNDArray
• Used in CSS
• Single channel/monitor to “PV”
• Could it be used for plugins?
• Limited vtypes

similar documents