quadEM Release Notes
Release 4-0 (March 12, 2013)
- Major update of the module. The device-dependent classes (AHxxx, APS_EM) have
not changed signficantly. However the base quadEM class has been rewritten. In R3-x
the quadEM base class worked as follows:
R4-0 addresses these problems as follows:
- The ai records for the 11 parameters (Current[1-3],Sum[12,34,1234],Diff[12,34],
and Position[12,34]) were computed using the asynInt32Average device support.
- This meant that there were 11 callbacks each time a new value came from the electrometer,
or more than 70,000 callbacks per second under some circumstances. This was a significant
- This approach produced average values, but it did not produce other useful statistics
like the standard deviation, histogram of values, etc.
- There was no good way to stream all of the readings to a disk file for an arbitrarily
long time. The TimeSeries support was limited to a fixed time length, limited by
- The quadEM base class is now derived from the asynNDArray class in areaDetector,
rather than directly from asynPortDriver.
- The data from the device-dependent drivers are now first placed into a ring buffer
whose size is defined in the constructor.
- There is a new PV called AveragingTime that determines the time period over which
to average the readings. The AveragingTime divided by the SampleTime determines
the number of samples to average, NumAverage_RBV. When this number of samples have
been accumulated in the ring buffer a separate thread copies them to a set of NDArrays
and calls any registered plugins.
- There is a separate NDPluginStats plugin loaded for each of the 11 data values.
This plugin receives an array of dimensions [NumAverage_RBV]. This plugin computes
not only the mean (as in the previous version), but also the standard deviation,
histogram of values, etc.
- One of the NDArrays contains all of the data values, and has dimensions [11,NumAverage_RBV].
This array can be passed to any of the file writing plugins, which can thus stream
all of the data to disk for arbitrarily long time periods.
- An NDStdArrays plugin is also loaded. This can be used to pass all of the data
[11,NumAverage_RBV] or any of the individual data arrays to any channel access client.
- This new approach provides much more information and flexibility. But it also
significantly reduces the number of callbacks. For example if the averaging time
is 1 second the number of callbacks is reduced from thousands per second to 12 per
second, because the data are being passed in arrays.
- The computationally intensive work of calculating the statistics is now being
done in plugins, so can be done in different threads, each potentially running in
a separate core on modern CPUs.
Release 3-3 (December 20, 2012)
- Fixed problem with mutex locking on AH401 (and perhaps AH501). The lock was not
being released for in the read task for long enough to allow EPICS to quickly stop
Release 3-2 (December 6, 2012)
- Fixed bug in reading binary data from AH501 meters. The manual incorrectly documented
the binary data format.
- New version of the AH501D manual that correctly documents the binary data format.
- Minor changes to avoid compiler warnings.
Release 3-1 (September 13, 2012)
- Added support for AH401D and the AH501 series (AH501, AH501C, AH501D) picoammeters
from CaenEls. The AH501 series are significantly faster than the AH401 series. They
work differently than the AH401 or APS_EM units, and do not support the concept
of integration time or ping-pong. They have programmable resolution (16-bit or 24-bits),
programmable number of active input channels (1, 2, or 4), and programmable bias
power supply (AH501C and AH501D only).
- Added new record NumAverage. This applies to all models, and can be used to average
NumAverage readings from the meter before doing the callbacks. On the AH501 series
this also reduces the number of read operations by a factor of NumAverage, by increasing
the number of messages read in a single operation. This reduces CPU time in direct
proportion to NumAverage, which is particularly important with slow computers (e.g.
older VME cards) with the AH501 series.
- Tested using UDP rather than TCP for communication with the AH401B and AH501 meters.
This is more efficient than TCP, reducing CPU time by up to 10%. The example startup
scripts now use UDP. The Lantronix DeviceInstaller must be used to configure the
electrometer to use UDP, since the default is TCP.
- Added new record Model. This provides the model index and name of the device.
This is determined automatically by the driver.
- Modified the medm screens so they only display the parameters that apply to the
specific model being used.
- Modified startup scripts to simplify and support testing all models on any OS
(for AH401 and AH501 series), and vxWorks for APS_EM.
Release 3-0 (September 6, 2012)
- Complete re-write of the module. The new version is based on asynPortDriver. It
consists of a base class, drvQuadEM.cpp, and two derived classes:
The new version is not completely backwards compatible with the previous version,
and will require modification of startup scripts and medm screens.
- drvAH401B.cpp which is new support for the AH401B picoammeter designed and sold
Synchrotron Trieste (elettra). It is also sold by
- drvAPS_EM.cpp, which is improved support for the APS electrometer designed by
- Added support for power-spectra calculations using FFTs on time-series arrays.
These now run in the IOC, rather than requiring a separate Channel Access client,
which previous releases required.
Release 2-6 (November 2, 2011)
- Added support for the remote reboot capability of the electrometer. This makes
initialization much simpler and more robust, since it can be done with software
commands rather than power-cycling and toggling switches. It is only supported on
newer electrometer firmware, but does not cause ill effects when sent to older electrometers.
Added a Reboot record to the database, and modified the Initialize seq record to
process the Reboot record as the first thing it does.
- Added an additional optional parameter to initQuadEM. This is the drvInfo field
for the ipUnidig module. Previously the driver hardcoded pasynUser->reason=0
when using the asynUInt32Digital interface. Now it uses drvUser->create, which
is the correct way to do it.
- Created new documentation file, quadEMDoc.html.
Release 2-5 (Sept 9, 2011)
- Modified RELEASE; deleted RELEASE.arch.
- Added .opi display files, for CSS-BOY
Release 2-4-1 (March 30, 2010)
Release 2-4 (May 19, 2008)
- Removed unused functions in driver.
- Added new adl file quadEM_less.adl.
- Fixed bug in quadEM_settings.req.
Release 2-3 (Sept. 6, 2006)
- Fixed driver so that configuration routines can be called from iocsh.
Release 2-2 (March 29, 2005)
- Changed from using hardcoded stack size in epicsThreadCreate to generic stack
Release 2-1 (March 24, 2005)
- Converted from MPF to ASYN.
- Converted from specialized device support to generic device support from ASYN
- Converted from C++ to C
Release 2-0 (March 3, 2004)
- First release for EPICS 3.14.
- Converted from vxWorks functions to OSI functions
Release 1-1 (November 3, 2003)
- Initial release, for EPICS 3.13.
Suggestions and Comments to:
Mark Rivers : (firstname.lastname@example.org)